blob: 143a5ae44540ee82d1d829052e572c095576ea8d [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_cui.hxx"
// include ---------------------------------------------------------------
#include <dialmgr.hxx>
#include <cuires.hrc>
#include <com/sun/star/task/UrlRecord.hpp>
#include <com/sun/star/task/XPasswordContainer.hpp>
#include <com/sun/star/task/XMasterPasswordHandling.hpp>
#include "com/sun/star/task/XUrlContainer.hpp"
#include <comphelper/processfactory.hxx>
#include <comphelper/docpasswordrequest.hxx>
#include "webconninfo.hxx"
#include "webconninfo.hrc"
using namespace ::com::sun::star;
//........................................................................
namespace svx
{
//........................................................................
// class PasswordTable ---------------------------------------------------
PasswordTable::PasswordTable( Window* pParent, const ResId& rResId ) :
SvxSimpleTable( pParent, rResId )
{
SetStyle( GetStyle() | WB_NOINITIALSELECTION );
}
void PasswordTable::InsertHeaderItem( sal_uInt16 nColumn, const String& rText, HeaderBarItemBits nBits )
{
GetTheHeaderBar()->InsertItem( nColumn, rText, 0, nBits );
}
void PasswordTable::ResetTabs()
{
SetTabs();
}
void PasswordTable::Resort( bool bForced )
{
sal_uInt16 nColumn = GetSelectedCol();
if ( 0 == nColumn || bForced ) // only the first column is sorted
{
HeaderBarItemBits nBits = GetTheHeaderBar()->GetItemBits(1);
sal_Bool bUp = ( ( nBits & HIB_UPARROW ) == HIB_UPARROW );
SvSortMode eMode = SortAscending;
if ( bUp )
{
nBits &= ~HIB_UPARROW;
nBits |= HIB_DOWNARROW;
eMode = SortDescending;
}
else
{
nBits &= ~HIB_DOWNARROW;
nBits |= HIB_UPARROW;
}
GetTheHeaderBar()->SetItemBits( 1, nBits );
SvTreeList* pListModel = GetModel();
pListModel->SetSortMode( eMode );
pListModel->Resort();
}
}
// class WebConnectionInfoDialog -----------------------------------------
// -----------------------------------------------------------------------
WebConnectionInfoDialog::WebConnectionInfoDialog( Window* pParent ) :
ModalDialog( pParent, CUI_RES( RID_SVXDLG_WEBCONNECTION_INFO ) )
,m_aNeverShownFI ( this, CUI_RES( FI_NEVERSHOWN ) )
,m_aPasswordsLB ( this, CUI_RES( LB_PASSWORDS ) )
,m_aRemoveBtn ( this, CUI_RES( PB_REMOVE ) )
,m_aRemoveAllBtn ( this, CUI_RES( PB_REMOVEALL ) )
,m_aChangeBtn ( this, CUI_RES( PB_CHANGE ) )
,m_aButtonsFL ( this, CUI_RES( FL_BUTTONS ) )
,m_aCloseBtn ( this, CUI_RES( PB_CLOSE ) )
,m_aHelpBtn ( this, CUI_RES( PB_HELP ) )
,m_nPos ( -1 )
{
static long aStaticTabs[]= { 3, 0, 150, 250 };
m_aPasswordsLB.SetTabs( aStaticTabs );
m_aPasswordsLB.InsertHeaderItem( 1, CUI_RESSTR( STR_WEBSITE ),
HIB_LEFT | HIB_VCENTER | HIB_FIXEDPOS | HIB_CLICKABLE | HIB_UPARROW );
m_aPasswordsLB.InsertHeaderItem( 2, CUI_RESSTR( STR_USERNAME ),
HIB_LEFT | HIB_VCENTER | HIB_FIXEDPOS );
m_aPasswordsLB.ResetTabs();
FreeResource();
m_aPasswordsLB.SetHeaderBarClickHdl( LINK( this, WebConnectionInfoDialog, HeaderBarClickedHdl ) );
m_aRemoveBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemovePasswordHdl ) );
m_aRemoveAllBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemoveAllPasswordsHdl ) );
m_aChangeBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, ChangePasswordHdl ) );
// one button too small for its text?
sal_Int32 i = 0;
long nBtnTextWidth = 0;
Window* pButtons[] = { &m_aRemoveBtn, &m_aRemoveAllBtn, &m_aChangeBtn };
Window** pButton = pButtons;
const sal_Int32 nBCount = sizeof( pButtons ) / sizeof( pButtons[ 0 ] );
for ( ; i < nBCount; ++i, ++pButton )
{
long nTemp = (*pButton)->GetCtrlTextWidth( (*pButton)->GetText() );
if ( nTemp > nBtnTextWidth )
nBtnTextWidth = nTemp;
}
nBtnTextWidth = nBtnTextWidth * 115 / 100; // a little offset
long nButtonWidth = m_aRemoveBtn.GetSizePixel().Width();
if ( nBtnTextWidth > nButtonWidth )
{
// so make the buttons broader and its control in front of it smaller
long nDelta = nBtnTextWidth - nButtonWidth;
pButton = pButtons;
for ( i = 0; i < nBCount; ++i, ++pButton )
{
Point aNewPos = (*pButton)->GetPosPixel();
if ( &m_aRemoveAllBtn == (*pButton) )
aNewPos.X() += nDelta;
else if ( &m_aChangeBtn == (*pButton) )
aNewPos.X() -= nDelta;
Size aNewSize = (*pButton)->GetSizePixel();
aNewSize.Width() += nDelta;
(*pButton)->SetPosSizePixel( aNewPos, aNewSize );
}
}
FillPasswordList();
m_aRemoveBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemovePasswordHdl ) );
m_aRemoveAllBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemoveAllPasswordsHdl ) );
m_aChangeBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, ChangePasswordHdl ) );
m_aPasswordsLB.SetSelectHdl( LINK( this, WebConnectionInfoDialog, EntrySelectedHdl ) );
m_aRemoveBtn.Enable( sal_False );
m_aChangeBtn.Enable( sal_False );
HeaderBarClickedHdl( NULL );
}
// -----------------------------------------------------------------------
WebConnectionInfoDialog::~WebConnectionInfoDialog()
{
}
// -----------------------------------------------------------------------
IMPL_LINK( WebConnectionInfoDialog, HeaderBarClickedHdl, SvxSimpleTable*, pTable )
{
m_aPasswordsLB.Resort( NULL == pTable );
return 0;
}
// -----------------------------------------------------------------------
void WebConnectionInfoDialog::FillPasswordList()
{
try
{
uno::Reference< task::XMasterPasswordHandling > xMasterPasswd(
comphelper::getProcessServiceFactory()->createInstance(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.task.PasswordContainer" ) ) ),
uno::UNO_QUERY );
if ( xMasterPasswd.is() && xMasterPasswd->isPersistentStoringAllowed() )
{
uno::Reference< task::XPasswordContainer > xPasswdContainer( xMasterPasswd, uno::UNO_QUERY_THROW );
uno::Reference< task::XInteractionHandler > xInteractionHandler(
comphelper::getProcessServiceFactory()->createInstance(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.task.InteractionHandler" ) ) ),
uno::UNO_QUERY_THROW );
uno::Sequence< task::UrlRecord > aURLEntries = xPasswdContainer->getAllPersistent( xInteractionHandler );
sal_Int32 nCount = 0;
for ( sal_Int32 nURLInd = 0; nURLInd < aURLEntries.getLength(); nURLInd++ )
{
for ( sal_Int32 nUserInd = 0; nUserInd < aURLEntries[nURLInd].UserList.getLength(); nUserInd++ )
{
::rtl::OUString aUIEntry( aURLEntries[nURLInd].Url );
aUIEntry += ::rtl::OUString::valueOf( (sal_Unicode)'\t' );
aUIEntry += aURLEntries[nURLInd].UserList[nUserInd].UserName;
SvLBoxEntry* pEntry = m_aPasswordsLB.InsertEntry( aUIEntry );
pEntry->SetUserData( (void*)(nCount++) );
}
}
// remember pos of first url container entry.
m_nPos = nCount;
uno::Reference< task::XUrlContainer > xUrlContainer(
xPasswdContainer, uno::UNO_QUERY_THROW );
uno::Sequence< rtl::OUString > aUrls
= xUrlContainer->getUrls( sal_True /* OnlyPersistent */ );
for ( sal_Int32 nURLIdx = 0; nURLIdx < aUrls.getLength(); nURLIdx++ )
{
::rtl::OUString aUIEntry( aUrls[ nURLIdx ] );
aUIEntry += ::rtl::OUString::valueOf( (sal_Unicode)'\t' );
aUIEntry += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "*" ) );
SvLBoxEntry* pEntry = m_aPasswordsLB.InsertEntry( aUIEntry );
pEntry->SetUserData( (void*)(nCount++) );
}
}
}
catch( uno::Exception& )
{}
}
// -----------------------------------------------------------------------
IMPL_LINK( WebConnectionInfoDialog, RemovePasswordHdl, PushButton*, EMPTYARG )
{
try
{
SvLBoxEntry* pEntry = m_aPasswordsLB.GetCurEntry();
if ( pEntry )
{
::rtl::OUString aURL = m_aPasswordsLB.GetEntryText( pEntry, 0 );
::rtl::OUString aUserName = m_aPasswordsLB.GetEntryText( pEntry, 1 );
uno::Reference< task::XPasswordContainer > xPasswdContainer(
comphelper::getProcessServiceFactory()->createInstance(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.task.PasswordContainer" ) ) ),
uno::UNO_QUERY_THROW );
sal_Int32 nPos = (sal_Int32)(sal_IntPtr)pEntry->GetUserData();
if ( nPos < m_nPos )
{
xPasswdContainer->removePersistent( aURL, aUserName );
}
else
{
uno::Reference< task::XUrlContainer > xUrlContainer(
xPasswdContainer, uno::UNO_QUERY_THROW );
xUrlContainer->removeUrl( aURL );
}
m_aPasswordsLB.RemoveEntry( pEntry );
}
}
catch( uno::Exception& )
{}
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( WebConnectionInfoDialog, RemoveAllPasswordsHdl, PushButton*, EMPTYARG )
{
try
{
uno::Reference< task::XPasswordContainer > xPasswdContainer(
comphelper::getProcessServiceFactory()->createInstance(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.task.PasswordContainer" ) ) ),
uno::UNO_QUERY_THROW );
// should the master password be requested before?
xPasswdContainer->removeAllPersistent();
uno::Reference< task::XUrlContainer > xUrlContainer(
xPasswdContainer, uno::UNO_QUERY_THROW );
uno::Sequence< rtl::OUString > aUrls
= xUrlContainer->getUrls( sal_True /* OnlyPersistent */ );
for ( sal_Int32 nURLIdx = 0; nURLIdx < aUrls.getLength(); nURLIdx++ )
xUrlContainer->removeUrl( aUrls[ nURLIdx ] );
m_aPasswordsLB.Clear();
}
catch( uno::Exception& )
{}
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( WebConnectionInfoDialog, ChangePasswordHdl, PushButton*, EMPTYARG )
{
try
{
SvLBoxEntry* pEntry = m_aPasswordsLB.GetCurEntry();
if ( pEntry )
{
::rtl::OUString aURL = m_aPasswordsLB.GetEntryText( pEntry, 0 );
::rtl::OUString aUserName = m_aPasswordsLB.GetEntryText( pEntry, 1 );
::comphelper::SimplePasswordRequest* pPasswordRequest
= new ::comphelper::SimplePasswordRequest( task::PasswordRequestMode_PASSWORD_CREATE );
uno::Reference< task::XInteractionRequest > rRequest( pPasswordRequest );
uno::Reference< task::XInteractionHandler > xInteractionHandler(
comphelper::getProcessServiceFactory()->createInstance(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.task.InteractionHandler" ) ) ),
uno::UNO_QUERY_THROW );
xInteractionHandler->handle( rRequest );
if ( pPasswordRequest->isPassword() )
{
String aNewPass = pPasswordRequest->getPassword();
uno::Sequence< ::rtl::OUString > aPasswd( 1 );
aPasswd[0] = aNewPass;
uno::Reference< task::XPasswordContainer > xPasswdContainer(
comphelper::getProcessServiceFactory()->createInstance(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.task.PasswordContainer" ) ) ),
uno::UNO_QUERY_THROW );
xPasswdContainer->addPersistent(
aURL, aUserName, aPasswd, xInteractionHandler );
}
}
}
catch( uno::Exception& )
{}
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( WebConnectionInfoDialog, EntrySelectedHdl, void*, EMPTYARG )
{
SvLBoxEntry* pEntry = m_aPasswordsLB.GetCurEntry();
if ( !pEntry )
{
m_aRemoveBtn.Enable( sal_False );
m_aChangeBtn.Enable( sal_False );
}
else
{
m_aRemoveBtn.Enable( sal_True );
// url container entries (-> use system credentials) have
// no password
sal_Int32 nPos = (sal_Int32)(sal_IntPtr)pEntry->GetUserData();
m_aChangeBtn.Enable( nPos < m_nPos );
}
return 0;
}
//........................................................................
} // namespace svx
//........................................................................