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 :
21 : #include "UserAdmin.hxx"
22 : #include "UserAdmin.hrc"
23 : #include "UITools.hxx"
24 : #include "dbu_dlg.hrc"
25 : #include <comphelper/types.hxx>
26 : #include <comphelper/processfactory.hxx>
27 : #include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
28 : #include <com/sun/star/sdbcx/XDataDefinitionSupplier.hpp>
29 : #include <com/sun/star/sdbcx/XUsersSupplier.hpp>
30 : #include <com/sun/star/sdbcx/XDrop.hpp>
31 : #include <ucbhelper/interactionrequest.hxx>
32 : #include <ucbhelper/simpleauthenticationrequest.hxx>
33 : #include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp>
34 : #include <com/sun/star/beans/XPropertySet.hpp>
35 : #include <com/sun/star/sdbcx/XUser.hpp>
36 : #include <com/sun/star/sdbcx/XAppend.hpp>
37 : #include "dbustrings.hrc"
38 : #include <tools/debug.hxx>
39 : #include "dbadmin.hxx"
40 : #include "moduledbu.hxx"
41 : #include <vcl/msgbox.hxx>
42 : #include <sfx2/passwd.hxx>
43 :
44 : using namespace ::com::sun::star::container;
45 : using namespace ::com::sun::star::beans;
46 : using namespace ::com::sun::star::sdbcx;
47 : using namespace ::com::sun::star::sdbc;
48 : using namespace ::com::sun::star::uno;
49 : using namespace ::com::sun::star::task;
50 : using namespace dbaui;
51 : using namespace ucbhelper;
52 : using namespace comphelper;
53 :
54 :
55 0 : class OPasswordDialog : public ModalDialog
56 : {
57 : FixedLine aFLUser;
58 : FixedText aFTOldPassword;
59 : Edit aEDOldPassword;
60 : FixedText aFTPassword;
61 : Edit aEDPassword;
62 : FixedText aFTPasswordRepeat;
63 : Edit aEDPasswordRepeat;
64 : OKButton aOKBtn;
65 : CancelButton aCancelBtn;
66 : HelpButton aHelpBtn;
67 :
68 :
69 : DECL_LINK( OKHdl_Impl, void * );
70 : DECL_LINK( ModifiedHdl, Edit * );
71 :
72 : public:
73 : OPasswordDialog( Window* pParent,const String& _sUserName);
74 :
75 0 : String GetOldPassword() const { return aEDOldPassword.GetText(); }
76 0 : String GetNewPassword() const { return aEDPassword.GetText(); }
77 : };
78 :
79 0 : OPasswordDialog::OPasswordDialog(Window* _pParent,const String& _sUserName) :
80 :
81 : ModalDialog( _pParent, ModuleRes( DLG_PASSWORD) ),
82 :
83 : aFLUser ( this, ModuleRes( FL_USER ) ),
84 : aFTOldPassword ( this, ModuleRes( FT_OLDPASSWORD ) ),
85 : aEDOldPassword ( this, ModuleRes( ED_OLDPASSWORD ) ),
86 : aFTPassword ( this, ModuleRes( FT_PASSWORD ) ),
87 : aEDPassword ( this, ModuleRes( ED_PASSWORD ) ),
88 : aFTPasswordRepeat ( this, ModuleRes( FT_PASSWORD_REPEAT ) ),
89 : aEDPasswordRepeat ( this, ModuleRes( ED_PASSWORD_REPEAT ) ),
90 : aOKBtn ( this, ModuleRes( BTN_PASSWORD_OK ) ),
91 : aCancelBtn ( this, ModuleRes( BTN_PASSWORD_CANCEL ) ),
92 0 : aHelpBtn ( this, ModuleRes( BTN_PASSWORD_HELP ) )
93 : {
94 : // hide until a help is avalable
95 0 : aHelpBtn.Hide();
96 :
97 0 : FreeResource();
98 0 : String sUser = aFLUser.GetText();
99 0 : sUser.SearchAndReplaceAscii("$name$: $",_sUserName);
100 0 : aFLUser.SetText(sUser);
101 0 : aOKBtn.Disable();
102 :
103 0 : aOKBtn.SetClickHdl( LINK( this, OPasswordDialog, OKHdl_Impl ) );
104 0 : aEDOldPassword.SetModifyHdl( LINK( this, OPasswordDialog, ModifiedHdl ) );
105 0 : }
106 : // -----------------------------------------------------------------------------
107 0 : IMPL_LINK_NOARG(OPasswordDialog, OKHdl_Impl)
108 : {
109 0 : if( aEDPassword.GetText() == aEDPasswordRepeat.GetText() )
110 0 : EndDialog( RET_OK );
111 : else
112 : {
113 0 : String aErrorMsg( ModuleRes( STR_ERROR_PASSWORDS_NOT_IDENTICAL));
114 0 : ErrorBox aErrorBox( this, WB_OK, aErrorMsg );
115 0 : aErrorBox.Execute();
116 0 : aEDPassword.SetText( String() );
117 0 : aEDPasswordRepeat.SetText( String() );
118 0 : aEDPassword.GrabFocus();
119 : }
120 0 : return 0;
121 : }
122 : // -----------------------------------------------------------------------------
123 0 : IMPL_LINK( OPasswordDialog, ModifiedHdl, Edit *, pEdit )
124 : {
125 0 : aOKBtn.Enable(pEdit->GetText().Len() != 0);
126 0 : return 0;
127 : }
128 :
129 : DBG_NAME(OUserAdmin);
130 : //================================================================================
131 : // OUserAdmin
132 : //================================================================================
133 0 : OUserAdmin::OUserAdmin(Window* pParent,const SfxItemSet& _rAttrSet)
134 : : OGenericAdministrationPage( pParent, ModuleRes(TAB_PAGE_USERADMIN), _rAttrSet)
135 : ,m_FL_USER( this , ModuleRes(FL_USER))
136 : ,m_FT_USER( this , ModuleRes(FT_USER))
137 : ,m_LB_USER( this , ModuleRes(LB_USER))
138 : ,m_PB_NEWUSER( this , ModuleRes(PB_NEWUSER))
139 : ,m_PB_CHANGEPWD( this , ModuleRes(PB_CHANGEPWD))
140 : ,m_PB_DELETEUSER( this , ModuleRes(PB_DELETEUSER))
141 : ,m_FL_TABLE_GRANTS( this , ModuleRes(FL_TABLE_GRANTS))
142 0 : ,m_TableCtrl( this , ModuleRes(CTRL_TABLE_GRANTS))
143 : {
144 : DBG_CTOR(OUserAdmin,NULL);
145 0 : m_LB_USER.SetSelectHdl(LINK(this, OUserAdmin, ListDblClickHdl));
146 :
147 0 : m_PB_NEWUSER.SetClickHdl(LINK(this, OUserAdmin, UserHdl));
148 0 : m_PB_CHANGEPWD.SetClickHdl(LINK(this, OUserAdmin, UserHdl));
149 0 : m_PB_DELETEUSER.SetClickHdl(LINK(this, OUserAdmin, UserHdl));
150 :
151 0 : FreeResource();
152 0 : }
153 : // -----------------------------------------------------------------------
154 0 : OUserAdmin::~OUserAdmin()
155 : {
156 : DBG_DTOR(OUserAdmin,NULL);
157 0 : m_xConnection = NULL;
158 0 : }
159 : // -----------------------------------------------------------------------
160 0 : void OUserAdmin::FillUserNames()
161 : {
162 0 : if(m_xConnection.is())
163 : {
164 0 : m_LB_USER.Clear();
165 :
166 0 : Reference<XDatabaseMetaData> xMetaData = m_xConnection->getMetaData();
167 :
168 0 : if ( xMetaData.is() )
169 : {
170 0 : m_UserName = xMetaData->getUserName();
171 :
172 : // first we need the users
173 0 : if ( m_xUsers.is() )
174 : {
175 0 : m_LB_USER.Clear();
176 :
177 0 : m_aUserNames = m_xUsers->getElementNames();
178 0 : const ::rtl::OUString* pBegin = m_aUserNames.getConstArray();
179 0 : const ::rtl::OUString* pEnd = pBegin + m_aUserNames.getLength();
180 0 : for(;pBegin != pEnd;++pBegin)
181 0 : m_LB_USER.InsertEntry(*pBegin);
182 :
183 0 : m_LB_USER.SelectEntryPos(0);
184 0 : if(m_xUsers->hasByName(m_UserName))
185 : {
186 0 : Reference<XAuthorizable> xAuth;
187 0 : m_xUsers->getByName(m_UserName) >>= xAuth;
188 0 : m_TableCtrl.setGrantUser(xAuth);
189 : }
190 :
191 0 : m_TableCtrl.setUserName(GetUser());
192 0 : m_TableCtrl.Init();
193 : }
194 0 : }
195 : }
196 :
197 0 : Reference<XAppend> xAppend(m_xUsers,UNO_QUERY);
198 0 : m_PB_NEWUSER.Enable(xAppend.is());
199 0 : Reference<XDrop> xDrop(m_xUsers,UNO_QUERY);
200 0 : m_PB_DELETEUSER.Enable(xDrop.is());
201 :
202 0 : m_PB_CHANGEPWD.Enable(m_xUsers.is());
203 0 : m_TableCtrl.Enable(m_xUsers.is());
204 :
205 0 : }
206 : // -----------------------------------------------------------------------
207 0 : SfxTabPage* OUserAdmin::Create( Window* pParent, const SfxItemSet& _rAttrSet )
208 : {
209 0 : return ( new OUserAdmin( pParent, _rAttrSet ) );
210 : }
211 : // -----------------------------------------------------------------------
212 0 : IMPL_LINK( OUserAdmin, UserHdl, PushButton *, pButton )
213 : {
214 : try
215 : {
216 0 : if(pButton == &m_PB_NEWUSER)
217 : {
218 0 : SfxPasswordDialog aPwdDlg(this);
219 0 : aPwdDlg.ShowExtras(SHOWEXTRAS_ALL);
220 0 : if(aPwdDlg.Execute())
221 : {
222 0 : Reference<XDataDescriptorFactory> xUserFactory(m_xUsers,UNO_QUERY);
223 0 : Reference<XPropertySet> xNewUser = xUserFactory->createDataDescriptor();
224 0 : if(xNewUser.is())
225 : {
226 0 : xNewUser->setPropertyValue(PROPERTY_NAME,makeAny(rtl::OUString(aPwdDlg.GetUser())));
227 0 : xNewUser->setPropertyValue(PROPERTY_PASSWORD,makeAny(rtl::OUString(aPwdDlg.GetPassword())));
228 0 : Reference<XAppend> xAppend(m_xUsers,UNO_QUERY);
229 0 : if(xAppend.is())
230 0 : xAppend->appendByDescriptor(xNewUser);
231 0 : }
232 0 : }
233 : }
234 0 : else if(pButton == &m_PB_CHANGEPWD)
235 : {
236 0 : String sName = GetUser();
237 :
238 0 : if(m_xUsers->hasByName(sName))
239 : {
240 0 : Reference<XUser> xUser;
241 0 : m_xUsers->getByName(sName) >>= xUser;
242 0 : if(xUser.is())
243 : {
244 0 : ::rtl::OUString sNewPassword,sOldPassword;
245 0 : OPasswordDialog aDlg(this,sName);
246 0 : if(aDlg.Execute() == RET_OK)
247 : {
248 0 : sNewPassword = aDlg.GetNewPassword();
249 0 : sOldPassword = aDlg.GetOldPassword();
250 :
251 0 : if(!sNewPassword.isEmpty())
252 0 : xUser->changePassword(sOldPassword,sNewPassword);
253 0 : }
254 0 : }
255 0 : }
256 : }
257 : else
258 : {// delete user
259 0 : if(m_xUsers.is() && m_xUsers->hasByName(GetUser()))
260 : {
261 0 : Reference<XDrop> xDrop(m_xUsers,UNO_QUERY);
262 0 : if(xDrop.is())
263 : {
264 0 : QueryBox aQry(this, ModuleRes(QUERY_USERADMIN_DELETE_USER));
265 0 : if(aQry.Execute() == RET_YES)
266 0 : xDrop->dropByName(GetUser());
267 0 : }
268 : }
269 : }
270 0 : FillUserNames();
271 : }
272 0 : catch(const SQLException& e)
273 : {
274 0 : ::dbaui::showError(::dbtools::SQLExceptionInfo(e),this, comphelper::getComponentContext(m_xORB));
275 0 : return 0;
276 : }
277 0 : catch(Exception& )
278 : {
279 0 : return 0;
280 : }
281 :
282 0 : return 0;
283 : }
284 : // -----------------------------------------------------------------------
285 0 : IMPL_LINK( OUserAdmin, ListDblClickHdl, ListBox *, /*pListBox*/ )
286 : {
287 0 : m_TableCtrl.setUserName(GetUser());
288 0 : m_TableCtrl.UpdateTables();
289 0 : m_TableCtrl.DeactivateCell();
290 0 : m_TableCtrl.ActivateCell(m_TableCtrl.GetCurRow(),m_TableCtrl.GetCurColumnId());
291 0 : return 0;
292 : }
293 :
294 : // -----------------------------------------------------------------------
295 0 : String OUserAdmin::GetUser()
296 : {
297 0 : return m_LB_USER.GetSelectEntry();
298 : }
299 : // -----------------------------------------------------------------------------
300 0 : void OUserAdmin::fillControls(::std::vector< ISaveValueWrapper* >& /*_rControlList*/)
301 : {
302 0 : }
303 : // -----------------------------------------------------------------------
304 0 : void OUserAdmin::fillWindows(::std::vector< ISaveValueWrapper* >& /*_rControlList*/)
305 : {
306 0 : }
307 : // -----------------------------------------------------------------------------
308 0 : void OUserAdmin::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
309 : {
310 0 : m_TableCtrl.setComponentContext(comphelper::getComponentContext(m_xORB));
311 : try
312 : {
313 0 : if ( !m_xConnection.is() && m_pAdminDialog )
314 : {
315 0 : m_xConnection = m_pAdminDialog->createConnection().first;
316 0 : Reference< XTablesSupplier > xTablesSup(m_xConnection,UNO_QUERY);
317 0 : Reference<XUsersSupplier> xUsersSup(xTablesSup,UNO_QUERY);
318 0 : if ( !xUsersSup.is() )
319 : {
320 0 : Reference< XDataDefinitionSupplier > xDriver(m_pAdminDialog->getDriver(),UNO_QUERY);
321 0 : if ( xDriver.is() )
322 : {
323 0 : xUsersSup.set(xDriver->getDataDefinitionByConnection(m_xConnection),UNO_QUERY);
324 0 : xTablesSup.set(xUsersSup,UNO_QUERY);
325 0 : }
326 : }
327 0 : if ( xUsersSup.is() )
328 : {
329 0 : m_TableCtrl.setTablesSupplier(xTablesSup);
330 0 : m_xUsers = xUsersSup->getUsers();
331 0 : }
332 : }
333 0 : FillUserNames();
334 : }
335 0 : catch(const SQLException& e)
336 : {
337 0 : ::dbaui::showError(::dbtools::SQLExceptionInfo(e),this,comphelper::getComponentContext(m_xORB));
338 : }
339 :
340 0 : OGenericAdministrationPage::implInitControls(_rSet, _bSaveValue);
341 0 : }
342 :
343 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|