1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_xmlsecurity.hxx" 30 #include <xmlsecurity/certificateviewer.hxx> 31 #include <com/sun/star/security/XCertificate.hpp> 32 33 #include <com/sun/star/security/CertificateCharacters.hpp> 34 #include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp> 35 #include <com/sun/star/security/CertificateValidity.hpp> 36 37 #include <unotools/localedatawrapper.hxx> 38 #include <unotools/datetime.hxx> 39 40 #include "dialogs.hrc" 41 #include "resourcemanager.hxx" 42 43 /* HACK: disable some warnings for MS-C */ 44 #ifdef _MSC_VER 45 #pragma warning (disable : 4355) // 4355: this used in initializer-list 46 #endif 47 48 using namespace ::com::sun::star; 49 using namespace ::com::sun::star::uno; 50 namespace css = ::com::sun::star; 51 52 53 namespace 54 { 55 void ShrinkToFit( FixedImage& _rImage ); 56 void AdjustPosAndSize( Control& _rCtrl, Point& _rStartIn_EndOut, long _nXOffset = 0 ); 57 58 void ShrinkToFit( FixedImage& _rImg ) 59 { 60 _rImg.SetSizePixel( _rImg.GetImage().GetSizePixel() ); 61 } 62 63 void AdjustPosAndSize( Control& _rCtrl, Point& _rStartIn_EndOut, long _nOffs ) 64 { 65 _rCtrl.SetPosPixel( _rStartIn_EndOut ); 66 _rStartIn_EndOut.X() += XmlSec::ShrinkToFitWidth( _rCtrl, _nOffs ); 67 } 68 } 69 70 CertificateViewer::CertificateViewer( 71 Window* _pParent, 72 const cssu::Reference< dcss::xml::crypto::XSecurityEnvironment >& _rxSecurityEnvironment, 73 const cssu::Reference< dcss::security::XCertificate >& _rXCert, sal_Bool bCheckForPrivateKey ) 74 :TabDialog ( _pParent, XMLSEC_RES( RID_XMLSECDLG_CERTVIEWER ) ) 75 ,maTabCtrl ( this, XMLSEC_RES( 1 ) ) 76 ,maOkBtn ( this, XMLSEC_RES( BTN_OK ) ) 77 ,maHelpBtn ( this, XMLSEC_RES( BTN_HELP ) ) 78 { 79 FreeResource(); 80 81 mbCheckForPrivateKey = bCheckForPrivateKey; 82 83 mxSecurityEnvironment = _rxSecurityEnvironment; 84 mxCert = _rXCert; 85 86 maTabCtrl.SetTabPage( RID_XMLSECTP_GENERAL, new CertificateViewerGeneralTP( &maTabCtrl, this ) ); 87 maTabCtrl.SetTabPage( RID_XMLSECTP_DETAILS, new CertificateViewerDetailsTP( &maTabCtrl, this ) ); 88 maTabCtrl.SetTabPage( RID_XMLSECTP_CERTPATH, new CertificateViewerCertPathTP( &maTabCtrl, this ) ); 89 maTabCtrl.SetCurPageId( RID_XMLSECTP_GENERAL ); 90 } 91 92 CertificateViewer::~CertificateViewer() 93 { 94 delete maTabCtrl.GetTabPage( RID_XMLSECTP_CERTPATH ); 95 delete maTabCtrl.GetTabPage( RID_XMLSECTP_DETAILS ); 96 delete maTabCtrl.GetTabPage( RID_XMLSECTP_GENERAL ); 97 } 98 99 CertificateViewerTP::CertificateViewerTP( Window* _pParent, const ResId& _rResId, CertificateViewer* _pDlg ) 100 :TabPage ( _pParent, _rResId ) 101 ,mpDlg ( _pDlg ) 102 { 103 } 104 105 106 CertificateViewerGeneralTP::CertificateViewerGeneralTP( Window* _pParent, CertificateViewer* _pDlg ) 107 :CertificateViewerTP ( _pParent, XMLSEC_RES( RID_XMLSECTP_GENERAL ), _pDlg ) 108 ,maFrameWin ( this, XMLSEC_RES( WIN_FRAME ) ) 109 ,maCertImg ( this, XMLSEC_RES( IMG_CERT ) ) 110 ,maCertInfoFI ( this, XMLSEC_RES( FI_CERTINFO ) ) 111 ,maSep1FL ( this, XMLSEC_RES( FL_SEP1 ) ) 112 ,maHintNotTrustedFI ( this, XMLSEC_RES( FI_HINTNOTTRUST ) ) 113 ,maSep2FL ( this, XMLSEC_RES( FL_SEP2 ) ) 114 ,maIssuedToLabelFI ( this, XMLSEC_RES( FI_ISSTOLABEL ) ) 115 ,maIssuedToFI ( this, XMLSEC_RES( FI_ISSTO ) ) 116 ,maIssuedByLabelFI ( this, XMLSEC_RES( FI_ISSBYLABEL ) ) 117 ,maIssuedByFI ( this, XMLSEC_RES( FI_ISSBY ) ) 118 ,maValidDateFI ( this, XMLSEC_RES( FI_VALIDDATE ) ) 119 ,maKeyImg ( this, XMLSEC_RES( IMG_KEY ) ) 120 ,maHintCorrespPrivKeyFI ( this, XMLSEC_RES( FI_CORRPRIVKEY ) ) 121 { 122 if ( GetSettings().GetStyleSettings().GetHighContrastMode() ) 123 maKeyImg.SetImage( Image( XMLSEC_RES( IMG_KEY_HC ) ) ); 124 125 //Verify the certificate 126 sal_Int32 certStatus = mpDlg->mxSecurityEnvironment->verifyCertificate(mpDlg->mxCert, 127 Sequence<Reference<css::security::XCertificate> >()); 128 129 bool bCertValid = certStatus == css::security::CertificateValidity::VALID ? true : false; 130 131 bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode(); 132 if ( !bCertValid ) 133 { 134 maCertImg.SetImage( 135 Image( XMLSEC_RES( bHC ? IMG_STATE_NOT_VALIDATED_HC : IMG_STATE_NOT_VALIDATED ) ) ); 136 maHintNotTrustedFI.SetText( String( XMLSEC_RES( STR_CERTIFICATE_NOT_VALIDATED ) ) ); 137 } 138 else if ( bHC ) 139 maCertImg.SetImage( Image( XMLSEC_RES( IMG_STATE_CERIFICATED_HC ) ) ); 140 141 FreeResource(); 142 143 Wallpaper aBack( GetSettings().GetStyleSettings().GetWindowColor() ); 144 maFrameWin.SetBackground( aBack ); 145 maCertImg.SetBackground( aBack ); 146 maCertInfoFI.SetBackground( aBack ); 147 maSep1FL.SetBackground( aBack ); 148 maHintNotTrustedFI.SetBackground( aBack ); 149 maSep2FL.SetBackground( aBack ); 150 maIssuedToLabelFI.SetBackground( aBack ); 151 maIssuedToFI.SetBackground( aBack ); 152 maIssuedByLabelFI.SetBackground( aBack ); 153 maIssuedByFI.SetBackground( aBack ); 154 maValidDateFI.SetBackground( aBack ); 155 maKeyImg.SetBackground( aBack ); 156 maHintCorrespPrivKeyFI.SetBackground( aBack ); 157 158 // make some bold 159 Font aFnt( maCertInfoFI.GetFont() ); 160 aFnt.SetWeight( WEIGHT_BOLD ); 161 maCertInfoFI.SetFont( aFnt ); 162 maHintNotTrustedFI.SetFont( aFnt ); 163 maIssuedToLabelFI.SetFont( aFnt ); 164 maIssuedByLabelFI.SetFont( aFnt ); 165 maValidDateFI.SetFont( aFnt ); 166 167 // insert data 168 cssu::Reference< dcss::security::XCertificate > xCert = mpDlg->mxCert; 169 170 maIssuedToFI.SetText( XmlSec::GetContentPart( xCert->getSubjectName() ) ); 171 maIssuedByFI.SetText( XmlSec::GetContentPart( xCert->getIssuerName() ) ); 172 173 // dynamic length because of the different languages 174 long nWidth1 = maIssuedToLabelFI.GetTextWidth( maIssuedToLabelFI.GetText() ); 175 long nWidth2 = maIssuedByLabelFI.GetTextWidth( maIssuedByLabelFI.GetText() ); 176 long nNewWidth = Max( nWidth1, nWidth2 ) + 5; 177 Size aNewSize = maIssuedToLabelFI.GetSizePixel(); 178 aNewSize.Width() = nNewWidth; 179 maIssuedToLabelFI.SetSizePixel( aNewSize ); 180 maIssuedByLabelFI.SetSizePixel( aNewSize ); 181 long nNewX = maIssuedToLabelFI.GetPosPixel().X() + nNewWidth + 1; 182 Point aNewPos = maIssuedToFI.GetPosPixel(); 183 aNewPos.X() = nNewX; 184 maIssuedToFI.SetPosPixel( aNewPos ); 185 aNewPos = maIssuedByFI.GetPosPixel(); 186 aNewPos.X() = nNewX; 187 maIssuedByFI.SetPosPixel( aNewPos ); 188 nNewWidth = maValidDateFI.GetSizePixel().Width() - nNewX; 189 aNewSize = maIssuedToFI.GetSizePixel(); 190 aNewSize.Width() = nNewWidth; 191 maIssuedToFI.SetSizePixel( aNewSize ); 192 maIssuedByFI.SetSizePixel( aNewSize ); 193 194 DateTime aDateTimeStart; 195 DateTime aDateTimeEnd; 196 utl::typeConvert( xCert->getNotValidBefore(), aDateTimeStart ); 197 utl::typeConvert( xCert->getNotValidAfter(), aDateTimeEnd ); 198 String sText = maValidDateFI.GetText(); 199 sText.SearchAndReplace( String::CreateFromAscii( "%SDATE%" ), 200 GetSettings().GetUILocaleDataWrapper().getDate( aDateTimeStart.GetDate() ) ); 201 sText.SearchAndReplace( String::CreateFromAscii( "%EDATE%" ), 202 GetSettings().GetUILocaleDataWrapper().getDate( aDateTimeEnd.GetDate() ) ); 203 maValidDateFI.SetText( sText ); 204 205 // adjust position of fixed text depending on image sizes 206 ShrinkToFit( maCertImg ); 207 ShrinkToFit( maKeyImg ); 208 XmlSec::AlignAfterImage( maCertImg, maCertInfoFI, 12 ); 209 XmlSec::AlignAfterImage( maKeyImg, maHintCorrespPrivKeyFI, 12 ); 210 211 // Check if we have the private key... 212 sal_Bool bHasPrivateKey = sal_False; 213 // #i41270# Check only if we have that certificate in our security environment 214 if ( _pDlg->mbCheckForPrivateKey ) 215 { 216 long nCertificateCharacters = _pDlg->mxSecurityEnvironment->getCertificateCharacters( xCert ); 217 bHasPrivateKey = ( nCertificateCharacters & security::CertificateCharacters::HAS_PRIVATE_KEY ) ? sal_True : sal_False; 218 } 219 if ( !bHasPrivateKey ) 220 { 221 maKeyImg.Hide(); 222 maHintCorrespPrivKeyFI.Hide(); 223 } 224 } 225 226 void CertificateViewerGeneralTP::ActivatePage() 227 { 228 229 } 230 231 232 struct Details_UserDatat 233 { 234 String maTxt; 235 bool mbFixedWidthFont; 236 237 inline Details_UserDatat( const String& _rTxt, bool _bFixedWidthFont ); 238 }; 239 240 inline Details_UserDatat::Details_UserDatat( const String& _rTxt, bool _bFixedWidthFont ) 241 :maTxt ( _rTxt ) 242 ,mbFixedWidthFont ( _bFixedWidthFont ) 243 { 244 } 245 246 247 void CertificateViewerDetailsTP::Clear( void ) 248 { 249 maElementML.SetText( String() ); 250 sal_uLong i = 0; 251 SvLBoxEntry* pEntry = maElementsLB.GetEntry( i ); 252 while( pEntry ) 253 { 254 delete ( Details_UserDatat* ) pEntry->GetUserData(); 255 ++i; 256 pEntry = maElementsLB.GetEntry( i ); 257 } 258 259 maElementsLB.Clear(); 260 } 261 262 void CertificateViewerDetailsTP::InsertElement( const String& _rField, const String& _rValue, 263 const String& _rDetails, bool _bFixedWidthFont ) 264 { 265 SvLBoxEntry* pEntry = maElementsLB.InsertEntry( _rField ); 266 maElementsLB.SetEntryText( _rValue, pEntry, 1 ); 267 pEntry->SetUserData( ( void* ) new Details_UserDatat( _rDetails, _bFixedWidthFont ) ); 268 } 269 270 CertificateViewerDetailsTP::CertificateViewerDetailsTP( Window* _pParent, CertificateViewer* _pDlg ) 271 :CertificateViewerTP ( _pParent, XMLSEC_RES( RID_XMLSECTP_DETAILS ), _pDlg ) 272 ,maElementsLB ( this, XMLSEC_RES( LB_ELEMENTS ) ) 273 ,maElementML ( this, XMLSEC_RES( ML_ELEMENT ) ) 274 ,maStdFont ( maElementML.GetControlFont() ) 275 ,maFixedWidthFont ( OutputDevice::GetDefaultFont( DEFAULTFONT_UI_FIXED, LANGUAGE_DONTKNOW, DEFAULTFONT_FLAGS_ONLYONE, this ) ) 276 { 277 WinBits nStyle = maElementsLB.GetStyle(); 278 nStyle &= ~WB_HSCROLL; 279 maElementsLB.SetStyle( nStyle ); 280 281 maFixedWidthFont.SetHeight( maStdFont.GetHeight() ); 282 283 static long nTabs[] = { 2, 0, 30*CS_LB_WIDTH/100 }; 284 maElementsLB.SetTabs( &nTabs[ 0 ] ); 285 maElementsLB.InsertHeaderEntry( String( XMLSEC_RES( STR_HEADERBAR ) ) ); 286 287 // fill list box 288 Reference< security::XCertificate > xCert = mpDlg->mxCert; 289 sal_uInt16 nLineBreak = 16; 290 const char* pHexSep = " "; 291 String aLBEntry; 292 String aDetails; 293 // --> PB 2004-10-11 #i35107# - 0 == "V1", 1 == "V2", ..., n = "V(n+1)" 294 aLBEntry = String::CreateFromAscii( "V" ); 295 aLBEntry += String::CreateFromInt32( xCert->getVersion() + 1 ); 296 // <-- 297 InsertElement( String( XMLSEC_RES( STR_VERSION ) ), aLBEntry, aLBEntry ); 298 Sequence< sal_Int8 > aSeq = xCert->getSerialNumber(); 299 aLBEntry = XmlSec::GetHexString( aSeq, pHexSep ); 300 aDetails = XmlSec::GetHexString( aSeq, pHexSep, nLineBreak ); 301 InsertElement( String( XMLSEC_RES( STR_SERIALNUM ) ), aLBEntry, aDetails, true ); 302 303 std::pair< ::rtl::OUString, ::rtl::OUString> pairIssuer = 304 XmlSec::GetDNForCertDetailsView(xCert->getIssuerName()); 305 aLBEntry = pairIssuer.first; 306 aDetails = pairIssuer.second; 307 InsertElement( String( XMLSEC_RES( STR_ISSUER ) ), aLBEntry, aDetails ); 308 /* 309 aSeq = xCert->getIssuerUniqueID(); 310 aLBEntry = XmlSec::GetHexString( aSeq, pHexSep ); 311 aDetails = XmlSec::GetHexString( aSeq, pHexSep, nLineBreak ); 312 InsertElement( String( XMLSEC_RES( STR_ISSUER_ID ) ), aLBEntry, aDetails, true ); 313 */ 314 315 DateTime aDateTime; 316 utl::typeConvert( xCert->getNotValidBefore(), aDateTime ); 317 aLBEntry = GetSettings().GetUILocaleDataWrapper().getDate( aDateTime.GetDate() ); 318 aLBEntry += String::CreateFromAscii( " " ); 319 aLBEntry += GetSettings().GetUILocaleDataWrapper().getTime( aDateTime.GetTime() ); 320 InsertElement( String( XMLSEC_RES( STR_VALIDFROM ) ), aLBEntry, aLBEntry ); 321 utl::typeConvert( xCert->getNotValidAfter(), aDateTime ); 322 aLBEntry = GetSettings().GetUILocaleDataWrapper().getDate( aDateTime.GetDate() ); 323 aLBEntry += String::CreateFromAscii( " " ); 324 aLBEntry += GetSettings().GetUILocaleDataWrapper().getTime( aDateTime.GetTime() ); 325 InsertElement( String( XMLSEC_RES( STR_VALIDTO ) ), aLBEntry, aLBEntry ); 326 327 std::pair< ::rtl::OUString, ::rtl::OUString > pairSubject = 328 XmlSec::GetDNForCertDetailsView(xCert->getSubjectName()); 329 aLBEntry = pairSubject.first; 330 aDetails = pairSubject.second; 331 InsertElement( String( XMLSEC_RES( STR_SUBJECT ) ), aLBEntry, aDetails ); 332 /* 333 aSeq = xCert->getSubjectUniqueID(); 334 aLBEntry = XmlSec::GetHexString( aSeq, pHexSep ); 335 aDetails = XmlSec::GetHexString( aSeq, pHexSep, nLineBreak ); 336 InsertElement( String( XMLSEC_RES( STR_SUBJECT_ID ) ), aLBEntry, aDetails, true ); 337 */ 338 aLBEntry = aDetails = xCert->getSubjectPublicKeyAlgorithm(); 339 InsertElement( String( XMLSEC_RES( STR_SUBJECT_PUBKEY_ALGO ) ), aLBEntry, aDetails ); 340 aSeq = xCert->getSubjectPublicKeyValue(); 341 aLBEntry = XmlSec::GetHexString( aSeq, pHexSep ); 342 aDetails = XmlSec::GetHexString( aSeq, pHexSep, nLineBreak ); 343 InsertElement( String( XMLSEC_RES( STR_SUBJECT_PUBKEY_VAL ) ), aLBEntry, aDetails, true ); 344 345 aLBEntry = aDetails = xCert->getSignatureAlgorithm(); 346 InsertElement( String( XMLSEC_RES( STR_SIGNATURE_ALGO ) ), aLBEntry, aDetails ); 347 348 aSeq = xCert->getSHA1Thumbprint(); 349 aLBEntry = XmlSec::GetHexString( aSeq, pHexSep ); 350 aDetails = XmlSec::GetHexString( aSeq, pHexSep, nLineBreak ); 351 InsertElement( String( XMLSEC_RES( STR_THUMBPRINT_SHA1 ) ), aLBEntry, aDetails, true ); 352 353 aSeq = xCert->getMD5Thumbprint(); 354 aLBEntry = XmlSec::GetHexString( aSeq, pHexSep ); 355 aDetails = XmlSec::GetHexString( aSeq, pHexSep, nLineBreak ); 356 InsertElement( String( XMLSEC_RES( STR_THUMBPRINT_MD5 ) ), aLBEntry, aDetails, true ); 357 358 FreeResource(); 359 360 maElementsLB.SetSelectHdl( LINK( this, CertificateViewerDetailsTP, ElementSelectHdl ) ); 361 } 362 363 CertificateViewerDetailsTP::~CertificateViewerDetailsTP() 364 { 365 Clear(); 366 } 367 368 void CertificateViewerDetailsTP::ActivatePage() 369 { 370 } 371 372 IMPL_LINK( CertificateViewerDetailsTP, ElementSelectHdl, void*, EMPTYARG ) 373 { 374 SvLBoxEntry* pEntry = maElementsLB.FirstSelected(); 375 String aElementText; 376 bool bFixedWidthFont; 377 if( pEntry ) 378 { 379 const Details_UserDatat* p = ( Details_UserDatat* ) pEntry->GetUserData(); 380 aElementText = p->maTxt; 381 bFixedWidthFont = p->mbFixedWidthFont; 382 } 383 else 384 bFixedWidthFont = false; 385 386 maElementML.SetFont( bFixedWidthFont? maFixedWidthFont : maStdFont ); 387 maElementML.SetControlFont( bFixedWidthFont? maFixedWidthFont : maStdFont ); 388 maElementML.SetText( aElementText ); 389 390 return 0; 391 } 392 393 struct CertPath_UserData 394 { 395 cssu::Reference< dcss::security::XCertificate > mxCert; 396 String maStatus; 397 bool mbValid; 398 399 CertPath_UserData( cssu::Reference< dcss::security::XCertificate > xCert, bool bValid): 400 mxCert(xCert), 401 mbValid(bValid) 402 { 403 } 404 }; 405 406 407 CertificateViewerCertPathTP::CertificateViewerCertPathTP( Window* _pParent, CertificateViewer* _pDlg ) 408 :CertificateViewerTP ( _pParent, XMLSEC_RES( RID_XMLSECTP_CERTPATH ), _pDlg ) 409 ,maCertPathFT ( this, XMLSEC_RES( FT_CERTPATH ) ) 410 ,maCertPathLB ( this, XMLSEC_RES( LB_SIGNATURES ) ) 411 ,maViewCertPB ( this, XMLSEC_RES( BTN_VIEWCERT ) ) 412 ,maCertStatusFT ( this, XMLSEC_RES( FT_CERTSTATUS ) ) 413 ,maCertStatusML ( this, XMLSEC_RES( ML_CERTSTATUS ) ) 414 ,mpParent ( _pDlg ) 415 ,mbFirstActivateDone ( false ) 416 ,maCertImage ( XMLSEC_RES( IMG_CERT_SMALL ) ) 417 ,maCertNotValidatedImage( XMLSEC_RES( IMG_CERT_NOTVALIDATED_SMALL ) ) 418 ,msCertOK ( XMLSEC_RES( STR_PATH_CERT_OK ) ) 419 ,msCertNotValidated ( XMLSEC_RES( STR_PATH_CERT_NOT_VALIDATED ) ) 420 421 { 422 if ( GetSettings().GetStyleSettings().GetHighContrastMode() ) 423 { 424 maCertImage = Image( XMLSEC_RES( IMG_CERT_SMALL_HC ) ); 425 maCertNotValidatedImage = Image( XMLSEC_RES( IMG_CERT_NOTVALIDATED_SMALL_HC ) ); 426 } 427 428 FreeResource(); 429 430 maCertPathLB.SetNodeDefaultImages(); 431 maCertPathLB.SetSublistOpenWithLeftRight(); 432 maCertPathLB.SetSelectHdl( LINK( this, CertificateViewerCertPathTP, CertSelectHdl ) ); 433 maViewCertPB.SetClickHdl( LINK( this, CertificateViewerCertPathTP, ViewCertHdl ) ); 434 435 // check if buttontext is to wide 436 const long nOffset = 10; 437 String sText = maViewCertPB.GetText(); 438 long nTxtW = maViewCertPB.GetTextWidth( sText ); 439 if ( sText.Search( '~' ) == STRING_NOTFOUND ) 440 nTxtW += nOffset; 441 long nBtnW = maViewCertPB.GetSizePixel().Width(); 442 if ( nTxtW > nBtnW ) 443 { 444 // broaden the button 445 long nDelta = nTxtW - nBtnW; 446 Size aNewSize = maViewCertPB.GetSizePixel(); 447 aNewSize.Width() += nDelta; 448 maViewCertPB.SetSizePixel( aNewSize ); 449 // and give it a new position 450 Point aNewPos = maViewCertPB.GetPosPixel(); 451 aNewPos.X() -= nDelta; 452 maViewCertPB.SetPosPixel( aNewPos ); 453 } 454 } 455 456 CertificateViewerCertPathTP::~CertificateViewerCertPathTP() 457 { 458 Clear(); 459 } 460 461 void CertificateViewerCertPathTP::ActivatePage() 462 { 463 if ( !mbFirstActivateDone ) 464 { 465 mbFirstActivateDone = true; 466 Sequence< Reference< security::XCertificate > > aCertPath = 467 mpParent->mxSecurityEnvironment->buildCertificatePath( mpParent->mxCert ); 468 const Reference< security::XCertificate >* pCertPath = aCertPath.getConstArray(); 469 470 String aState; 471 sal_Int32 i, nCnt = aCertPath.getLength(); 472 SvLBoxEntry* pParent = NULL; 473 for( i = nCnt; i; ) 474 { 475 const Reference< security::XCertificate > rCert = pCertPath[ --i ]; 476 String sName = XmlSec::GetContentPart( rCert->getSubjectName() ); 477 //Verify the certificate 478 sal_Int32 certStatus = mpDlg->mxSecurityEnvironment->verifyCertificate(rCert, 479 Sequence<Reference<css::security::XCertificate> >()); 480 bool bCertValid = certStatus == css::security::CertificateValidity::VALID ? true : false; 481 pParent = InsertCert( pParent, sName, rCert, bCertValid); 482 } 483 484 maCertPathLB.Select( pParent ); 485 maViewCertPB.Disable(); // Own certificate selected 486 487 while( pParent ) 488 { 489 maCertPathLB.Expand( pParent ); 490 pParent = maCertPathLB.GetParent( pParent ); 491 } 492 493 CertSelectHdl( NULL ); 494 } 495 } 496 497 IMPL_LINK( CertificateViewerCertPathTP, ViewCertHdl, void*, EMPTYARG ) 498 { 499 SvLBoxEntry* pEntry = maCertPathLB.FirstSelected(); 500 if( pEntry ) 501 { 502 CertificateViewer aViewer( this, mpDlg->mxSecurityEnvironment, ((CertPath_UserData*)pEntry->GetUserData())->mxCert, sal_False ); 503 aViewer.Execute(); 504 } 505 506 return 0; 507 } 508 509 IMPL_LINK( CertificateViewerCertPathTP, CertSelectHdl, void*, EMPTYARG ) 510 { 511 String sStatus; 512 SvLBoxEntry* pEntry = maCertPathLB.FirstSelected(); 513 if( pEntry ) 514 { 515 CertPath_UserData* pData = (CertPath_UserData*) pEntry->GetUserData(); 516 if ( pData ) 517 sStatus = pData->mbValid ? msCertOK : msCertNotValidated; 518 } 519 520 maCertStatusML.SetText( sStatus ); 521 maViewCertPB.Enable( pEntry && ( pEntry != maCertPathLB.Last() ) ); 522 return 0; 523 } 524 525 void CertificateViewerCertPathTP::Clear( void ) 526 { 527 maCertStatusML.SetText( String() ); 528 sal_uLong i = 0; 529 SvLBoxEntry* pEntry = maCertPathLB.GetEntry( i ); 530 while( pEntry ) 531 { 532 delete ( CertPath_UserData* ) pEntry->GetUserData(); 533 ++i; 534 pEntry = maCertPathLB.GetEntry( i ); 535 } 536 537 maCertPathLB.Clear(); 538 } 539 540 SvLBoxEntry* CertificateViewerCertPathTP::InsertCert( 541 SvLBoxEntry* _pParent, const String& _rName, cssu::Reference< dcss::security::XCertificate > rxCert, 542 bool bValid) 543 { 544 Image aImage = bValid ? maCertImage : maCertNotValidatedImage; 545 SvLBoxEntry* pEntry = maCertPathLB.InsertEntry( _rName, aImage, aImage, _pParent ); 546 pEntry->SetUserData( ( void* ) new CertPath_UserData( rxCert, bValid ) ); 547 548 return pEntry; 549 } 550 551