LCOV - code coverage report
Current view: top level - dbaccess/source/ui/control - TableGrantCtrl.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 1 222 0.5 %
Date: 2014-11-03 Functions: 2 29 6.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "TableGrantCtrl.hxx"
      21             : #include <tools/debug.hxx>
      22             : #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
      23             : #include <com/sun/star/sdbcx/Privilege.hpp>
      24             : #include <com/sun/star/sdbcx/PrivilegeObject.hpp>
      25             : #include <com/sun/star/sdbcx/XUsersSupplier.hpp>
      26             : #include <com/sun/star/sdbcx/XAuthorizable.hpp>
      27             : #include "dbu_control.hrc"
      28             : #include "UITools.hxx"
      29             : 
      30             : using namespace ::com::sun::star::accessibility;
      31             : using namespace ::com::sun::star::container;
      32             : using namespace ::com::sun::star::sdbcx;
      33             : using namespace ::com::sun::star::sdbc;
      34             : using namespace ::com::sun::star::uno;
      35             : using namespace ::dbaui;
      36             : using namespace ::svt;
      37             : 
      38             : const sal_uInt16 COL_TABLE_NAME = 1;
      39             : const sal_uInt16 COL_SELECT     = 2;
      40             : const sal_uInt16 COL_INSERT     = 3;
      41             : const sal_uInt16 COL_DELETE     = 4;
      42             : const sal_uInt16 COL_UPDATE     = 5;
      43             : const sal_uInt16 COL_ALTER      = 6;
      44             : const sal_uInt16 COL_REF        = 7;
      45             : const sal_uInt16 COL_DROP       = 8;
      46             : 
      47             : 
      48             : // OTableGrantControl
      49           0 : OTableGrantControl::OTableGrantControl( vcl::Window* pParent, WinBits nBits)
      50             :     :EditBrowseBox( pParent, EBBF_SMART_TAB_TRAVEL | EBBF_NOROWPICTURE, nBits )
      51             :     ,m_pCheckCell( NULL )
      52             :     ,m_pEdit( NULL )
      53             :     ,m_nDataPos( 0 )
      54           0 :     ,m_nDeactivateEvent(0)
      55             : {
      56             :     // Spalten einfuegen
      57           0 :     sal_uInt16 i=1;
      58           0 :     InsertDataColumn( i, OUString(ModuleRes(STR_TABLE_PRIV_NAME)  ), 75);
      59           0 :     FreezeColumn(i++);
      60           0 :     InsertDataColumn( i++, OUString(ModuleRes(STR_TABLE_PRIV_SELECT)), 75);
      61           0 :     InsertDataColumn( i++, OUString(ModuleRes(STR_TABLE_PRIV_INSERT)), 75);
      62           0 :     InsertDataColumn( i++, OUString(ModuleRes(STR_TABLE_PRIV_DELETE)), 75);
      63           0 :     InsertDataColumn( i++, OUString(ModuleRes(STR_TABLE_PRIV_UPDATE)), 75);
      64           0 :     InsertDataColumn( i++, OUString(ModuleRes(STR_TABLE_PRIV_ALTER)), 75);
      65           0 :     InsertDataColumn( i++, OUString(ModuleRes(STR_TABLE_PRIV_REFERENCE)), 75);
      66           0 :     InsertDataColumn( i++, OUString(ModuleRes(STR_TABLE_PRIV_DROP)), 75);
      67             : 
      68           0 :     while(--i)
      69           0 :         SetColumnWidth(i,GetAutoColumnWidth(i));
      70           0 : }
      71             : 
      72           0 : OTableGrantControl::~OTableGrantControl()
      73             : {
      74           0 :     if (m_nDeactivateEvent)
      75             :     {
      76           0 :         Application::RemoveUserEvent(m_nDeactivateEvent);
      77           0 :         m_nDeactivateEvent = 0;
      78             :     }
      79             : 
      80           0 :     delete m_pCheckCell;
      81           0 :     delete m_pEdit;
      82             : 
      83           0 :     m_xTables       = NULL;
      84           0 : }
      85             : 
      86           0 : void OTableGrantControl::setTablesSupplier(const Reference< XTablesSupplier >& _xTablesSup)
      87             : {
      88             :     // first we need the users
      89           0 :     Reference< XUsersSupplier> xUserSup(_xTablesSup,UNO_QUERY);
      90           0 :     if(xUserSup.is())
      91           0 :         m_xUsers = xUserSup->getUsers();
      92             : 
      93             :     // second we need the tables to determine which privileges the user has
      94           0 :     if(_xTablesSup.is())
      95           0 :         m_xTables = _xTablesSup->getTables();
      96             : 
      97           0 :     if(m_xTables.is())
      98           0 :         m_aTableNames = m_xTables->getElementNames();
      99             : 
     100             :     OSL_ENSURE(m_xUsers.is(),"No user access supported!");
     101           0 :     OSL_ENSURE(m_xTables.is(),"No tables supported!");
     102           0 : }
     103             : 
     104           0 : void OTableGrantControl::setComponentContext(const Reference< ::com::sun::star::uno::XComponentContext>& _rxContext)
     105             : {
     106           0 :   m_xContext = _rxContext;
     107           0 : }
     108             : 
     109           0 : void OTableGrantControl::UpdateTables()
     110             : {
     111           0 :     RemoveRows();
     112             : 
     113           0 :     if(m_xTables.is())
     114           0 :         RowInserted(0, m_aTableNames.getLength());
     115             :     //  m_bEnable = m_xDb->GetUser() != ((OUserAdmin*)GetParent())->GetUser();
     116           0 : }
     117             : 
     118           0 : void OTableGrantControl::Init()
     119             : {
     120           0 :     EditBrowseBox::Init();
     121             : 
     122             :     // ComboBox instanzieren
     123           0 :     if(!m_pCheckCell)
     124             :     {
     125           0 :         m_pCheckCell    = new CheckBoxControl( &GetDataWindow() );
     126           0 :         m_pCheckCell->GetBox().EnableTriState(false);
     127             : 
     128           0 :         m_pEdit         = new Edit( &GetDataWindow() );
     129           0 :         m_pEdit->SetReadOnly();
     130           0 :         m_pEdit->Enable(false);
     131             :     }
     132             : 
     133           0 :     UpdateTables();
     134             :     // Browser Mode setzen
     135             :     BrowserMode nMode = BROWSER_COLUMNSELECTION | BROWSER_HLINESFULL | BROWSER_VLINESFULL |
     136           0 :                         BROWSER_HIDECURSOR      | BROWSER_HIDESELECT;
     137             : 
     138           0 :     SetMode(nMode);
     139           0 : }
     140             : 
     141           0 : void OTableGrantControl::Resize()
     142             : {
     143           0 :     EditBrowseBox::Resize();
     144           0 : }
     145             : 
     146           0 : bool OTableGrantControl::PreNotify(NotifyEvent& rNEvt)
     147             : {
     148           0 :     if (rNEvt.GetType() == EVENT_LOSEFOCUS)
     149           0 :         if (!HasChildPathFocus())
     150             :         {
     151           0 :             if (m_nDeactivateEvent)
     152           0 :                 Application::RemoveUserEvent(m_nDeactivateEvent);
     153           0 :             m_nDeactivateEvent = Application::PostUserEvent(LINK(this, OTableGrantControl, AsynchDeactivate));
     154             :         }
     155           0 :     if (rNEvt.GetType() == EVENT_GETFOCUS)
     156             :     {
     157           0 :         if (m_nDeactivateEvent)
     158           0 :             Application::RemoveUserEvent(m_nDeactivateEvent);
     159           0 :         m_nDeactivateEvent = Application::PostUserEvent(LINK(this, OTableGrantControl, AsynchActivate));
     160             :     }
     161           0 :     return EditBrowseBox::PreNotify(rNEvt);
     162             : }
     163             : 
     164           0 : IMPL_LINK_NOARG(OTableGrantControl, AsynchActivate)
     165             : {
     166           0 :     m_nDeactivateEvent = 0;
     167           0 :     ActivateCell();
     168           0 :     return 0L;
     169             : }
     170             : 
     171           0 : IMPL_LINK_NOARG(OTableGrantControl, AsynchDeactivate)
     172             : {
     173           0 :     m_nDeactivateEvent = 0;
     174           0 :     DeactivateCell();
     175           0 :     return 0L;
     176             : }
     177             : 
     178           0 : bool OTableGrantControl::IsTabAllowed(bool bForward) const
     179             : {
     180           0 :     long nRow = GetCurRow();
     181           0 :     sal_uInt16 nCol = GetCurColumnId();
     182             : 
     183           0 :     if (bForward && (nCol == 2) && (nRow == GetRowCount() - 1))
     184           0 :         return false;
     185             : 
     186           0 :     if (!bForward && (nCol == 1) && (nRow == 0))
     187           0 :         return false;
     188             : 
     189           0 :     return EditBrowseBox::IsTabAllowed(bForward);
     190             : }
     191             : 
     192             : #define GRANT_REVOKE_RIGHT(what)                \
     193             :     if(m_pCheckCell->GetBox().IsChecked())      \
     194             :         xAuth->grantPrivileges(sTableName,PrivilegeObject::TABLE,what);\
     195             :     else                                        \
     196             :         xAuth->revokePrivileges(sTableName,PrivilegeObject::TABLE,what)
     197             : 
     198           0 : bool OTableGrantControl::SaveModified()
     199             : {
     200             : 
     201           0 :     sal_Int32 nRow = GetCurRow();
     202           0 :     if(nRow == -1 || nRow >= m_aTableNames.getLength())
     203           0 :         return false;
     204             : 
     205           0 :     OUString sTableName = m_aTableNames[nRow];
     206           0 :     bool bErg = true;
     207             :     try
     208             :     {
     209             : 
     210           0 :         if ( m_xUsers->hasByName(m_sUserName) )
     211             :         {
     212           0 :             Reference<XAuthorizable> xAuth(m_xUsers->getByName(m_sUserName),UNO_QUERY);
     213           0 :             if ( xAuth.is() )
     214             :             {
     215           0 :                 switch( GetCurColumnId() )
     216             :                 {
     217             :                     case COL_INSERT:
     218           0 :                         GRANT_REVOKE_RIGHT(Privilege::INSERT);
     219           0 :                         break;
     220             :                     case COL_DELETE:
     221           0 :                         GRANT_REVOKE_RIGHT(Privilege::DELETE);
     222           0 :                         break;
     223             :                     case COL_UPDATE:
     224           0 :                         GRANT_REVOKE_RIGHT(Privilege::UPDATE);
     225           0 :                         break;
     226             :                     case COL_ALTER:
     227           0 :                         GRANT_REVOKE_RIGHT(Privilege::ALTER);
     228           0 :                         break;
     229             :                     case COL_SELECT:
     230           0 :                         GRANT_REVOKE_RIGHT(Privilege::SELECT);
     231           0 :                         break;
     232             :                     case COL_REF:
     233           0 :                         GRANT_REVOKE_RIGHT(Privilege::REFERENCE);
     234           0 :                         break;
     235             :                     case COL_DROP:
     236           0 :                         GRANT_REVOKE_RIGHT(Privilege::DROP);
     237           0 :                         break;
     238             :                 }
     239           0 :                 fillPrivilege(nRow);
     240           0 :             }
     241             :         }
     242             :     }
     243           0 :     catch(SQLException& e)
     244             :     {
     245           0 :         bErg = false;
     246           0 :         ::dbaui::showError(::dbtools::SQLExceptionInfo(e),GetParent(),m_xContext);
     247             :     }
     248           0 :     if(bErg && Controller().Is())
     249           0 :         Controller()->ClearModified();
     250           0 :     if(!bErg)
     251           0 :         UpdateTables();
     252             : 
     253           0 :     return bErg;
     254             : }
     255             : 
     256           0 : OUString OTableGrantControl::GetCellText( long nRow, sal_uInt16 nColId ) const
     257             : {
     258           0 :     if(COL_TABLE_NAME == nColId)
     259           0 :         return m_aTableNames[nRow];
     260             : 
     261           0 :     sal_Int32 nPriv = 0;
     262           0 :     TTablePrivilegeMap::const_iterator aFind = findPrivilege(nRow);
     263           0 :     if(aFind != m_aPrivMap.end())
     264           0 :         nPriv = aFind->second.nRights;
     265             : 
     266           0 :     return OUString::number(isAllowed(nColId,nPriv) ? 1 :0);
     267             : }
     268             : 
     269           0 : void OTableGrantControl::InitController( CellControllerRef& /*rController*/, long nRow, sal_uInt16 nColumnId )
     270             : {
     271           0 :     OUString sTablename = m_aTableNames[nRow];
     272             :     // special case for tablename
     273           0 :     if(nColumnId == COL_TABLE_NAME)
     274           0 :         m_pEdit->SetText(sTablename);
     275             :     else
     276             :     {
     277             :         // get the privileges from the user
     278           0 :         TTablePrivilegeMap::const_iterator aFind = findPrivilege(nRow);
     279           0 :         m_pCheckCell->GetBox().Check(aFind != m_aPrivMap.end() ? isAllowed(nColumnId,aFind->second.nRights) : sal_False);
     280           0 :     }
     281           0 : }
     282             : 
     283           0 : void OTableGrantControl::fillPrivilege(sal_Int32 _nRow) const
     284             : {
     285             : 
     286           0 :     if ( m_xUsers->hasByName(m_sUserName) )
     287             :     {
     288             :         try
     289             :         {
     290           0 :             Reference<XAuthorizable> xAuth(m_xUsers->getByName(m_sUserName),UNO_QUERY);
     291           0 :             if ( xAuth.is() )
     292             :             {
     293             :                 // get the privileges
     294             :                 TPrivileges nRights;
     295           0 :                 nRights.nRights = xAuth->getPrivileges(m_aTableNames[_nRow],PrivilegeObject::TABLE);
     296           0 :                 if(m_xGrantUser.is())
     297           0 :                     nRights.nWithGrant = m_xGrantUser->getGrantablePrivileges(m_aTableNames[_nRow],PrivilegeObject::TABLE);
     298             :                 else
     299           0 :                     nRights.nWithGrant = 0;
     300             : 
     301           0 :                 m_aPrivMap[m_aTableNames[_nRow]] = nRights;
     302           0 :             }
     303             :         }
     304           0 :         catch(SQLException& e)
     305             :         {
     306           0 :             ::dbaui::showError(::dbtools::SQLExceptionInfo(e),GetParent(),m_xContext);
     307             :         }
     308           0 :         catch(Exception& )
     309             :         {
     310             :         }
     311             :     }
     312           0 : }
     313             : 
     314           0 : bool OTableGrantControl::isAllowed(sal_uInt16 _nColumnId,sal_Int32 _nPrivilege) const
     315             : {
     316           0 :     bool bAllowed = false;
     317           0 :     switch (_nColumnId)
     318             :     {
     319             :         case COL_INSERT:
     320           0 :             bAllowed = (Privilege::INSERT & _nPrivilege) == Privilege::INSERT;
     321           0 :             break;
     322             :         case COL_DELETE:
     323           0 :             bAllowed = (Privilege::DELETE & _nPrivilege) == Privilege::DELETE;
     324           0 :             break;
     325             :         case COL_UPDATE:
     326           0 :             bAllowed = (Privilege::UPDATE & _nPrivilege) == Privilege::UPDATE;
     327           0 :             break;
     328             :         case COL_ALTER:
     329           0 :             bAllowed = (Privilege::ALTER & _nPrivilege) == Privilege::ALTER;
     330           0 :             break;
     331             :         case COL_SELECT:
     332           0 :             bAllowed = (Privilege::SELECT & _nPrivilege) == Privilege::SELECT;
     333           0 :             break;
     334             :         case COL_REF:
     335           0 :             bAllowed = (Privilege::REFERENCE & _nPrivilege) == Privilege::REFERENCE;
     336           0 :             break;
     337             :         case COL_DROP:
     338           0 :             bAllowed = (Privilege::DROP & _nPrivilege) == Privilege::DROP;
     339           0 :             break;
     340             :     }
     341           0 :     return bAllowed;
     342             : }
     343             : 
     344           0 : void OTableGrantControl::setUserName(const OUString& _sUserName)
     345             : {
     346           0 :     m_sUserName = _sUserName;
     347           0 :     m_aPrivMap = TTablePrivilegeMap();
     348           0 : }
     349             : 
     350           0 : void OTableGrantControl::setGrantUser(const Reference< XAuthorizable>& _xGrantUser)
     351             : {
     352             :     OSL_ENSURE(_xGrantUser.is(),"OTableGrantControl::setGrantUser: GrantUser is null!");
     353           0 :     m_xGrantUser = _xGrantUser;
     354           0 : }
     355             : 
     356           0 : CellController* OTableGrantControl::GetController( long nRow, sal_uInt16 nColumnId )
     357             : {
     358             : 
     359           0 :     CellController* pController = NULL;
     360           0 :     switch( nColumnId )
     361             :     {
     362             :         case COL_TABLE_NAME:
     363           0 :             break;
     364             :         case COL_INSERT:
     365             :         case COL_DELETE:
     366             :         case COL_UPDATE:
     367             :         case COL_ALTER:
     368             :         case COL_SELECT:
     369             :         case COL_REF:
     370             :         case COL_DROP:
     371             :             {
     372           0 :                 TTablePrivilegeMap::const_iterator aFind = findPrivilege(nRow);
     373           0 :                 if(aFind != m_aPrivMap.end() && isAllowed(nColumnId,aFind->second.nWithGrant))
     374           0 :                     pController = new CheckBoxCellController( m_pCheckCell );
     375             :             }
     376           0 :             break;
     377             :         default:
     378             :             ;
     379             :     }
     380           0 :     return pController;
     381             : }
     382             : 
     383           0 : bool OTableGrantControl::SeekRow( long nRow )
     384             : {
     385           0 :     m_nDataPos = nRow;
     386             : 
     387           0 :     return (nRow <= m_aTableNames.getLength());
     388             : }
     389             : 
     390           0 : void OTableGrantControl::PaintCell( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId ) const
     391             : {
     392             : 
     393           0 :     if(nColumnId != COL_TABLE_NAME)
     394             :     {
     395           0 :         TTablePrivilegeMap::const_iterator aFind = findPrivilege(m_nDataPos);
     396           0 :         if(aFind != m_aPrivMap.end())
     397           0 :             PaintTristate(rDev, rRect, isAllowed(nColumnId,aFind->second.nRights) ? TRISTATE_TRUE : TRISTATE_FALSE,isAllowed(nColumnId,aFind->second.nWithGrant));
     398             :         else
     399           0 :             PaintTristate(rDev, rRect, TRISTATE_FALSE, false);
     400             :     }
     401             :     else
     402             :     {
     403           0 :         OUString aText(((OTableGrantControl*)this)->GetCellText( m_nDataPos, nColumnId ));
     404           0 :         Point aPos( rRect.TopLeft() );
     405           0 :         sal_Int32 nWidth = GetDataWindow().GetTextWidth( aText );
     406           0 :         sal_Int32 nHeight = GetDataWindow().GetTextHeight();
     407             : 
     408           0 :         if( aPos.X() < rRect.Right() || aPos.X() + nWidth > rRect.Right() ||
     409           0 :             aPos.Y() < rRect.Top() || aPos.Y() + nHeight > rRect.Bottom() )
     410             :         {
     411           0 :             rDev.SetClipRegion(vcl::Region(rRect));
     412             :         }
     413             : 
     414           0 :         rDev.DrawText( aPos, aText );
     415             :     }
     416             : 
     417           0 :     if( rDev.IsClipRegion() )
     418           0 :         rDev.SetClipRegion();
     419           0 : }
     420             : 
     421           0 : void OTableGrantControl::CellModified()
     422             : {
     423           0 :     EditBrowseBox::CellModified();
     424           0 :     SaveModified();
     425           0 : }
     426             : 
     427           0 : OTableGrantControl::TTablePrivilegeMap::const_iterator OTableGrantControl::findPrivilege(sal_Int32 _nRow) const
     428             : {
     429           0 :     TTablePrivilegeMap::const_iterator aFind = m_aPrivMap.find(m_aTableNames[_nRow]);
     430           0 :     if(aFind == m_aPrivMap.end())
     431             :     {
     432           0 :         fillPrivilege(_nRow);
     433           0 :         aFind = m_aPrivMap.find(m_aTableNames[_nRow]);
     434             :     }
     435           0 :     return aFind;
     436             : }
     437             : 
     438           0 : Reference< XAccessible > OTableGrantControl::CreateAccessibleCell( sal_Int32 _nRow, sal_uInt16 _nColumnPos )
     439             : {
     440           0 :     sal_uInt16 nColumnId = GetColumnId( _nColumnPos );
     441           0 :     if(nColumnId != COL_TABLE_NAME)
     442             :     {
     443           0 :         TriState eState = TRISTATE_FALSE;
     444           0 :         TTablePrivilegeMap::const_iterator aFind = findPrivilege(_nRow);
     445           0 :         if(aFind != m_aPrivMap.end())
     446             :         {
     447           0 :             eState = isAllowed(nColumnId,aFind->second.nRights) ? TRISTATE_TRUE : TRISTATE_FALSE;
     448             :         }
     449             :         else
     450           0 :             eState = TRISTATE_FALSE;
     451             : 
     452           0 :         return EditBrowseBox::CreateAccessibleCheckBoxCell( _nRow, _nColumnPos,eState );
     453             :     }
     454           0 :     return EditBrowseBox::CreateAccessibleCell( _nRow, _nColumnPos );
     455          72 : }
     456             : 
     457             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10