1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_cui.hxx" 26 27 // include --------------------------------------------------------------- 28 #include <dialmgr.hxx> 29 #include <cuires.hrc> 30 #include <com/sun/star/task/UrlRecord.hpp> 31 #include <com/sun/star/task/XPasswordContainer.hpp> 32 #include <com/sun/star/task/XMasterPasswordHandling.hpp> 33 #include "com/sun/star/task/XUrlContainer.hpp" 34 #include <comphelper/processfactory.hxx> 35 #include <comphelper/docpasswordrequest.hxx> 36 #include "webconninfo.hxx" 37 #include "webconninfo.hrc" 38 39 using namespace ::com::sun::star; 40 41 //........................................................................ 42 namespace svx 43 { 44 //........................................................................ 45 46 // class PasswordTable --------------------------------------------------- 47 48 PasswordTable::PasswordTable( Window* pParent, const ResId& rResId ) : 49 SvxSimpleTable( pParent, rResId ) 50 { 51 SetStyle( GetStyle() | WB_NOINITIALSELECTION ); 52 } 53 54 void PasswordTable::InsertHeaderItem( sal_uInt16 nColumn, const String& rText, HeaderBarItemBits nBits ) 55 { 56 GetTheHeaderBar()->InsertItem( nColumn, rText, 0, nBits ); 57 } 58 59 void PasswordTable::ResetTabs() 60 { 61 SetTabs(); 62 } 63 64 void PasswordTable::Resort( bool bForced ) 65 { 66 sal_uInt16 nColumn = GetSelectedCol(); 67 if ( 0 == nColumn || bForced ) // only the first column is sorted 68 { 69 HeaderBarItemBits nBits = GetTheHeaderBar()->GetItemBits(1); 70 sal_Bool bUp = ( ( nBits & HIB_UPARROW ) == HIB_UPARROW ); 71 SvSortMode eMode = SortAscending; 72 73 if ( bUp ) 74 { 75 nBits &= ~HIB_UPARROW; 76 nBits |= HIB_DOWNARROW; 77 eMode = SortDescending; 78 } 79 else 80 { 81 nBits &= ~HIB_DOWNARROW; 82 nBits |= HIB_UPARROW; 83 } 84 GetTheHeaderBar()->SetItemBits( 1, nBits ); 85 SvTreeList* pListModel = GetModel(); 86 pListModel->SetSortMode( eMode ); 87 pListModel->Resort(); 88 } 89 } 90 91 // class WebConnectionInfoDialog ----------------------------------------- 92 93 // ----------------------------------------------------------------------- 94 WebConnectionInfoDialog::WebConnectionInfoDialog( Window* pParent ) : 95 ModalDialog( pParent, CUI_RES( RID_SVXDLG_WEBCONNECTION_INFO ) ) 96 ,m_aNeverShownFI ( this, CUI_RES( FI_NEVERSHOWN ) ) 97 ,m_aPasswordsLB ( this, CUI_RES( LB_PASSWORDS ) ) 98 ,m_aRemoveBtn ( this, CUI_RES( PB_REMOVE ) ) 99 ,m_aRemoveAllBtn ( this, CUI_RES( PB_REMOVEALL ) ) 100 ,m_aChangeBtn ( this, CUI_RES( PB_CHANGE ) ) 101 ,m_aButtonsFL ( this, CUI_RES( FL_BUTTONS ) ) 102 ,m_aCloseBtn ( this, CUI_RES( PB_CLOSE ) ) 103 ,m_aHelpBtn ( this, CUI_RES( PB_HELP ) ) 104 ,m_nPos ( -1 ) 105 { 106 static long aStaticTabs[]= { 3, 0, 150, 250 }; 107 m_aPasswordsLB.SetTabs( aStaticTabs ); 108 m_aPasswordsLB.InsertHeaderItem( 1, CUI_RESSTR( STR_WEBSITE ), 109 HIB_LEFT | HIB_VCENTER | HIB_FIXEDPOS | HIB_CLICKABLE | HIB_UPARROW ); 110 m_aPasswordsLB.InsertHeaderItem( 2, CUI_RESSTR( STR_USERNAME ), 111 HIB_LEFT | HIB_VCENTER | HIB_FIXEDPOS ); 112 m_aPasswordsLB.ResetTabs(); 113 114 FreeResource(); 115 116 m_aPasswordsLB.SetHeaderBarClickHdl( LINK( this, WebConnectionInfoDialog, HeaderBarClickedHdl ) ); 117 m_aRemoveBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemovePasswordHdl ) ); 118 m_aRemoveAllBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemoveAllPasswordsHdl ) ); 119 m_aChangeBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, ChangePasswordHdl ) ); 120 121 // one button too small for its text? 122 sal_Int32 i = 0; 123 long nBtnTextWidth = 0; 124 Window* pButtons[] = { &m_aRemoveBtn, &m_aRemoveAllBtn, &m_aChangeBtn }; 125 Window** pButton = pButtons; 126 const sal_Int32 nBCount = sizeof( pButtons ) / sizeof( pButtons[ 0 ] ); 127 for ( ; i < nBCount; ++i, ++pButton ) 128 { 129 long nTemp = (*pButton)->GetCtrlTextWidth( (*pButton)->GetText() ); 130 if ( nTemp > nBtnTextWidth ) 131 nBtnTextWidth = nTemp; 132 } 133 nBtnTextWidth = nBtnTextWidth * 115 / 100; // a little offset 134 long nButtonWidth = m_aRemoveBtn.GetSizePixel().Width(); 135 if ( nBtnTextWidth > nButtonWidth ) 136 { 137 // so make the buttons broader and its control in front of it smaller 138 long nDelta = nBtnTextWidth - nButtonWidth; 139 pButton = pButtons; 140 for ( i = 0; i < nBCount; ++i, ++pButton ) 141 { 142 Point aNewPos = (*pButton)->GetPosPixel(); 143 if ( &m_aRemoveAllBtn == (*pButton) ) 144 aNewPos.X() += nDelta; 145 else if ( &m_aChangeBtn == (*pButton) ) 146 aNewPos.X() -= nDelta; 147 Size aNewSize = (*pButton)->GetSizePixel(); 148 aNewSize.Width() += nDelta; 149 (*pButton)->SetPosSizePixel( aNewPos, aNewSize ); 150 } 151 } 152 153 FillPasswordList(); 154 155 m_aRemoveBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemovePasswordHdl ) ); 156 m_aRemoveAllBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemoveAllPasswordsHdl ) ); 157 m_aChangeBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, ChangePasswordHdl ) ); 158 m_aPasswordsLB.SetSelectHdl( LINK( this, WebConnectionInfoDialog, EntrySelectedHdl ) ); 159 160 m_aRemoveBtn.Enable( sal_False ); 161 m_aChangeBtn.Enable( sal_False ); 162 163 HeaderBarClickedHdl( NULL ); 164 } 165 166 // ----------------------------------------------------------------------- 167 WebConnectionInfoDialog::~WebConnectionInfoDialog() 168 { 169 } 170 171 // ----------------------------------------------------------------------- 172 IMPL_LINK( WebConnectionInfoDialog, HeaderBarClickedHdl, SvxSimpleTable*, pTable ) 173 { 174 m_aPasswordsLB.Resort( NULL == pTable ); 175 return 0; 176 } 177 178 // ----------------------------------------------------------------------- 179 void WebConnectionInfoDialog::FillPasswordList() 180 { 181 try 182 { 183 uno::Reference< task::XMasterPasswordHandling > xMasterPasswd( 184 comphelper::getProcessServiceFactory()->createInstance( 185 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.task.PasswordContainer" ) ) ), 186 uno::UNO_QUERY ); 187 188 if ( xMasterPasswd.is() && xMasterPasswd->isPersistentStoringAllowed() ) 189 { 190 uno::Reference< task::XPasswordContainer > xPasswdContainer( xMasterPasswd, uno::UNO_QUERY_THROW ); 191 uno::Reference< task::XInteractionHandler > xInteractionHandler( 192 comphelper::getProcessServiceFactory()->createInstance( 193 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.task.InteractionHandler" ) ) ), 194 uno::UNO_QUERY_THROW ); 195 196 uno::Sequence< task::UrlRecord > aURLEntries = xPasswdContainer->getAllPersistent( xInteractionHandler ); 197 sal_Int32 nCount = 0; 198 for ( sal_Int32 nURLInd = 0; nURLInd < aURLEntries.getLength(); nURLInd++ ) 199 { 200 for ( sal_Int32 nUserInd = 0; nUserInd < aURLEntries[nURLInd].UserList.getLength(); nUserInd++ ) 201 { 202 ::rtl::OUString aUIEntry( aURLEntries[nURLInd].Url ); 203 aUIEntry += ::rtl::OUString::valueOf( (sal_Unicode)'\t' ); 204 aUIEntry += aURLEntries[nURLInd].UserList[nUserInd].UserName; 205 SvLBoxEntry* pEntry = m_aPasswordsLB.InsertEntry( aUIEntry ); 206 pEntry->SetUserData( (void*)(nCount++) ); 207 } 208 } 209 210 // remember pos of first url container entry. 211 m_nPos = nCount; 212 213 uno::Reference< task::XUrlContainer > xUrlContainer( 214 xPasswdContainer, uno::UNO_QUERY_THROW ); 215 216 uno::Sequence< rtl::OUString > aUrls 217 = xUrlContainer->getUrls( sal_True /* OnlyPersistent */ ); 218 219 for ( sal_Int32 nURLIdx = 0; nURLIdx < aUrls.getLength(); nURLIdx++ ) 220 { 221 ::rtl::OUString aUIEntry( aUrls[ nURLIdx ] ); 222 aUIEntry += ::rtl::OUString::valueOf( (sal_Unicode)'\t' ); 223 aUIEntry += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "*" ) ); 224 SvLBoxEntry* pEntry = m_aPasswordsLB.InsertEntry( aUIEntry ); 225 pEntry->SetUserData( (void*)(nCount++) ); 226 } 227 } 228 } 229 catch( uno::Exception& ) 230 {} 231 } 232 233 // ----------------------------------------------------------------------- 234 IMPL_LINK( WebConnectionInfoDialog, RemovePasswordHdl, PushButton*, EMPTYARG ) 235 { 236 try 237 { 238 SvLBoxEntry* pEntry = m_aPasswordsLB.GetCurEntry(); 239 if ( pEntry ) 240 { 241 ::rtl::OUString aURL = m_aPasswordsLB.GetEntryText( pEntry, 0 ); 242 ::rtl::OUString aUserName = m_aPasswordsLB.GetEntryText( pEntry, 1 ); 243 244 uno::Reference< task::XPasswordContainer > xPasswdContainer( 245 comphelper::getProcessServiceFactory()->createInstance( 246 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 247 "com.sun.star.task.PasswordContainer" ) ) ), 248 uno::UNO_QUERY_THROW ); 249 250 sal_Int32 nPos = (sal_Int32)(sal_IntPtr)pEntry->GetUserData(); 251 if ( nPos < m_nPos ) 252 { 253 xPasswdContainer->removePersistent( aURL, aUserName ); 254 } 255 else 256 { 257 uno::Reference< task::XUrlContainer > xUrlContainer( 258 xPasswdContainer, uno::UNO_QUERY_THROW ); 259 xUrlContainer->removeUrl( aURL ); 260 } 261 m_aPasswordsLB.RemoveEntry( pEntry ); 262 } 263 } 264 catch( uno::Exception& ) 265 {} 266 267 return 0; 268 } 269 270 // ----------------------------------------------------------------------- 271 IMPL_LINK( WebConnectionInfoDialog, RemoveAllPasswordsHdl, PushButton*, EMPTYARG ) 272 { 273 try 274 { 275 uno::Reference< task::XPasswordContainer > xPasswdContainer( 276 comphelper::getProcessServiceFactory()->createInstance( 277 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 278 "com.sun.star.task.PasswordContainer" ) ) ), 279 uno::UNO_QUERY_THROW ); 280 281 // should the master password be requested before? 282 xPasswdContainer->removeAllPersistent(); 283 284 uno::Reference< task::XUrlContainer > xUrlContainer( 285 xPasswdContainer, uno::UNO_QUERY_THROW ); 286 uno::Sequence< rtl::OUString > aUrls 287 = xUrlContainer->getUrls( sal_True /* OnlyPersistent */ ); 288 for ( sal_Int32 nURLIdx = 0; nURLIdx < aUrls.getLength(); nURLIdx++ ) 289 xUrlContainer->removeUrl( aUrls[ nURLIdx ] ); 290 291 m_aPasswordsLB.Clear(); 292 } 293 catch( uno::Exception& ) 294 {} 295 296 return 0; 297 } 298 299 // ----------------------------------------------------------------------- 300 IMPL_LINK( WebConnectionInfoDialog, ChangePasswordHdl, PushButton*, EMPTYARG ) 301 { 302 try 303 { 304 SvLBoxEntry* pEntry = m_aPasswordsLB.GetCurEntry(); 305 if ( pEntry ) 306 { 307 ::rtl::OUString aURL = m_aPasswordsLB.GetEntryText( pEntry, 0 ); 308 ::rtl::OUString aUserName = m_aPasswordsLB.GetEntryText( pEntry, 1 ); 309 310 ::comphelper::SimplePasswordRequest* pPasswordRequest 311 = new ::comphelper::SimplePasswordRequest( task::PasswordRequestMode_PASSWORD_CREATE ); 312 uno::Reference< task::XInteractionRequest > rRequest( pPasswordRequest ); 313 314 uno::Reference< task::XInteractionHandler > xInteractionHandler( 315 comphelper::getProcessServiceFactory()->createInstance( 316 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 317 "com.sun.star.task.InteractionHandler" ) ) ), 318 uno::UNO_QUERY_THROW ); 319 xInteractionHandler->handle( rRequest ); 320 321 if ( pPasswordRequest->isPassword() ) 322 { 323 String aNewPass = pPasswordRequest->getPassword(); 324 uno::Sequence< ::rtl::OUString > aPasswd( 1 ); 325 aPasswd[0] = aNewPass; 326 327 uno::Reference< task::XPasswordContainer > xPasswdContainer( 328 comphelper::getProcessServiceFactory()->createInstance( 329 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 330 "com.sun.star.task.PasswordContainer" ) ) ), 331 uno::UNO_QUERY_THROW ); 332 xPasswdContainer->addPersistent( 333 aURL, aUserName, aPasswd, xInteractionHandler ); 334 } 335 } 336 } 337 catch( uno::Exception& ) 338 {} 339 340 return 0; 341 } 342 343 // ----------------------------------------------------------------------- 344 IMPL_LINK( WebConnectionInfoDialog, EntrySelectedHdl, void*, EMPTYARG ) 345 { 346 SvLBoxEntry* pEntry = m_aPasswordsLB.GetCurEntry(); 347 if ( !pEntry ) 348 { 349 m_aRemoveBtn.Enable( sal_False ); 350 m_aChangeBtn.Enable( sal_False ); 351 } 352 else 353 { 354 m_aRemoveBtn.Enable( sal_True ); 355 356 // url container entries (-> use system credentials) have 357 // no password 358 sal_Int32 nPos = (sal_Int32)(sal_IntPtr)pEntry->GetUserData(); 359 m_aChangeBtn.Enable( nPos < m_nPos ); 360 } 361 362 return 0; 363 } 364 365 //........................................................................ 366 } // namespace svx 367 //........................................................................ 368 369