LCOV - code coverage report
Current view: top level - dbaccess/source/ui/control - TableGrantCtrl.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 227 0.4 %
Date: 2015-06-13 12:38:46 Functions: 2 30 6.7 %
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           0 :     :EditBrowseBox( pParent, EditBrowseBoxFlags::SMART_TAB_TRAVEL | EditBrowseBoxFlags::NO_HANDLE_COLUMN_CONTENT, 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 :     disposeOnce();
      75           0 : }
      76             : 
      77           0 : void OTableGrantControl::dispose()
      78             : {
      79           0 :     if (m_nDeactivateEvent)
      80             :     {
      81           0 :         Application::RemoveUserEvent(m_nDeactivateEvent);
      82           0 :         m_nDeactivateEvent = 0;
      83             :     }
      84             : 
      85           0 :     m_pCheckCell.disposeAndClear();
      86           0 :     m_pEdit.disposeAndClear();
      87             : 
      88           0 :     m_xTables       = NULL;
      89           0 :     ::svt::EditBrowseBox::dispose();
      90           0 : }
      91             : 
      92           0 : void OTableGrantControl::setTablesSupplier(const Reference< XTablesSupplier >& _xTablesSup)
      93             : {
      94             :     // first we need the users
      95           0 :     Reference< XUsersSupplier> xUserSup(_xTablesSup,UNO_QUERY);
      96           0 :     if(xUserSup.is())
      97           0 :         m_xUsers = xUserSup->getUsers();
      98             : 
      99             :     // second we need the tables to determine which privileges the user has
     100           0 :     if(_xTablesSup.is())
     101           0 :         m_xTables = _xTablesSup->getTables();
     102             : 
     103           0 :     if(m_xTables.is())
     104           0 :         m_aTableNames = m_xTables->getElementNames();
     105             : 
     106             :     OSL_ENSURE(m_xUsers.is(),"No user access supported!");
     107           0 :     OSL_ENSURE(m_xTables.is(),"No tables supported!");
     108           0 : }
     109             : 
     110           0 : void OTableGrantControl::setComponentContext(const Reference< ::com::sun::star::uno::XComponentContext>& _rxContext)
     111             : {
     112           0 :   m_xContext = _rxContext;
     113           0 : }
     114             : 
     115           0 : void OTableGrantControl::UpdateTables()
     116             : {
     117           0 :     RemoveRows();
     118             : 
     119           0 :     if(m_xTables.is())
     120           0 :         RowInserted(0, m_aTableNames.getLength());
     121             :     //  m_bEnable = m_xDb->GetUser() != ((OUserAdmin*)GetParent())->GetUser();
     122           0 : }
     123             : 
     124           0 : void OTableGrantControl::Init()
     125             : {
     126           0 :     EditBrowseBox::Init();
     127             : 
     128             :     // ComboBox instanzieren
     129           0 :     if(!m_pCheckCell)
     130             :     {
     131           0 :         m_pCheckCell    = VclPtr<CheckBoxControl>::Create( &GetDataWindow() );
     132           0 :         m_pCheckCell->GetBox().EnableTriState(false);
     133             : 
     134           0 :         m_pEdit         = VclPtr<Edit>::Create( &GetDataWindow() );
     135           0 :         m_pEdit->SetReadOnly();
     136           0 :         m_pEdit->Enable(false);
     137             :     }
     138             : 
     139           0 :     UpdateTables();
     140             :     // Browser Mode setzen
     141             :     BrowserMode nMode = BrowserMode::COLUMNSELECTION | BrowserMode::HLINES | BrowserMode::VLINES |
     142           0 :                         BrowserMode::HIDECURSOR      | BrowserMode::HIDESELECT;
     143             : 
     144           0 :     SetMode(nMode);
     145           0 : }
     146             : 
     147           0 : void OTableGrantControl::Resize()
     148             : {
     149           0 :     EditBrowseBox::Resize();
     150           0 : }
     151             : 
     152           0 : bool OTableGrantControl::PreNotify(NotifyEvent& rNEvt)
     153             : {
     154           0 :     if (rNEvt.GetType() == MouseNotifyEvent::LOSEFOCUS)
     155           0 :         if (!HasChildPathFocus())
     156             :         {
     157           0 :             if (m_nDeactivateEvent)
     158           0 :                 Application::RemoveUserEvent(m_nDeactivateEvent);
     159           0 :             m_nDeactivateEvent = Application::PostUserEvent(LINK(this, OTableGrantControl, AsynchDeactivate), NULL, true);
     160             :         }
     161           0 :     if (rNEvt.GetType() == MouseNotifyEvent::GETFOCUS)
     162             :     {
     163           0 :         if (m_nDeactivateEvent)
     164           0 :             Application::RemoveUserEvent(m_nDeactivateEvent);
     165           0 :         m_nDeactivateEvent = Application::PostUserEvent(LINK(this, OTableGrantControl, AsynchActivate), NULL, true);
     166             :     }
     167           0 :     return EditBrowseBox::PreNotify(rNEvt);
     168             : }
     169             : 
     170           0 : IMPL_LINK_NOARG(OTableGrantControl, AsynchActivate)
     171             : {
     172           0 :     m_nDeactivateEvent = 0;
     173           0 :     ActivateCell();
     174           0 :     return 0L;
     175             : }
     176             : 
     177           0 : IMPL_LINK_NOARG(OTableGrantControl, AsynchDeactivate)
     178             : {
     179           0 :     m_nDeactivateEvent = 0;
     180           0 :     DeactivateCell();
     181           0 :     return 0L;
     182             : }
     183             : 
     184           0 : bool OTableGrantControl::IsTabAllowed(bool bForward) const
     185             : {
     186           0 :     long nRow = GetCurRow();
     187           0 :     sal_uInt16 nCol = GetCurColumnId();
     188             : 
     189           0 :     if (bForward && (nCol == 2) && (nRow == GetRowCount() - 1))
     190           0 :         return false;
     191             : 
     192           0 :     if (!bForward && (nCol == 1) && (nRow == 0))
     193           0 :         return false;
     194             : 
     195           0 :     return EditBrowseBox::IsTabAllowed(bForward);
     196             : }
     197             : 
     198             : #define GRANT_REVOKE_RIGHT(what)                \
     199             :     if(m_pCheckCell->GetBox().IsChecked())      \
     200             :         xAuth->grantPrivileges(sTableName,PrivilegeObject::TABLE,what);\
     201             :     else                                        \
     202             :         xAuth->revokePrivileges(sTableName,PrivilegeObject::TABLE,what)
     203             : 
     204           0 : bool OTableGrantControl::SaveModified()
     205             : {
     206             : 
     207           0 :     sal_Int32 nRow = GetCurRow();
     208           0 :     if(nRow == -1 || nRow >= m_aTableNames.getLength())
     209           0 :         return false;
     210             : 
     211           0 :     OUString sTableName = m_aTableNames[nRow];
     212           0 :     bool bErg = true;
     213             :     try
     214             :     {
     215             : 
     216           0 :         if ( m_xUsers->hasByName(m_sUserName) )
     217             :         {
     218           0 :             Reference<XAuthorizable> xAuth(m_xUsers->getByName(m_sUserName),UNO_QUERY);
     219           0 :             if ( xAuth.is() )
     220             :             {
     221           0 :                 switch( GetCurColumnId() )
     222             :                 {
     223             :                     case COL_INSERT:
     224           0 :                         GRANT_REVOKE_RIGHT(Privilege::INSERT);
     225           0 :                         break;
     226             :                     case COL_DELETE:
     227           0 :                         GRANT_REVOKE_RIGHT(Privilege::DELETE);
     228           0 :                         break;
     229             :                     case COL_UPDATE:
     230           0 :                         GRANT_REVOKE_RIGHT(Privilege::UPDATE);
     231           0 :                         break;
     232             :                     case COL_ALTER:
     233           0 :                         GRANT_REVOKE_RIGHT(Privilege::ALTER);
     234           0 :                         break;
     235             :                     case COL_SELECT:
     236           0 :                         GRANT_REVOKE_RIGHT(Privilege::SELECT);
     237           0 :                         break;
     238             :                     case COL_REF:
     239           0 :                         GRANT_REVOKE_RIGHT(Privilege::REFERENCE);
     240           0 :                         break;
     241             :                     case COL_DROP:
     242           0 :                         GRANT_REVOKE_RIGHT(Privilege::DROP);
     243           0 :                         break;
     244             :                 }
     245           0 :                 fillPrivilege(nRow);
     246           0 :             }
     247             :         }
     248             :     }
     249           0 :     catch(SQLException& e)
     250             :     {
     251           0 :         bErg = false;
     252           0 :         ::dbaui::showError(::dbtools::SQLExceptionInfo(e),GetParent(),m_xContext);
     253             :     }
     254           0 :     if(bErg && Controller().Is())
     255           0 :         Controller()->ClearModified();
     256           0 :     if(!bErg)
     257           0 :         UpdateTables();
     258             : 
     259           0 :     return bErg;
     260             : }
     261             : 
     262           0 : OUString OTableGrantControl::GetCellText( long nRow, sal_uInt16 nColId ) const
     263             : {
     264           0 :     if(COL_TABLE_NAME == nColId)
     265           0 :         return m_aTableNames[nRow];
     266             : 
     267           0 :     sal_Int32 nPriv = 0;
     268           0 :     TTablePrivilegeMap::const_iterator aFind = findPrivilege(nRow);
     269           0 :     if(aFind != m_aPrivMap.end())
     270           0 :         nPriv = aFind->second.nRights;
     271             : 
     272           0 :     return OUString::number(isAllowed(nColId,nPriv) ? 1 :0);
     273             : }
     274             : 
     275           0 : void OTableGrantControl::InitController( CellControllerRef& /*rController*/, long nRow, sal_uInt16 nColumnId )
     276             : {
     277           0 :     OUString sTablename = m_aTableNames[nRow];
     278             :     // special case for tablename
     279           0 :     if(nColumnId == COL_TABLE_NAME)
     280           0 :         m_pEdit->SetText(sTablename);
     281             :     else
     282             :     {
     283             :         // get the privileges from the user
     284           0 :         TTablePrivilegeMap::const_iterator aFind = findPrivilege(nRow);
     285           0 :         m_pCheckCell->GetBox().Check(aFind != m_aPrivMap.end() && isAllowed(nColumnId,aFind->second.nRights));
     286           0 :     }
     287           0 : }
     288             : 
     289           0 : void OTableGrantControl::fillPrivilege(sal_Int32 _nRow) const
     290             : {
     291             : 
     292           0 :     if ( m_xUsers->hasByName(m_sUserName) )
     293             :     {
     294             :         try
     295             :         {
     296           0 :             Reference<XAuthorizable> xAuth(m_xUsers->getByName(m_sUserName),UNO_QUERY);
     297           0 :             if ( xAuth.is() )
     298             :             {
     299             :                 // get the privileges
     300             :                 TPrivileges nRights;
     301           0 :                 nRights.nRights = xAuth->getPrivileges(m_aTableNames[_nRow],PrivilegeObject::TABLE);
     302           0 :                 if(m_xGrantUser.is())
     303           0 :                     nRights.nWithGrant = m_xGrantUser->getGrantablePrivileges(m_aTableNames[_nRow],PrivilegeObject::TABLE);
     304             :                 else
     305           0 :                     nRights.nWithGrant = 0;
     306             : 
     307           0 :                 m_aPrivMap[m_aTableNames[_nRow]] = nRights;
     308           0 :             }
     309             :         }
     310           0 :         catch(SQLException& e)
     311             :         {
     312           0 :             ::dbaui::showError(::dbtools::SQLExceptionInfo(e),GetParent(),m_xContext);
     313             :         }
     314           0 :         catch(Exception& )
     315             :         {
     316             :         }
     317             :     }
     318           0 : }
     319             : 
     320           0 : bool OTableGrantControl::isAllowed(sal_uInt16 _nColumnId,sal_Int32 _nPrivilege)
     321             : {
     322           0 :     bool bAllowed = false;
     323           0 :     switch (_nColumnId)
     324             :     {
     325             :         case COL_INSERT:
     326           0 :             bAllowed = (Privilege::INSERT & _nPrivilege) == Privilege::INSERT;
     327           0 :             break;
     328             :         case COL_DELETE:
     329           0 :             bAllowed = (Privilege::DELETE & _nPrivilege) == Privilege::DELETE;
     330           0 :             break;
     331             :         case COL_UPDATE:
     332           0 :             bAllowed = (Privilege::UPDATE & _nPrivilege) == Privilege::UPDATE;
     333           0 :             break;
     334             :         case COL_ALTER:
     335           0 :             bAllowed = (Privilege::ALTER & _nPrivilege) == Privilege::ALTER;
     336           0 :             break;
     337             :         case COL_SELECT:
     338           0 :             bAllowed = (Privilege::SELECT & _nPrivilege) == Privilege::SELECT;
     339           0 :             break;
     340             :         case COL_REF:
     341           0 :             bAllowed = (Privilege::REFERENCE & _nPrivilege) == Privilege::REFERENCE;
     342           0 :             break;
     343             :         case COL_DROP:
     344           0 :             bAllowed = (Privilege::DROP & _nPrivilege) == Privilege::DROP;
     345           0 :             break;
     346             :     }
     347           0 :     return bAllowed;
     348             : }
     349             : 
     350           0 : void OTableGrantControl::setUserName(const OUString& _sUserName)
     351             : {
     352           0 :     m_sUserName = _sUserName;
     353           0 :     m_aPrivMap = TTablePrivilegeMap();
     354           0 : }
     355             : 
     356           0 : void OTableGrantControl::setGrantUser(const Reference< XAuthorizable>& _xGrantUser)
     357             : {
     358             :     OSL_ENSURE(_xGrantUser.is(),"OTableGrantControl::setGrantUser: GrantUser is null!");
     359           0 :     m_xGrantUser = _xGrantUser;
     360           0 : }
     361             : 
     362           0 : CellController* OTableGrantControl::GetController( long nRow, sal_uInt16 nColumnId )
     363             : {
     364             : 
     365           0 :     CellController* pController = NULL;
     366           0 :     switch( nColumnId )
     367             :     {
     368             :         case COL_TABLE_NAME:
     369           0 :             break;
     370             :         case COL_INSERT:
     371             :         case COL_DELETE:
     372             :         case COL_UPDATE:
     373             :         case COL_ALTER:
     374             :         case COL_SELECT:
     375             :         case COL_REF:
     376             :         case COL_DROP:
     377             :             {
     378           0 :                 TTablePrivilegeMap::const_iterator aFind = findPrivilege(nRow);
     379           0 :                 if(aFind != m_aPrivMap.end() && isAllowed(nColumnId,aFind->second.nWithGrant))
     380           0 :                     pController = new CheckBoxCellController( m_pCheckCell );
     381             :             }
     382           0 :             break;
     383             :         default:
     384             :             ;
     385             :     }
     386           0 :     return pController;
     387             : }
     388             : 
     389           0 : bool OTableGrantControl::SeekRow( long nRow )
     390             : {
     391           0 :     m_nDataPos = nRow;
     392             : 
     393           0 :     return (nRow <= m_aTableNames.getLength());
     394             : }
     395             : 
     396           0 : void OTableGrantControl::PaintCell( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId ) const
     397             : {
     398             : 
     399           0 :     if(nColumnId != COL_TABLE_NAME)
     400             :     {
     401           0 :         TTablePrivilegeMap::const_iterator aFind = findPrivilege(m_nDataPos);
     402           0 :         if(aFind != m_aPrivMap.end())
     403           0 :             PaintTristate(rDev, rRect, isAllowed(nColumnId,aFind->second.nRights) ? TRISTATE_TRUE : TRISTATE_FALSE,isAllowed(nColumnId,aFind->second.nWithGrant));
     404             :         else
     405           0 :             PaintTristate(rDev, rRect, TRISTATE_FALSE, false);
     406             :     }
     407             :     else
     408             :     {
     409           0 :         OUString aText(GetCellText( m_nDataPos, nColumnId ));
     410           0 :         Point aPos( rRect.TopLeft() );
     411           0 :         sal_Int32 nWidth = GetDataWindow().GetTextWidth( aText );
     412           0 :         sal_Int32 nHeight = GetDataWindow().GetTextHeight();
     413             : 
     414           0 :         if( aPos.X() < rRect.Left() || aPos.X() + nWidth > rRect.Right() ||
     415           0 :             aPos.Y() < rRect.Top() || aPos.Y() + nHeight > rRect.Bottom() )
     416             :         {
     417           0 :             rDev.SetClipRegion(vcl::Region(rRect));
     418             :         }
     419             : 
     420           0 :         rDev.DrawText( aPos, aText );
     421             :     }
     422             : 
     423           0 :     if( rDev.IsClipRegion() )
     424           0 :         rDev.SetClipRegion();
     425           0 : }
     426             : 
     427           0 : void OTableGrantControl::CellModified()
     428             : {
     429           0 :     EditBrowseBox::CellModified();
     430           0 :     SaveModified();
     431           0 : }
     432             : 
     433           0 : OTableGrantControl::TTablePrivilegeMap::const_iterator OTableGrantControl::findPrivilege(sal_Int32 _nRow) const
     434             : {
     435           0 :     TTablePrivilegeMap::const_iterator aFind = m_aPrivMap.find(m_aTableNames[_nRow]);
     436           0 :     if(aFind == m_aPrivMap.end())
     437             :     {
     438           0 :         fillPrivilege(_nRow);
     439           0 :         aFind = m_aPrivMap.find(m_aTableNames[_nRow]);
     440             :     }
     441           0 :     return aFind;
     442             : }
     443             : 
     444           0 : Reference< XAccessible > OTableGrantControl::CreateAccessibleCell( sal_Int32 _nRow, sal_uInt16 _nColumnPos )
     445             : {
     446           0 :     sal_uInt16 nColumnId = GetColumnId( _nColumnPos );
     447           0 :     if(nColumnId != COL_TABLE_NAME)
     448             :     {
     449           0 :         TriState eState = TRISTATE_FALSE;
     450           0 :         TTablePrivilegeMap::const_iterator aFind = findPrivilege(_nRow);
     451           0 :         if(aFind != m_aPrivMap.end())
     452             :         {
     453           0 :             eState = isAllowed(nColumnId,aFind->second.nRights) ? TRISTATE_TRUE : TRISTATE_FALSE;
     454             :         }
     455             :         else
     456           0 :             eState = TRISTATE_FALSE;
     457             : 
     458           0 :         return EditBrowseBox::CreateAccessibleCheckBoxCell( _nRow, _nColumnPos,eState );
     459             :     }
     460           0 :     return EditBrowseBox::CreateAccessibleCell( _nRow, _nColumnPos );
     461          36 : }
     462             : 
     463             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11