20#include <com/sun/star/task/DocumentPasswordRequest.hpp>
21#include <com/sun/star/task/DocumentPasswordRequest2.hpp>
22#include <com/sun/star/task/DocumentMSPasswordRequest.hpp>
23#include <com/sun/star/task/DocumentMSPasswordRequest2.hpp>
24#include <com/sun/star/task/MasterPasswordRequest.hpp>
25#include <com/sun/star/task/XInteractionAbort.hpp>
26#include <com/sun/star/task/XInteractionPassword.hpp>
27#include <com/sun/star/task/XInteractionPassword2.hpp>
28#include <com/sun/star/task/XInteractionRetry.hpp>
29#include <com/sun/star/ucb/XInteractionAuthFallback.hpp>
30#include <com/sun/star/ucb/XInteractionSupplyAuthentication2.hpp>
31#include <com/sun/star/ucb/URLAuthenticationRequest.hpp>
33#include <osl/diagnose.h>
34#include <rtl/digest.h>
35#include <rtl/ustrbuf.hxx>
64 OUString
const & rRealm)
91 aDialog.ClearAccount();
93 aDialog.ClearPassword();
99 aDialog.SetSavePasswordText(
108 if ( bCanUseSysCreds )
111 rInfo.
SetResult(aDialog.run() == RET_OK ? DialogMask::ButtonsOk :
112 DialogMask::ButtonsCancel);
118 if ( bCanUseSysCreds )
122void getRememberModes(
123 uno::Sequence< ucb::RememberAuthentication >
const & rRememberModes,
124 ucb::RememberAuthentication & rPreferredMode,
125 ucb::RememberAuthentication & rAlternateMode )
127 sal_Int32
nCount = rRememberModes.getLength();
128 OSL_ENSURE( (nCount > 0) && (nCount < 4),
129 "ucb::RememberAuthentication sequence size mismatch!" );
132 rPreferredMode = rAlternateMode = rRememberModes[ 0 ];
137 bool bHasRememberModeSession =
false;
138 bool bHasRememberModePersistent =
false;
140 for (
const auto& rRememberMode : rRememberModes)
142 switch ( rRememberMode )
144 case ucb::RememberAuthentication_NO:
146 case ucb::RememberAuthentication_SESSION:
147 bHasRememberModeSession =
true;
149 case ucb::RememberAuthentication_PERSISTENT:
150 bHasRememberModePersistent =
true;
153 SAL_WARN(
"uui",
"Unsupported RememberAuthentication value" <<
static_cast<sal_Int32
>(rRememberMode) );
158 if (bHasRememberModePersistent)
160 rPreferredMode = ucb::RememberAuthentication_PERSISTENT;
161 if (bHasRememberModeSession)
162 rAlternateMode = ucb::RememberAuthentication_SESSION;
164 rAlternateMode = ucb::RememberAuthentication_NO;
168 rPreferredMode = ucb::RememberAuthentication_SESSION;
169 rAlternateMode = ucb::RememberAuthentication_NO;
175handleAuthenticationRequest_(
177 uno::Reference< task::XInteractionHandler2 >
const & xIH,
178 uno::Reference< uno::XComponentContext >
const & xContext,
179 ucb::AuthenticationRequest
const & rRequest,
180 uno::Sequence< uno::Reference< task::XInteractionContinuation > >
const &
182 const OUString & rURL)
184 uno::Reference< task::XInteractionRetry > xRetry;
185 uno::Reference< task::XInteractionAbort > xAbort;
186 uno::Reference< ucb::XInteractionSupplyAuthentication >
187 xSupplyAuthentication;
188 uno::Reference< ucb::XInteractionSupplyAuthentication2 >
189 xSupplyAuthentication2;
191 if (xSupplyAuthentication.is())
192 xSupplyAuthentication2.set(xSupplyAuthentication, uno::UNO_QUERY);
197 if (aPwContainerHelper.handleAuthenticationRequest(rRequest,
198 xSupplyAuthentication,
202 xSupplyAuthentication->select();
208 ucb::RememberAuthentication eDefaultRememberMode
209 = ucb::RememberAuthentication_SESSION;
210 ucb::RememberAuthentication ePreferredRememberMode
211 = eDefaultRememberMode;
212 ucb::RememberAuthentication eAlternateRememberMode
213 = ucb::RememberAuthentication_NO;
215 if (xSupplyAuthentication.is())
218 xSupplyAuthentication->getRememberPasswordModes(
219 eDefaultRememberMode),
220 ePreferredRememberMode,
221 eAlternateRememberMode);
224 bool bCanUseSystemCredentials;
225 sal_Bool bDefaultUseSystemCredentials;
226 if (xSupplyAuthentication2.is())
228 bCanUseSystemCredentials
229 = xSupplyAuthentication2->canUseSystemCredentials(
230 bDefaultUseSystemCredentials);
234 bCanUseSystemCredentials =
false;
235 bDefaultUseSystemCredentials =
false;
240 if (rRequest.HasAccount)
242 if (rRequest.HasUserName)
244 if (rRequest.HasPassword)
249 ePreferredRememberMode != eAlternateRememberMode);
251 ePreferredRememberMode == eDefaultRememberMode);
253 ePreferredRememberMode == ucb::RememberAuthentication_PERSISTENT);
258 && xSupplyAuthentication.is()
259 && xSupplyAuthentication->canSetAccount());
261 && xSupplyAuthentication.is()
262 && xSupplyAuthentication->canSetUserName());
263 executeLoginDialog(pParent,
265 rRequest.HasRealm ? rRequest.Realm : OUString());
268 case DialogMask::ButtonsOk:
269 if (xSupplyAuthentication.is())
271 if (xSupplyAuthentication->canSetUserName())
272 xSupplyAuthentication->setUserName(aInfo.
GetUserName());
273 if (xSupplyAuthentication->canSetPassword())
274 xSupplyAuthentication->setPassword(aInfo.
GetPassword());
276 if (ePreferredRememberMode != eAlternateRememberMode)
280 xSupplyAuthentication->setRememberPassword(
281 ePreferredRememberMode);
283 xSupplyAuthentication->setRememberPassword(
284 eAlternateRememberMode);
289 xSupplyAuthentication->setRememberPassword(
290 ePreferredRememberMode);
293 if (rRequest.HasRealm)
295 if (xSupplyAuthentication->canSetRealm())
296 xSupplyAuthentication->setRealm(aInfo.
GetAccount());
298 else if (xSupplyAuthentication->canSetAccount())
299 xSupplyAuthentication->setAccount(aInfo.
GetAccount());
301 if ( xSupplyAuthentication2.is() && bCanUseSystemCredentials )
302 xSupplyAuthentication2->setUseSystemCredentials(
305 xSupplyAuthentication->select();
315 if (!aPwContainerHelper.addRecord(
316 !rURL.isEmpty() ? rURL : rRequest.ServerName,
318 uno::Sequence< OUString >(),
320 ePreferredRememberMode
321 == ucb::RememberAuthentication_PERSISTENT))
323 xSupplyAuthentication->setRememberPassword(
324 ucb::RememberAuthentication_NO);
327 else if (eAlternateRememberMode
328 == ucb::RememberAuthentication_SESSION)
330 if (!aPwContainerHelper.addRecord(
331 !rURL.isEmpty() ? rURL : rRequest.ServerName,
333 uno::Sequence< OUString >(),
337 xSupplyAuthentication->setRememberPassword(
338 ucb::RememberAuthentication_NO);
345 uno::Sequence< OUString >
346 aPassList(aInfo.
GetAccount().isEmpty() ? 1 : 2);
347 auto pPassList = aPassList.getArray();
354 if (!aPwContainerHelper.addRecord(
355 !rURL.isEmpty() ? rURL : rRequest.ServerName,
359 ePreferredRememberMode
360 == ucb::RememberAuthentication_PERSISTENT))
362 xSupplyAuthentication->setRememberPassword(
363 ucb::RememberAuthentication_NO);
366 else if (eAlternateRememberMode
367 == ucb::RememberAuthentication_SESSION)
369 if (!aPwContainerHelper.addRecord(
370 !rURL.isEmpty() ? rURL : rRequest.ServerName,
376 xSupplyAuthentication->setRememberPassword(
377 ucb::RememberAuthentication_NO);
383 case DialogMask::ButtonsRetry:
396executeMasterPasswordDialog(
399 task::PasswordRequestMode nMode)
406 if( nMode == task::PasswordRequestMode_PASSWORD_CREATE )
410 == RET_OK ? DialogMask::ButtonsOk : DialogMask::ButtonsCancel);
412 aDialog.GetMasterPassword(), RTL_TEXTENCODING_UTF8);
418 == RET_OK ? DialogMask::ButtonsOk : DialogMask::ButtonsCancel);
420 aDialog.GetMasterPassword(), RTL_TEXTENCODING_UTF8);
428 rtl_digest_PBKDF2(aKey,
429 RTL_DIGEST_LENGTH_MD5,
430 reinterpret_cast< sal_uInt8 const *
>(aMaster.getStr()),
433 "3B5509ABA6BC42D9A3A1F3DAD49E56A51"),
441 aBuffer.append(OUString::number(i >> 4, 16) + OUString::number(i & 15, 16));
447handleMasterPasswordRequest_(
449 task::PasswordRequestMode nMode,
450 uno::Sequence< uno::Reference< task::XInteractionContinuation > >
const &
453 uno::Reference< task::XInteractionRetry > xRetry;
454 uno::Reference< task::XInteractionAbort > xAbort;
455 uno::Reference< ucb::XInteractionSupplyAuthentication >
456 xSupplyAuthentication;
461 executeMasterPasswordDialog(pParent, aInfo, nMode);
465 case DialogMask::ButtonsOk:
466 if (xSupplyAuthentication.is())
468 if (xSupplyAuthentication->canSetPassword())
469 xSupplyAuthentication->setPassword(aInfo.
GetPassword());
470 xSupplyAuthentication->select();
474 case DialogMask::ButtonsRetry:
487executePasswordDialog(
490 task::PasswordRequestMode nMode,
491 const OUString& aDocName,
492 sal_uInt16 nMaxPasswordLen,
493 bool bIsPasswordToModify,
494 bool bIsSimplePasswordRequest )
499 if( nMode == task::PasswordRequestMode_PASSWORD_CREATE )
501 if (bIsSimplePasswordRequest)
503 std::unique_ptr<PasswordDialog> xDialog(
new PasswordDialog(pParent, nMode,
504 aResLocale, aDocName, bIsPasswordToModify, bIsSimplePasswordRequest));
505 xDialog->SetMinLen(0);
507 rInfo.
SetResult(xDialog->run() == RET_OK ? DialogMask::ButtonsOk : DialogMask::ButtonsCancel);
516 rInfo.
SetResult( pDialog->Execute() == RET_OK ? DialogMask::ButtonsOk : DialogMask::ButtonsCancel );
524 std::unique_ptr<PasswordDialog> xDialog(
new PasswordDialog(pParent, nMode,
525 aResLocale, aDocName, bIsPasswordToModify, bIsSimplePasswordRequest));
526 xDialog->SetMinLen(0);
528 rInfo.
SetResult(xDialog->run() == RET_OK ? DialogMask::ButtonsOk : DialogMask::ButtonsCancel);
529 rInfo.
SetPassword(bIsPasswordToModify ? OUString() : xDialog->GetPassword());
535handlePasswordRequest_(
537 task::PasswordRequestMode nMode,
538 uno::Sequence< uno::Reference< task::XInteractionContinuation > >
const &
540 const OUString& aDocumentName,
541 sal_uInt16 nMaxPasswordLen,
542 bool bIsPasswordToModify,
543 bool bIsSimplePasswordRequest =
false )
545 uno::Reference< task::XInteractionRetry > xRetry;
546 uno::Reference< task::XInteractionAbort > xAbort;
547 uno::Reference< task::XInteractionPassword > xPassword;
548 uno::Reference< task::XInteractionPassword2 > xPassword2;
549 getContinuations(rContinuations, &xRetry, &xAbort, &xPassword2, &xPassword);
551 if ( xPassword2.is() && !xPassword.is() )
552 xPassword.set( xPassword2, uno::UNO_QUERY_THROW );
556 executePasswordDialog( pParent, aInfo, nMode,
557 aDocumentName, nMaxPasswordLen, bIsPasswordToModify, bIsSimplePasswordRequest );
561 case DialogMask::ButtonsOk:
562 OSL_ENSURE( !bIsPasswordToModify || xPassword2.is(),
"PasswordToModify is requested, but there is no Interaction!" );
576 case DialogMask::ButtonsRetry:
592 uno::Reference< task::XInteractionRequest >
const & rRequest)
594 uno::Any aAnyRequest(rRequest->getRequest());
597 ucb::URLAuthenticationRequest aURLAuthenticationRequest;
598 if (aAnyRequest >>= aURLAuthenticationRequest)
603 aURLAuthenticationRequest,
604 rRequest->getContinuations(),
605 aURLAuthenticationRequest.URL);
609 ucb::AuthenticationRequest aAuthenticationRequest;
610 if (aAnyRequest >>= aAuthenticationRequest)
615 aAuthenticationRequest,
616 rRequest->getContinuations(),
625 uno::Reference< task::XInteractionRequest >
const & rRequest)
627 uno::Any aAnyRequest(rRequest->getRequest());
629 task::MasterPasswordRequest aMasterPasswordRequest;
630 if (aAnyRequest >>= aMasterPasswordRequest)
635 aMasterPasswordRequest.Mode,
636 rRequest->getContinuations());
644 uno::Reference< task::XInteractionRequest >
const & rRequest)
648 task::PasswordRequestMode nMode = task::PasswordRequestMode_PASSWORD_ENTER;
649 uno::Sequence< uno::Reference< task::XInteractionContinuation > >
const & rContinuations = rRequest->getContinuations();
650 OUString aDocumentName;
651 sal_uInt16 nMaxPasswordLen = 0;
652 bool bIsPasswordToModify =
false;
654 bool bDoHandleRequest =
false;
656 uno::Any aAnyRequest(rRequest->getRequest());
660 task::DocumentPasswordRequest2 aDocumentPasswordRequest2;
661 if (aAnyRequest >>= aDocumentPasswordRequest2)
663 nMode = aDocumentPasswordRequest2.Mode;
664 aDocumentName = aDocumentPasswordRequest2.Name;
665 bIsPasswordToModify = aDocumentPasswordRequest2.IsRequestPasswordToModify;
667 bDoHandleRequest =
true;
671 task::DocumentPasswordRequest aDocumentPasswordRequest;
672 if (aAnyRequest >>= aDocumentPasswordRequest)
674 nMode = aDocumentPasswordRequest.Mode;
675 aDocumentName = aDocumentPasswordRequest.Name;
677 bDoHandleRequest =
true;
681 task::DocumentMSPasswordRequest2 aDocumentMSPasswordRequest2;
682 if (aAnyRequest >>= aDocumentMSPasswordRequest2)
684 nMode = aDocumentMSPasswordRequest2.Mode;
685 aDocumentName = aDocumentMSPasswordRequest2.Name;
686 nMaxPasswordLen = 15;
687 bIsPasswordToModify = aDocumentMSPasswordRequest2.IsRequestPasswordToModify;
689 bDoHandleRequest =
true;
693 task::DocumentMSPasswordRequest aDocumentMSPasswordRequest;
694 if (aAnyRequest >>= aDocumentMSPasswordRequest)
696 nMode = aDocumentMSPasswordRequest.Mode;
697 aDocumentName = aDocumentMSPasswordRequest.Name;
698 nMaxPasswordLen = 15;
700 bDoHandleRequest =
true;
706 if (bDoHandleRequest)
709 aDocumentName, nMaxPasswordLen, bIsPasswordToModify );
713 task::PasswordRequest aPasswordRequest;
714 if( aAnyRequest >>= aPasswordRequest )
717 aPasswordRequest.Mode,
718 rRequest->getContinuations(),
731 const OUString & url,
732 uno::Sequence< uno::Reference< task::XInteractionContinuation > >
const & rContinuations )
736 int retCode = dlg.
run();
737 uno::Reference< task::XInteractionAbort > xAbort;
738 uno::Reference< ucb::XInteractionAuthFallback > xAuthFallback;
741 if( retCode ==
RET_OK && xAuthFallback.is( ) )
743 xAuthFallback->setCode(dlg.
GetCode());
744 xAuthFallback->select( );
static weld::Window * GetFrameWeld(const css::uno::Reference< css::awt::XWindow > &rWindow)
void SetErrorText(const OUString &aErrorText)
void SetCanUseSystemCredentials(bool bSet)
const OUString & GetUserName() const
void SetModifyUserName(bool bSet)
void SetRecommendToOpenReadonly(bool bVal)
const OUString & GetAccount() const
void SetPasswordToModify(const OUString &aPassword)
bool GetCanUseSystemCredentials() const
void SetIsRememberPersistent(bool bSet)
void SetUserName(const OUString &aUserName)
sal_uInt8 GetFlags() const
bool GetIsRememberPersistent() const
void SetIsRememberPassword(bool bSet)
void SetPassword(const OUString &aPassword)
void SetIsUseSystemCredentials(bool bSet)
DialogMask GetResult() const
bool GetCanRememberPassword() const
const OUString & GetErrorText() const
bool IsRecommendToOpenReadonly() const
bool GetIsUseSystemCredentials() const
const OUString & GetPasswordToModify() const
const OUString & GetServer() const
void SetAccount(const OUString &aAccount)
void SetCanRememberPassword(bool bSet)
const OUString & GetPassword() const
void SetServer(const OUString &aServer)
bool GetIsRememberPassword() const
void SetResult(DialogMask nRet)
void SetModifyAccount(bool bSet)
bool handlePasswordRequest(css::uno::Reference< css::task::XInteractionRequest > const &rRequest)
bool handleAuthenticationRequest(css::uno::Reference< css::task::XInteractionRequest > const &rRequest)
css::uno::Reference< css::task::XInteractionHandler2 > getInteractionHandler() const
css::uno::Reference< css::uno::XComponentContext > m_xContext
bool handleMasterPasswordRequest(css::uno::Reference< css::task::XInteractionRequest > const &rRequest)
void handleAuthFallbackRequest(const OUString &instructions, const OUString &url, css::uno::Sequence< css::uno::Reference< css::task::XInteractionContinuation > > const &rContinuations)
const css::uno::Reference< css::awt::XWindow > & getParentXWindow() const
virtual VclPtr< AbstractPasswordToOpenModifyDialog > CreatePasswordToOpenModifyDialog(weld::Window *pParent, sal_uInt16 nMaxPasswdLen, bool bIsPasswordToModify)=0
static VclAbstractDialogFactory * Create()
Passwordcontainer UNO service (com.sun.star.task.PasswordContainer) helper.
void getContinuations(css::uno::Sequence< css::uno::Reference< css::task::XInteractionContinuation > > const &rContinuations, css::uno::Reference< t1 > *pContinuation1, css::uno::Reference< t2 > *pContinuation2)
#define SAL_WARN(area, stream)
#define LOGINERROR_FLAG_MODIFY_USER_NAME
#define LOGINERROR_FLAG_MODIFY_ACCOUNT
std::locale Create(std::string_view aPrefixName, const LanguageTag &rLocale)
OUString get(TranslateId sContextAndId, const std::locale &loc)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
std::unique_ptr< char[]> aBuffer