xref: /trunk/main/uui/source/iahndl-authentication.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*859212d1SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*859212d1SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*859212d1SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*859212d1SAndrew Rist  * distributed with this work for additional information
6*859212d1SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*859212d1SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*859212d1SAndrew Rist  * "License"); you may not use this file except in compliance
9*859212d1SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*859212d1SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*859212d1SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*859212d1SAndrew Rist  * software distributed under the License is distributed on an
15*859212d1SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*859212d1SAndrew Rist  * KIND, either express or implied.  See the License for the
17*859212d1SAndrew Rist  * specific language governing permissions and limitations
18*859212d1SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*859212d1SAndrew Rist  *************************************************************/
21*859212d1SAndrew Rist 
22*859212d1SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "com/sun/star/task/DocumentPasswordRequest.hpp"
25cdf0e10cSrcweir #include "com/sun/star/task/DocumentPasswordRequest2.hpp"
26cdf0e10cSrcweir #include "com/sun/star/task/DocumentMSPasswordRequest.hpp"
27cdf0e10cSrcweir #include "com/sun/star/task/DocumentMSPasswordRequest2.hpp"
28cdf0e10cSrcweir #include "com/sun/star/task/MasterPasswordRequest.hpp"
29cdf0e10cSrcweir #include "com/sun/star/task/XInteractionAbort.hpp"
30cdf0e10cSrcweir #include "com/sun/star/task/XInteractionPassword.hpp"
31cdf0e10cSrcweir #include "com/sun/star/task/XInteractionPassword2.hpp"
32cdf0e10cSrcweir #include "com/sun/star/task/XInteractionRetry.hpp"
33cdf0e10cSrcweir #include "com/sun/star/ucb/XInteractionSupplyAuthentication2.hpp"
34cdf0e10cSrcweir #include "com/sun/star/ucb/URLAuthenticationRequest.hpp"
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include "osl/diagnose.h"
37cdf0e10cSrcweir #include "rtl/digest.h"
38cdf0e10cSrcweir #include "vos/mutex.hxx"
39cdf0e10cSrcweir #include "tools/errcode.hxx"
40cdf0e10cSrcweir #include "vcl/msgbox.hxx"
41cdf0e10cSrcweir #include "vcl/abstdlg.hxx"
42cdf0e10cSrcweir #include "vcl/svapp.hxx"
43cdf0e10cSrcweir 
44cdf0e10cSrcweir #include "ids.hrc"
45cdf0e10cSrcweir #include "getcontinuations.hxx"
46cdf0e10cSrcweir #include "passwordcontainer.hxx"
47cdf0e10cSrcweir #include "loginerr.hxx"
48cdf0e10cSrcweir #include "logindlg.hxx"
49cdf0e10cSrcweir #include "masterpasscrtdlg.hxx"
50cdf0e10cSrcweir #include "masterpassworddlg.hxx"
51cdf0e10cSrcweir #include "passworddlg.hxx"
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #include "iahndl.hxx"
54cdf0e10cSrcweir 
55cdf0e10cSrcweir using namespace com::sun::star;
56cdf0e10cSrcweir 
57cdf0e10cSrcweir namespace {
58cdf0e10cSrcweir 
59cdf0e10cSrcweir void
executeLoginDialog(Window * pParent,LoginErrorInfo & rInfo,rtl::OUString const & rRealm)60cdf0e10cSrcweir executeLoginDialog(
61cdf0e10cSrcweir     Window * pParent,
62cdf0e10cSrcweir     LoginErrorInfo & rInfo,
63cdf0e10cSrcweir     rtl::OUString const & rRealm)
64cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
65cdf0e10cSrcweir {
66cdf0e10cSrcweir     try
67cdf0e10cSrcweir     {
68cdf0e10cSrcweir         vos::OGuard aGuard(Application::GetSolarMutex());
69cdf0e10cSrcweir 
70cdf0e10cSrcweir         bool bAccount = (rInfo.GetFlags() & LOGINERROR_FLAG_MODIFY_ACCOUNT) != 0;
71cdf0e10cSrcweir         bool bSavePassword   = rInfo.GetCanRememberPassword();
72cdf0e10cSrcweir         bool bCanUseSysCreds = rInfo.GetCanUseSystemCredentials();
73cdf0e10cSrcweir 
74cdf0e10cSrcweir         sal_uInt16 nFlags = 0;
75cdf0e10cSrcweir         if (rInfo.GetPath().Len() == 0)
76cdf0e10cSrcweir             nFlags |= LF_NO_PATH;
77cdf0e10cSrcweir         if (rInfo.GetErrorText().Len() == 0)
78cdf0e10cSrcweir             nFlags |= LF_NO_ERRORTEXT;
79cdf0e10cSrcweir         if (!bAccount)
80cdf0e10cSrcweir             nFlags |= LF_NO_ACCOUNT;
81cdf0e10cSrcweir         if (!(rInfo.GetFlags() & LOGINERROR_FLAG_MODIFY_USER_NAME))
82cdf0e10cSrcweir             nFlags |= LF_USERNAME_READONLY;
83cdf0e10cSrcweir 
84cdf0e10cSrcweir         if (!bSavePassword)
85cdf0e10cSrcweir             nFlags |= LF_NO_SAVEPASSWORD;
86cdf0e10cSrcweir 
87cdf0e10cSrcweir         if (!bCanUseSysCreds)
88cdf0e10cSrcweir             nFlags |= LF_NO_USESYSCREDS;
89cdf0e10cSrcweir 
90cdf0e10cSrcweir         std::auto_ptr< ResMgr > xManager( ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui)));
91cdf0e10cSrcweir         UniString aRealm(rRealm);
92cdf0e10cSrcweir         std::auto_ptr< LoginDialog > xDialog(
93cdf0e10cSrcweir                 new LoginDialog( pParent, nFlags, rInfo.GetServer(), &aRealm, xManager.get()));
94cdf0e10cSrcweir         if (rInfo.GetErrorText().Len() != 0)
95cdf0e10cSrcweir             xDialog->SetErrorText(rInfo.GetErrorText());
96cdf0e10cSrcweir         xDialog->SetName(rInfo.GetUserName());
97cdf0e10cSrcweir         if (bAccount)
98cdf0e10cSrcweir             xDialog->ClearAccount();
99cdf0e10cSrcweir         else
100cdf0e10cSrcweir             xDialog->ClearPassword();
101cdf0e10cSrcweir         xDialog->SetPassword(rInfo.GetPassword());
102cdf0e10cSrcweir 
103cdf0e10cSrcweir         if (bSavePassword)
104cdf0e10cSrcweir         {
105cdf0e10cSrcweir             xDialog->SetSavePasswordText(
106cdf0e10cSrcweir                 ResId(rInfo.GetIsRememberPersistent()
107cdf0e10cSrcweir                           ? RID_SAVE_PASSWORD
108cdf0e10cSrcweir                           : RID_KEEP_PASSWORD,
109cdf0e10cSrcweir                       *xManager.get()));
110cdf0e10cSrcweir 
111cdf0e10cSrcweir             xDialog->SetSavePassword(rInfo.GetIsRememberPassword());
112cdf0e10cSrcweir         }
113cdf0e10cSrcweir 
114cdf0e10cSrcweir         if ( bCanUseSysCreds )
115cdf0e10cSrcweir             xDialog->SetUseSystemCredentials( rInfo.GetIsUseSystemCredentials() );
116cdf0e10cSrcweir 
117cdf0e10cSrcweir         rInfo.SetResult(xDialog->Execute() == RET_OK ? ERRCODE_BUTTON_OK :
118cdf0e10cSrcweir                                                        ERRCODE_BUTTON_CANCEL);
119cdf0e10cSrcweir         rInfo.SetUserName(xDialog->GetName());
120cdf0e10cSrcweir         rInfo.SetPassword(xDialog->GetPassword());
121cdf0e10cSrcweir         rInfo.SetAccount(xDialog->GetAccount());
122cdf0e10cSrcweir         rInfo.SetIsRememberPassword(xDialog->IsSavePassword());
123cdf0e10cSrcweir 
124cdf0e10cSrcweir         if ( bCanUseSysCreds )
125cdf0e10cSrcweir           rInfo.SetIsUseSystemCredentials( xDialog->IsUseSystemCredentials() );
126cdf0e10cSrcweir     }
127cdf0e10cSrcweir     catch (std::bad_alloc const &)
128cdf0e10cSrcweir     {
129cdf0e10cSrcweir         throw uno::RuntimeException(
130cdf0e10cSrcweir                   rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")),
131cdf0e10cSrcweir                   uno::Reference< uno::XInterface >());
132cdf0e10cSrcweir     }
133cdf0e10cSrcweir }
134cdf0e10cSrcweir 
getRememberModes(uno::Sequence<ucb::RememberAuthentication> const & rRememberModes,ucb::RememberAuthentication & rPreferredMode,ucb::RememberAuthentication & rAlternateMode)135cdf0e10cSrcweir void getRememberModes(
136cdf0e10cSrcweir     uno::Sequence< ucb::RememberAuthentication > const & rRememberModes,
137cdf0e10cSrcweir     ucb::RememberAuthentication & rPreferredMode,
138cdf0e10cSrcweir     ucb::RememberAuthentication & rAlternateMode )
139cdf0e10cSrcweir {
140cdf0e10cSrcweir     sal_Int32 nCount = rRememberModes.getLength();
141cdf0e10cSrcweir     OSL_ENSURE( (nCount > 0) && (nCount < 4),
142cdf0e10cSrcweir                 "ucb::RememberAuthentication sequence size mismatch!" );
143cdf0e10cSrcweir     if ( nCount == 1 )
144cdf0e10cSrcweir     {
145cdf0e10cSrcweir         rPreferredMode = rAlternateMode = rRememberModes[ 0 ];
146cdf0e10cSrcweir         return;
147cdf0e10cSrcweir     }
148cdf0e10cSrcweir     else
149cdf0e10cSrcweir     {
150cdf0e10cSrcweir         //bool bHasRememberModeNo = false;
151cdf0e10cSrcweir         bool bHasRememberModeSession = false;
152cdf0e10cSrcweir         bool bHasRememberModePersistent = false;
153cdf0e10cSrcweir 
154cdf0e10cSrcweir         for (sal_Int32 i = 0; i < nCount; ++i)
155cdf0e10cSrcweir         {
156cdf0e10cSrcweir             switch ( rRememberModes[i] )
157cdf0e10cSrcweir             {
158cdf0e10cSrcweir             case ucb::RememberAuthentication_NO:
159cdf0e10cSrcweir                 //bHasRememberModeNo = true;
160cdf0e10cSrcweir                 break;
161cdf0e10cSrcweir             case ucb::RememberAuthentication_SESSION:
162cdf0e10cSrcweir                 bHasRememberModeSession = true;
163cdf0e10cSrcweir                 break;
164cdf0e10cSrcweir             case ucb::RememberAuthentication_PERSISTENT:
165cdf0e10cSrcweir                 bHasRememberModePersistent = true;
166cdf0e10cSrcweir                 break;
167cdf0e10cSrcweir             default:
168cdf0e10cSrcweir                 OSL_TRACE( "Unsupported RememberAuthentication value" );
169cdf0e10cSrcweir                 break;
170cdf0e10cSrcweir             }
171cdf0e10cSrcweir         }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir         if (bHasRememberModePersistent)
174cdf0e10cSrcweir         {
175cdf0e10cSrcweir             rPreferredMode = ucb::RememberAuthentication_PERSISTENT;
176cdf0e10cSrcweir             if (bHasRememberModeSession)
177cdf0e10cSrcweir                 rAlternateMode = ucb::RememberAuthentication_SESSION;
178cdf0e10cSrcweir             else
179cdf0e10cSrcweir                 rAlternateMode = ucb::RememberAuthentication_NO;
180cdf0e10cSrcweir         }
181cdf0e10cSrcweir         else
182cdf0e10cSrcweir         {
183cdf0e10cSrcweir             rPreferredMode = ucb::RememberAuthentication_SESSION;
184cdf0e10cSrcweir             rAlternateMode = ucb::RememberAuthentication_NO;
185cdf0e10cSrcweir         }
186cdf0e10cSrcweir     }
187cdf0e10cSrcweir }
188cdf0e10cSrcweir 
189cdf0e10cSrcweir void
handleAuthenticationRequest_(Window * pParent,uno::Reference<task::XInteractionHandler> const & xIH,uno::Reference<lang::XMultiServiceFactory> const & xServiceFactory,ucb::AuthenticationRequest const & rRequest,uno::Sequence<uno::Reference<task::XInteractionContinuation>> const & rContinuations,const rtl::OUString & rURL)190cdf0e10cSrcweir handleAuthenticationRequest_(
191cdf0e10cSrcweir     Window * pParent,
192cdf0e10cSrcweir     uno::Reference< task::XInteractionHandler > const & xIH,
193cdf0e10cSrcweir     uno::Reference< lang::XMultiServiceFactory > const & xServiceFactory,
194cdf0e10cSrcweir     ucb::AuthenticationRequest const & rRequest,
195cdf0e10cSrcweir     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
196cdf0e10cSrcweir         rContinuations,
197cdf0e10cSrcweir     const rtl::OUString & rURL)
198cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
199cdf0e10cSrcweir {
200cdf0e10cSrcweir     uno::Reference< task::XInteractionRetry > xRetry;
201cdf0e10cSrcweir     uno::Reference< task::XInteractionAbort > xAbort;
202cdf0e10cSrcweir     uno::Reference< ucb::XInteractionSupplyAuthentication >
203cdf0e10cSrcweir         xSupplyAuthentication;
204cdf0e10cSrcweir     uno::Reference< ucb::XInteractionSupplyAuthentication2 >
205cdf0e10cSrcweir         xSupplyAuthentication2;
206cdf0e10cSrcweir     getContinuations(rContinuations, &xRetry, &xAbort, &xSupplyAuthentication);
207cdf0e10cSrcweir     if (xSupplyAuthentication.is())
208cdf0e10cSrcweir         xSupplyAuthentication2.set(xSupplyAuthentication, uno::UNO_QUERY);
209cdf0e10cSrcweir 
210cdf0e10cSrcweir     //////////////////////////
211cdf0e10cSrcweir     // First, try to obtain credentials from password container service.
212cdf0e10cSrcweir     uui::PasswordContainerHelper aPwContainerHelper(xServiceFactory);
213cdf0e10cSrcweir     if (aPwContainerHelper.handleAuthenticationRequest(rRequest,
214cdf0e10cSrcweir                                                        xSupplyAuthentication,
215cdf0e10cSrcweir                                                        rURL,
216cdf0e10cSrcweir                                                        xIH))
217cdf0e10cSrcweir     {
218cdf0e10cSrcweir         xSupplyAuthentication->select();
219cdf0e10cSrcweir         return;
220cdf0e10cSrcweir     }
221cdf0e10cSrcweir 
222cdf0e10cSrcweir     //////////////////////////
223cdf0e10cSrcweir     // Second, try to obtain credentials from user via password dialog.
224cdf0e10cSrcweir     ucb::RememberAuthentication eDefaultRememberMode
225cdf0e10cSrcweir         = ucb::RememberAuthentication_SESSION;
226cdf0e10cSrcweir     ucb::RememberAuthentication ePreferredRememberMode
227cdf0e10cSrcweir         = eDefaultRememberMode;
228cdf0e10cSrcweir     ucb::RememberAuthentication eAlternateRememberMode
229cdf0e10cSrcweir         = ucb::RememberAuthentication_NO;
230cdf0e10cSrcweir 
231cdf0e10cSrcweir     if (xSupplyAuthentication.is())
232cdf0e10cSrcweir     {
233cdf0e10cSrcweir         getRememberModes(
234cdf0e10cSrcweir             xSupplyAuthentication->getRememberPasswordModes(
235cdf0e10cSrcweir                 eDefaultRememberMode),
236cdf0e10cSrcweir             ePreferredRememberMode,
237cdf0e10cSrcweir             eAlternateRememberMode);
238cdf0e10cSrcweir     }
239cdf0e10cSrcweir 
240cdf0e10cSrcweir     sal_Bool bCanUseSystemCredentials;
241cdf0e10cSrcweir     sal_Bool bDefaultUseSystemCredentials;
242cdf0e10cSrcweir     if (xSupplyAuthentication2.is())
243cdf0e10cSrcweir     {
244cdf0e10cSrcweir         bCanUseSystemCredentials
245cdf0e10cSrcweir             = xSupplyAuthentication2->canUseSystemCredentials(
246cdf0e10cSrcweir                 bDefaultUseSystemCredentials);
247cdf0e10cSrcweir     }
248cdf0e10cSrcweir     else
249cdf0e10cSrcweir     {
250cdf0e10cSrcweir         bCanUseSystemCredentials = sal_False;
251cdf0e10cSrcweir         bDefaultUseSystemCredentials = sal_False;
252cdf0e10cSrcweir     }
253cdf0e10cSrcweir 
254cdf0e10cSrcweir     LoginErrorInfo aInfo;
255cdf0e10cSrcweir     aInfo.SetTitle(rRequest.ServerName);
256cdf0e10cSrcweir     aInfo.SetServer(rRequest.ServerName);
257cdf0e10cSrcweir     if (rRequest.HasAccount)
258cdf0e10cSrcweir         aInfo.SetAccount(rRequest.Account);
259cdf0e10cSrcweir     if (rRequest.HasUserName)
260cdf0e10cSrcweir         aInfo.SetUserName(rRequest.UserName);
261cdf0e10cSrcweir     if (rRequest.HasPassword)
262cdf0e10cSrcweir         aInfo.SetPassword(rRequest.Password);
263cdf0e10cSrcweir     aInfo.SetErrorText(rRequest.Diagnostic);
264cdf0e10cSrcweir 
265cdf0e10cSrcweir     aInfo.SetCanRememberPassword(
266cdf0e10cSrcweir         ePreferredRememberMode != eAlternateRememberMode);
267cdf0e10cSrcweir     aInfo.SetIsRememberPassword(
268cdf0e10cSrcweir         ePreferredRememberMode == eDefaultRememberMode);
269cdf0e10cSrcweir     aInfo.SetIsRememberPersistent(
270cdf0e10cSrcweir         ePreferredRememberMode == ucb::RememberAuthentication_PERSISTENT);
271cdf0e10cSrcweir 
272cdf0e10cSrcweir     aInfo.SetCanUseSystemCredentials(bCanUseSystemCredentials);
273cdf0e10cSrcweir     aInfo.SetIsUseSystemCredentials( bDefaultUseSystemCredentials );
274cdf0e10cSrcweir     aInfo.SetModifyAccount(rRequest.HasAccount
275cdf0e10cSrcweir                            && xSupplyAuthentication.is()
276cdf0e10cSrcweir                            && xSupplyAuthentication->canSetAccount());
277cdf0e10cSrcweir     aInfo.SetModifyUserName(rRequest.HasUserName
278cdf0e10cSrcweir                             && xSupplyAuthentication.is()
279cdf0e10cSrcweir                             && xSupplyAuthentication->canSetUserName());
280cdf0e10cSrcweir     executeLoginDialog(pParent,
281cdf0e10cSrcweir                        aInfo,
282cdf0e10cSrcweir                        rRequest.HasRealm ? rRequest.Realm : rtl::OUString());
283cdf0e10cSrcweir     switch (aInfo.GetResult())
284cdf0e10cSrcweir     {
285cdf0e10cSrcweir     case ERRCODE_BUTTON_OK:
286cdf0e10cSrcweir         if (xSupplyAuthentication.is())
287cdf0e10cSrcweir         {
288cdf0e10cSrcweir             if (xSupplyAuthentication->canSetUserName())
289cdf0e10cSrcweir                 xSupplyAuthentication->setUserName(aInfo.GetUserName());
290cdf0e10cSrcweir             if (xSupplyAuthentication->canSetPassword())
291cdf0e10cSrcweir                 xSupplyAuthentication->setPassword(aInfo.GetPassword());
292cdf0e10cSrcweir 
293cdf0e10cSrcweir             if (ePreferredRememberMode != eAlternateRememberMode)
294cdf0e10cSrcweir             {
295cdf0e10cSrcweir                 // user had te choice.
296cdf0e10cSrcweir                 if (aInfo.GetIsRememberPassword())
297cdf0e10cSrcweir                     xSupplyAuthentication->setRememberPassword(
298cdf0e10cSrcweir                         ePreferredRememberMode);
299cdf0e10cSrcweir                 else
300cdf0e10cSrcweir                     xSupplyAuthentication->setRememberPassword(
301cdf0e10cSrcweir                         eAlternateRememberMode);
302cdf0e10cSrcweir             }
303cdf0e10cSrcweir             else
304cdf0e10cSrcweir             {
305cdf0e10cSrcweir                 // user had no choice.
306cdf0e10cSrcweir                 xSupplyAuthentication->setRememberPassword(
307cdf0e10cSrcweir                     ePreferredRememberMode);
308cdf0e10cSrcweir             }
309cdf0e10cSrcweir 
310cdf0e10cSrcweir             if (rRequest.HasRealm)
311cdf0e10cSrcweir             {
312cdf0e10cSrcweir                 if (xSupplyAuthentication->canSetRealm())
313cdf0e10cSrcweir                     xSupplyAuthentication->setRealm(aInfo.GetAccount());
314cdf0e10cSrcweir             }
315cdf0e10cSrcweir             else if (xSupplyAuthentication->canSetAccount())
316cdf0e10cSrcweir                 xSupplyAuthentication->setAccount(aInfo.GetAccount());
317cdf0e10cSrcweir 
318cdf0e10cSrcweir             if ( xSupplyAuthentication2.is() && bCanUseSystemCredentials )
319cdf0e10cSrcweir                 xSupplyAuthentication2->setUseSystemCredentials(
320cdf0e10cSrcweir                     aInfo.GetIsUseSystemCredentials() );
321cdf0e10cSrcweir 
322cdf0e10cSrcweir             xSupplyAuthentication->select();
323cdf0e10cSrcweir         }
324cdf0e10cSrcweir 
325cdf0e10cSrcweir         //////////////////////////
326cdf0e10cSrcweir         // Third, store credentials in password container.
327cdf0e10cSrcweir 
328cdf0e10cSrcweir           if ( aInfo.GetIsUseSystemCredentials() )
329cdf0e10cSrcweir           {
330cdf0e10cSrcweir               if (aInfo.GetIsRememberPassword())
331cdf0e10cSrcweir               {
332cdf0e10cSrcweir                   if (!aPwContainerHelper.addRecord(
333cdf0e10cSrcweir                           rURL.getLength() ? rURL : rRequest.ServerName,
334cdf0e10cSrcweir                           rtl::OUString(), // empty u/p -> sys creds
335cdf0e10cSrcweir                           uno::Sequence< rtl::OUString >(),
336cdf0e10cSrcweir                           xIH,
337cdf0e10cSrcweir                           ePreferredRememberMode
338cdf0e10cSrcweir                               == ucb::RememberAuthentication_PERSISTENT))
339cdf0e10cSrcweir                   {
340cdf0e10cSrcweir                       xSupplyAuthentication->setRememberPassword(
341cdf0e10cSrcweir                           ucb::RememberAuthentication_NO);
342cdf0e10cSrcweir                   }
343cdf0e10cSrcweir               }
344cdf0e10cSrcweir               else if (eAlternateRememberMode
345cdf0e10cSrcweir                            == ucb::RememberAuthentication_SESSION)
346cdf0e10cSrcweir               {
347cdf0e10cSrcweir                   if (!aPwContainerHelper.addRecord(
348cdf0e10cSrcweir                           rURL.getLength() ? rURL : rRequest.ServerName,
349cdf0e10cSrcweir                           rtl::OUString(), // empty u/p -> sys creds
350cdf0e10cSrcweir                           uno::Sequence< rtl::OUString >(),
351cdf0e10cSrcweir                           xIH,
352cdf0e10cSrcweir                           false /* SESSION */))
353cdf0e10cSrcweir                   {
354cdf0e10cSrcweir                       xSupplyAuthentication->setRememberPassword(
355cdf0e10cSrcweir                           ucb::RememberAuthentication_NO);
356cdf0e10cSrcweir                   }
357cdf0e10cSrcweir               }
358cdf0e10cSrcweir           }
359cdf0e10cSrcweir           // Empty user name can not be valid:
360cdf0e10cSrcweir           else if (aInfo.GetUserName().Len() != 0)
361cdf0e10cSrcweir           {
362cdf0e10cSrcweir               uno::Sequence< rtl::OUString >
363cdf0e10cSrcweir                   aPassList(aInfo.GetAccount().Len() == 0 ? 1 : 2);
364cdf0e10cSrcweir               aPassList[0] = aInfo.GetPassword();
365cdf0e10cSrcweir               if (aInfo.GetAccount().Len() != 0)
366cdf0e10cSrcweir                   aPassList[1] = aInfo.GetAccount();
367cdf0e10cSrcweir 
368cdf0e10cSrcweir               if (aInfo.GetIsRememberPassword())
369cdf0e10cSrcweir               {
370cdf0e10cSrcweir                   if (!aPwContainerHelper.addRecord(
371cdf0e10cSrcweir                           rURL.getLength() ? rURL : rRequest.ServerName,
372cdf0e10cSrcweir                           aInfo.GetUserName(),
373cdf0e10cSrcweir                           aPassList,
374cdf0e10cSrcweir                           xIH,
375cdf0e10cSrcweir                           ePreferredRememberMode
376cdf0e10cSrcweir                               == ucb::RememberAuthentication_PERSISTENT))
377cdf0e10cSrcweir                   {
378cdf0e10cSrcweir                       xSupplyAuthentication->setRememberPassword(
379cdf0e10cSrcweir                           ucb::RememberAuthentication_NO);
380cdf0e10cSrcweir                   }
381cdf0e10cSrcweir               }
382cdf0e10cSrcweir               else if (eAlternateRememberMode
383cdf0e10cSrcweir                            == ucb::RememberAuthentication_SESSION)
384cdf0e10cSrcweir               {
385cdf0e10cSrcweir                   if (!aPwContainerHelper.addRecord(
386cdf0e10cSrcweir                           rURL.getLength() ? rURL : rRequest.ServerName,
387cdf0e10cSrcweir                           aInfo.GetUserName(),
388cdf0e10cSrcweir                           aPassList,
389cdf0e10cSrcweir                           xIH,
390cdf0e10cSrcweir                           false /* SESSION */))
391cdf0e10cSrcweir                   {
392cdf0e10cSrcweir                       xSupplyAuthentication->setRememberPassword(
393cdf0e10cSrcweir                           ucb::RememberAuthentication_NO);
394cdf0e10cSrcweir                   }
395cdf0e10cSrcweir               }
396cdf0e10cSrcweir           }
397cdf0e10cSrcweir           break;
398cdf0e10cSrcweir 
399cdf0e10cSrcweir     case ERRCODE_BUTTON_RETRY:
400cdf0e10cSrcweir         if (xRetry.is())
401cdf0e10cSrcweir             xRetry->select();
402cdf0e10cSrcweir         break;
403cdf0e10cSrcweir 
404cdf0e10cSrcweir     default:
405cdf0e10cSrcweir         if (xAbort.is())
406cdf0e10cSrcweir             xAbort->select();
407cdf0e10cSrcweir         break;
408cdf0e10cSrcweir     }
409cdf0e10cSrcweir }
410cdf0e10cSrcweir 
411cdf0e10cSrcweir void
executeMasterPasswordDialog(Window * pParent,LoginErrorInfo & rInfo,task::PasswordRequestMode nMode)412cdf0e10cSrcweir executeMasterPasswordDialog(
413cdf0e10cSrcweir     Window * pParent,
414cdf0e10cSrcweir     LoginErrorInfo & rInfo,
415cdf0e10cSrcweir     task::PasswordRequestMode nMode)
416cdf0e10cSrcweir         SAL_THROW((uno::RuntimeException))
417cdf0e10cSrcweir {
418cdf0e10cSrcweir     rtl::OString aMaster;
419cdf0e10cSrcweir     try
420cdf0e10cSrcweir     {
421cdf0e10cSrcweir         vos::OGuard aGuard(Application::GetSolarMutex());
422cdf0e10cSrcweir 
423cdf0e10cSrcweir         std::auto_ptr< ResMgr > xManager(
424cdf0e10cSrcweir             ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui)));
425cdf0e10cSrcweir         if( nMode == task::PasswordRequestMode_PASSWORD_CREATE )
426cdf0e10cSrcweir         {
427cdf0e10cSrcweir             std::auto_ptr< MasterPasswordCreateDialog > xDialog(
428cdf0e10cSrcweir                 new MasterPasswordCreateDialog(pParent, xManager.get()));
429cdf0e10cSrcweir             rInfo.SetResult(xDialog->Execute()
430cdf0e10cSrcweir                 == RET_OK ? ERRCODE_BUTTON_OK : ERRCODE_BUTTON_CANCEL);
431cdf0e10cSrcweir             aMaster = rtl::OUStringToOString(
432cdf0e10cSrcweir                 xDialog->GetMasterPassword(), RTL_TEXTENCODING_UTF8);
433cdf0e10cSrcweir         }
434cdf0e10cSrcweir         else
435cdf0e10cSrcweir         {
436cdf0e10cSrcweir             std::auto_ptr< MasterPasswordDialog > xDialog(
437cdf0e10cSrcweir                 new MasterPasswordDialog(pParent, nMode, xManager.get()));
438cdf0e10cSrcweir             rInfo.SetResult(xDialog->Execute()
439cdf0e10cSrcweir                 == RET_OK ? ERRCODE_BUTTON_OK : ERRCODE_BUTTON_CANCEL);
440cdf0e10cSrcweir             aMaster = rtl::OUStringToOString(
441cdf0e10cSrcweir                 xDialog->GetMasterPassword(), RTL_TEXTENCODING_UTF8);
442cdf0e10cSrcweir         }
443cdf0e10cSrcweir     }
444cdf0e10cSrcweir     catch (std::bad_alloc const &)
445cdf0e10cSrcweir     {
446cdf0e10cSrcweir         throw uno::RuntimeException(
447cdf0e10cSrcweir                   rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")),
448cdf0e10cSrcweir                   uno::Reference< uno::XInterface >());
449cdf0e10cSrcweir     }
450cdf0e10cSrcweir 
451cdf0e10cSrcweir     sal_uInt8 aKey[RTL_DIGEST_LENGTH_MD5];
452cdf0e10cSrcweir     rtl_digest_PBKDF2(aKey,
453cdf0e10cSrcweir                       RTL_DIGEST_LENGTH_MD5,
454cdf0e10cSrcweir                       reinterpret_cast< sal_uInt8 const * >(aMaster.getStr()),
455cdf0e10cSrcweir                       aMaster.getLength(),
456cdf0e10cSrcweir                       reinterpret_cast< sal_uInt8 const * >(
457cdf0e10cSrcweir                           "3B5509ABA6BC42D9A3A1F3DAD49E56A51"),
458cdf0e10cSrcweir                       32,
459cdf0e10cSrcweir                       1000);
460cdf0e10cSrcweir 
461cdf0e10cSrcweir     rtl::OUStringBuffer aBuffer;
462cdf0e10cSrcweir     for (int i = 0; i < RTL_DIGEST_LENGTH_MD5; ++i)
463cdf0e10cSrcweir     {
464cdf0e10cSrcweir         aBuffer.append(static_cast< sal_Unicode >('a' + (aKey[i] >> 4)));
465cdf0e10cSrcweir         aBuffer.append(static_cast< sal_Unicode >('a' + (aKey[i] & 15)));
466cdf0e10cSrcweir     }
467cdf0e10cSrcweir     rInfo.SetPassword(aBuffer.makeStringAndClear());
468cdf0e10cSrcweir }
469cdf0e10cSrcweir 
470cdf0e10cSrcweir void
handleMasterPasswordRequest_(Window * pParent,task::PasswordRequestMode nMode,uno::Sequence<uno::Reference<task::XInteractionContinuation>> const & rContinuations)471cdf0e10cSrcweir handleMasterPasswordRequest_(
472cdf0e10cSrcweir     Window * pParent,
473cdf0e10cSrcweir     task::PasswordRequestMode nMode,
474cdf0e10cSrcweir     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
475cdf0e10cSrcweir         rContinuations)
476cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
477cdf0e10cSrcweir {
478cdf0e10cSrcweir     uno::Reference< task::XInteractionRetry > xRetry;
479cdf0e10cSrcweir     uno::Reference< task::XInteractionAbort > xAbort;
480cdf0e10cSrcweir     uno::Reference< ucb::XInteractionSupplyAuthentication >
481cdf0e10cSrcweir         xSupplyAuthentication;
482cdf0e10cSrcweir     getContinuations(rContinuations, &xRetry, &xAbort, &xSupplyAuthentication);
483cdf0e10cSrcweir     LoginErrorInfo aInfo;
484cdf0e10cSrcweir 
485cdf0e10cSrcweir     // in case of master password a hash code is returned
486cdf0e10cSrcweir     executeMasterPasswordDialog(pParent, aInfo, nMode);
487cdf0e10cSrcweir 
488cdf0e10cSrcweir     switch (aInfo.GetResult())
489cdf0e10cSrcweir     {
490cdf0e10cSrcweir     case ERRCODE_BUTTON_OK:
491cdf0e10cSrcweir         if (xSupplyAuthentication.is())
492cdf0e10cSrcweir         {
493cdf0e10cSrcweir             if (xSupplyAuthentication->canSetPassword())
494cdf0e10cSrcweir                 xSupplyAuthentication->setPassword(aInfo.GetPassword());
495cdf0e10cSrcweir             xSupplyAuthentication->select();
496cdf0e10cSrcweir         }
497cdf0e10cSrcweir         break;
498cdf0e10cSrcweir 
499cdf0e10cSrcweir     case ERRCODE_BUTTON_RETRY:
500cdf0e10cSrcweir         if (xRetry.is())
501cdf0e10cSrcweir             xRetry->select();
502cdf0e10cSrcweir         break;
503cdf0e10cSrcweir 
504cdf0e10cSrcweir     default:
505cdf0e10cSrcweir         if (xAbort.is())
506cdf0e10cSrcweir             xAbort->select();
507cdf0e10cSrcweir         break;
508cdf0e10cSrcweir     }
509cdf0e10cSrcweir }
510cdf0e10cSrcweir 
511cdf0e10cSrcweir void
executePasswordDialog(Window * pParent,LoginErrorInfo & rInfo,task::PasswordRequestMode nMode,::rtl::OUString aDocName,bool bMSCryptoMode,bool bIsPasswordToModify,bool bIsSimplePasswordRequest)512cdf0e10cSrcweir executePasswordDialog(
513cdf0e10cSrcweir     Window * pParent,
514cdf0e10cSrcweir     LoginErrorInfo & rInfo,
515cdf0e10cSrcweir     task::PasswordRequestMode nMode,
516cdf0e10cSrcweir     ::rtl::OUString aDocName,
517cdf0e10cSrcweir     bool bMSCryptoMode,
518cdf0e10cSrcweir     bool bIsPasswordToModify,
519cdf0e10cSrcweir     bool bIsSimplePasswordRequest )
520cdf0e10cSrcweir        SAL_THROW((uno::RuntimeException))
521cdf0e10cSrcweir {
522cdf0e10cSrcweir     try
523cdf0e10cSrcweir     {
524cdf0e10cSrcweir         vos::OGuard aGuard(Application::GetSolarMutex());
525cdf0e10cSrcweir 
526cdf0e10cSrcweir         std::auto_ptr< ResMgr > xManager(
527cdf0e10cSrcweir             ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui)));
528cdf0e10cSrcweir         if( nMode == task::PasswordRequestMode_PASSWORD_CREATE )
529cdf0e10cSrcweir         {
530cdf0e10cSrcweir             if (bIsSimplePasswordRequest)
531cdf0e10cSrcweir             {
532cdf0e10cSrcweir                 std::auto_ptr< PasswordDialog > pDialog(
533cdf0e10cSrcweir                     new PasswordDialog( pParent, nMode, xManager.get(), aDocName,
534cdf0e10cSrcweir                     bIsPasswordToModify, bIsSimplePasswordRequest ) );
535cdf0e10cSrcweir                 pDialog->SetMinLen(0);
536cdf0e10cSrcweir 
537cdf0e10cSrcweir                 rInfo.SetResult( pDialog->Execute() == RET_OK ? ERRCODE_BUTTON_OK : ERRCODE_BUTTON_CANCEL );
538cdf0e10cSrcweir                 rInfo.SetPassword( pDialog->GetPassword() );
539cdf0e10cSrcweir             }
540cdf0e10cSrcweir             else
541cdf0e10cSrcweir             {
542cdf0e10cSrcweir                 const sal_uInt16 nMaxPasswdLen = bMSCryptoMode ? 15 : 0;   // 0 -> allow any length
543cdf0e10cSrcweir 
544cdf0e10cSrcweir                 VclAbstractDialogFactory * pFact = VclAbstractDialogFactory::Create();
545cdf0e10cSrcweir                 AbstractPasswordToOpenModifyDialog *pTmp = pFact->CreatePasswordToOpenModifyDialog( pParent, 0, nMaxPasswdLen, bIsPasswordToModify );
546cdf0e10cSrcweir                 std::auto_ptr< AbstractPasswordToOpenModifyDialog > pDialog( pTmp );
547cdf0e10cSrcweir 
548cdf0e10cSrcweir                 rInfo.SetResult( pDialog->Execute() == RET_OK ? ERRCODE_BUTTON_OK : ERRCODE_BUTTON_CANCEL );
549cdf0e10cSrcweir                 rInfo.SetPassword( pDialog->GetPasswordToOpen() );
550cdf0e10cSrcweir                 rInfo.SetPasswordToModify( pDialog->GetPasswordToModify() );
551cdf0e10cSrcweir                 rInfo.SetRecommendToOpenReadonly( pDialog->IsRecommendToOpenReadonly() );
552cdf0e10cSrcweir             }
553cdf0e10cSrcweir         }
554cdf0e10cSrcweir         else // enter password or reenter password
555cdf0e10cSrcweir         {
556cdf0e10cSrcweir             std::auto_ptr< PasswordDialog > pDialog(
557cdf0e10cSrcweir                 new PasswordDialog( pParent, nMode, xManager.get(), aDocName,
558cdf0e10cSrcweir                 bIsPasswordToModify, bIsSimplePasswordRequest ) );
559cdf0e10cSrcweir             pDialog->SetMinLen(0);
560cdf0e10cSrcweir 
561cdf0e10cSrcweir             rInfo.SetResult( pDialog->Execute() == RET_OK ? ERRCODE_BUTTON_OK : ERRCODE_BUTTON_CANCEL );
562cdf0e10cSrcweir             rInfo.SetPassword( bIsPasswordToModify ? String() : pDialog->GetPassword() );
563cdf0e10cSrcweir             rInfo.SetPasswordToModify( bIsPasswordToModify ? pDialog->GetPassword() : String() );
564cdf0e10cSrcweir         }
565cdf0e10cSrcweir     }
566cdf0e10cSrcweir     catch (std::bad_alloc const &)
567cdf0e10cSrcweir     {
568cdf0e10cSrcweir         throw uno::RuntimeException(
569cdf0e10cSrcweir             rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")),
570cdf0e10cSrcweir             uno::Reference< uno::XInterface>());
571cdf0e10cSrcweir     }
572cdf0e10cSrcweir }
573cdf0e10cSrcweir 
574cdf0e10cSrcweir void
handlePasswordRequest_(Window * pParent,task::PasswordRequestMode nMode,uno::Sequence<uno::Reference<task::XInteractionContinuation>> const & rContinuations,::rtl::OUString aDocumentName,bool bMSCryptoMode,bool bIsPasswordToModify,bool bIsSimplePasswordRequest=false)575cdf0e10cSrcweir handlePasswordRequest_(
576cdf0e10cSrcweir     Window * pParent,
577cdf0e10cSrcweir     task::PasswordRequestMode nMode,
578cdf0e10cSrcweir     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
579cdf0e10cSrcweir         rContinuations,
580cdf0e10cSrcweir     ::rtl::OUString aDocumentName,
581cdf0e10cSrcweir     bool bMSCryptoMode,
582cdf0e10cSrcweir     bool bIsPasswordToModify,
583cdf0e10cSrcweir     bool bIsSimplePasswordRequest = false )
584cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
585cdf0e10cSrcweir {
586cdf0e10cSrcweir     uno::Reference< task::XInteractionRetry > xRetry;
587cdf0e10cSrcweir     uno::Reference< task::XInteractionAbort > xAbort;
588cdf0e10cSrcweir     uno::Reference< task::XInteractionPassword > xPassword;
589cdf0e10cSrcweir     uno::Reference< task::XInteractionPassword2 > xPassword2;
590cdf0e10cSrcweir     getContinuations(rContinuations, &xRetry, &xAbort, &xPassword2, &xPassword);
591cdf0e10cSrcweir 
592cdf0e10cSrcweir     if ( xPassword2.is() && !xPassword.is() )
593cdf0e10cSrcweir         xPassword.set( xPassword2, uno::UNO_QUERY_THROW );
594cdf0e10cSrcweir 
595cdf0e10cSrcweir     LoginErrorInfo aInfo;
596cdf0e10cSrcweir 
597cdf0e10cSrcweir     executePasswordDialog( pParent, aInfo, nMode,
598cdf0e10cSrcweir             aDocumentName, bMSCryptoMode, bIsPasswordToModify, bIsSimplePasswordRequest );
599cdf0e10cSrcweir 
600cdf0e10cSrcweir     switch (aInfo.GetResult())
601cdf0e10cSrcweir     {
602cdf0e10cSrcweir     case ERRCODE_BUTTON_OK:
603cdf0e10cSrcweir         OSL_ENSURE( !bIsPasswordToModify || xPassword2.is(), "PasswordToModify is requested, but there is no Interaction!" );
604cdf0e10cSrcweir         if (xPassword.is())
605cdf0e10cSrcweir         {
606cdf0e10cSrcweir             if (xPassword2.is())
607cdf0e10cSrcweir             {
608cdf0e10cSrcweir                 xPassword2->setPasswordToModify( aInfo.GetPasswordToModify() );
609cdf0e10cSrcweir                 xPassword2->setRecommendReadOnly( aInfo.IsRecommendToOpenReadonly() );
610cdf0e10cSrcweir             }
611cdf0e10cSrcweir 
612cdf0e10cSrcweir             xPassword->setPassword(aInfo.GetPassword());
613cdf0e10cSrcweir             xPassword->select();
614cdf0e10cSrcweir         }
615cdf0e10cSrcweir         break;
616cdf0e10cSrcweir 
617cdf0e10cSrcweir     case ERRCODE_BUTTON_RETRY:
618cdf0e10cSrcweir         if (xRetry.is())
619cdf0e10cSrcweir             xRetry->select();
620cdf0e10cSrcweir         break;
621cdf0e10cSrcweir 
622cdf0e10cSrcweir     default:
623cdf0e10cSrcweir         if (xAbort.is())
624cdf0e10cSrcweir             xAbort->select();
625cdf0e10cSrcweir         break;
626cdf0e10cSrcweir     }
627cdf0e10cSrcweir }
628cdf0e10cSrcweir 
629cdf0e10cSrcweir } // namespace
630cdf0e10cSrcweir 
631cdf0e10cSrcweir bool
handleAuthenticationRequest(uno::Reference<task::XInteractionRequest> const & rRequest)632cdf0e10cSrcweir UUIInteractionHelper::handleAuthenticationRequest(
633cdf0e10cSrcweir     uno::Reference< task::XInteractionRequest > const & rRequest)
634cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
635cdf0e10cSrcweir {
636cdf0e10cSrcweir     uno::Any aAnyRequest(rRequest->getRequest());
637cdf0e10cSrcweir 
638cdf0e10cSrcweir     ucb::URLAuthenticationRequest aURLAuthenticationRequest;
639cdf0e10cSrcweir     if (aAnyRequest >>= aURLAuthenticationRequest)
640cdf0e10cSrcweir     {
641cdf0e10cSrcweir         handleAuthenticationRequest_(getParentProperty(),
642cdf0e10cSrcweir                                      getInteractionHandler(),
643cdf0e10cSrcweir                                      m_xServiceFactory,
644cdf0e10cSrcweir                                      aURLAuthenticationRequest,
645cdf0e10cSrcweir                                      rRequest->getContinuations(),
646cdf0e10cSrcweir                                      aURLAuthenticationRequest.URL);
647cdf0e10cSrcweir         return true;
648cdf0e10cSrcweir     }
649cdf0e10cSrcweir 
650cdf0e10cSrcweir     ucb::AuthenticationRequest aAuthenticationRequest;
651cdf0e10cSrcweir     if (aAnyRequest >>= aAuthenticationRequest)
652cdf0e10cSrcweir     {
653cdf0e10cSrcweir         handleAuthenticationRequest_(getParentProperty(),
654cdf0e10cSrcweir                                      getInteractionHandler(),
655cdf0e10cSrcweir                                      m_xServiceFactory,
656cdf0e10cSrcweir                                      aAuthenticationRequest,
657cdf0e10cSrcweir                                      rRequest->getContinuations(),
658cdf0e10cSrcweir                                      rtl::OUString());
659cdf0e10cSrcweir         return true;
660cdf0e10cSrcweir     }
661cdf0e10cSrcweir     return false;
662cdf0e10cSrcweir }
663cdf0e10cSrcweir 
664cdf0e10cSrcweir bool
handleMasterPasswordRequest(uno::Reference<task::XInteractionRequest> const & rRequest)665cdf0e10cSrcweir UUIInteractionHelper::handleMasterPasswordRequest(
666cdf0e10cSrcweir     uno::Reference< task::XInteractionRequest > const & rRequest)
667cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
668cdf0e10cSrcweir {
669cdf0e10cSrcweir     uno::Any aAnyRequest(rRequest->getRequest());
670cdf0e10cSrcweir 
671cdf0e10cSrcweir     task::MasterPasswordRequest aMasterPasswordRequest;
672cdf0e10cSrcweir     if (aAnyRequest >>= aMasterPasswordRequest)
673cdf0e10cSrcweir     {
674cdf0e10cSrcweir         handleMasterPasswordRequest_(getParentProperty(),
675cdf0e10cSrcweir                                      aMasterPasswordRequest.Mode,
676cdf0e10cSrcweir                                      rRequest->getContinuations());
677cdf0e10cSrcweir         return true;
678cdf0e10cSrcweir     }
679cdf0e10cSrcweir     return false;
680cdf0e10cSrcweir }
681cdf0e10cSrcweir 
682cdf0e10cSrcweir bool
handlePasswordRequest(uno::Reference<task::XInteractionRequest> const & rRequest)683cdf0e10cSrcweir UUIInteractionHelper::handlePasswordRequest(
684cdf0e10cSrcweir     uno::Reference< task::XInteractionRequest > const & rRequest)
685cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
686cdf0e10cSrcweir {
687cdf0e10cSrcweir     // parameters to be filled for the call to handlePasswordRequest_
688cdf0e10cSrcweir     Window * pParent = getParentProperty();
689cdf0e10cSrcweir     task::PasswordRequestMode nMode = task::PasswordRequestMode_PASSWORD_ENTER;
690cdf0e10cSrcweir     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const & rContinuations = rRequest->getContinuations();
691cdf0e10cSrcweir     ::rtl::OUString aDocumentName;
692cdf0e10cSrcweir     bool bMSCryptoMode          = false;
693cdf0e10cSrcweir     bool bIsPasswordToModify    = false;
694cdf0e10cSrcweir 
695cdf0e10cSrcweir     bool bDoHandleRequest = false;
696cdf0e10cSrcweir 
697cdf0e10cSrcweir     uno::Any aAnyRequest(rRequest->getRequest());
698cdf0e10cSrcweir 
699cdf0e10cSrcweir     task::DocumentPasswordRequest2 aDocumentPasswordRequest2;
700cdf0e10cSrcweir     if (!bDoHandleRequest && (aAnyRequest >>= aDocumentPasswordRequest2))
701cdf0e10cSrcweir     {
702cdf0e10cSrcweir         nMode               = aDocumentPasswordRequest2.Mode;
703cdf0e10cSrcweir         aDocumentName       = aDocumentPasswordRequest2.Name;
704cdf0e10cSrcweir         OSL_ENSURE( bMSCryptoMode == false, "bMSCryptoMode should be false" );
705cdf0e10cSrcweir         bIsPasswordToModify = aDocumentPasswordRequest2.IsRequestPasswordToModify;
706cdf0e10cSrcweir 
707cdf0e10cSrcweir         bDoHandleRequest = true;
708cdf0e10cSrcweir     }
709cdf0e10cSrcweir 
710cdf0e10cSrcweir     task::DocumentPasswordRequest aDocumentPasswordRequest;
711cdf0e10cSrcweir     if (!bDoHandleRequest && (aAnyRequest >>= aDocumentPasswordRequest))
712cdf0e10cSrcweir     {
713cdf0e10cSrcweir         nMode               = aDocumentPasswordRequest.Mode;
714cdf0e10cSrcweir         aDocumentName       = aDocumentPasswordRequest.Name;
715cdf0e10cSrcweir         OSL_ENSURE( bMSCryptoMode == false, "bMSCryptoMode should be false" );
716cdf0e10cSrcweir         OSL_ENSURE( bIsPasswordToModify == false, "bIsPasswordToModify should be false" );
717cdf0e10cSrcweir 
718cdf0e10cSrcweir         bDoHandleRequest = true;
719cdf0e10cSrcweir     }
720cdf0e10cSrcweir 
721cdf0e10cSrcweir     task::DocumentMSPasswordRequest2 aDocumentMSPasswordRequest2;
722cdf0e10cSrcweir     if (!bDoHandleRequest && (aAnyRequest >>= aDocumentMSPasswordRequest2))
723cdf0e10cSrcweir     {
724cdf0e10cSrcweir         nMode               = aDocumentMSPasswordRequest2.Mode;
725cdf0e10cSrcweir         aDocumentName       = aDocumentMSPasswordRequest2.Name;
726cdf0e10cSrcweir         bMSCryptoMode       = true;
727cdf0e10cSrcweir         bIsPasswordToModify = aDocumentMSPasswordRequest2.IsRequestPasswordToModify;
728cdf0e10cSrcweir 
729cdf0e10cSrcweir         bDoHandleRequest = true;
730cdf0e10cSrcweir     }
731cdf0e10cSrcweir 
732cdf0e10cSrcweir     task::DocumentMSPasswordRequest aDocumentMSPasswordRequest;
733cdf0e10cSrcweir     if (!bDoHandleRequest && (aAnyRequest >>= aDocumentMSPasswordRequest))
734cdf0e10cSrcweir     {
735cdf0e10cSrcweir         nMode               = aDocumentMSPasswordRequest.Mode;
736cdf0e10cSrcweir         aDocumentName       = aDocumentMSPasswordRequest.Name;
737cdf0e10cSrcweir         bMSCryptoMode       = true;
738cdf0e10cSrcweir         OSL_ENSURE( bIsPasswordToModify == false, "bIsPasswordToModify should be false" );
739cdf0e10cSrcweir 
740cdf0e10cSrcweir         bDoHandleRequest = true;
741cdf0e10cSrcweir     }
742cdf0e10cSrcweir 
743cdf0e10cSrcweir     if (bDoHandleRequest)
744cdf0e10cSrcweir     {
745cdf0e10cSrcweir         handlePasswordRequest_( pParent, nMode, rContinuations,
746cdf0e10cSrcweir                 aDocumentName, bMSCryptoMode, bIsPasswordToModify );
747cdf0e10cSrcweir         return true;
748cdf0e10cSrcweir     }
749cdf0e10cSrcweir 
750cdf0e10cSrcweir     task::PasswordRequest aPasswordRequest;
751cdf0e10cSrcweir     if( aAnyRequest >>= aPasswordRequest )
752cdf0e10cSrcweir     {
753cdf0e10cSrcweir         handlePasswordRequest_(getParentProperty(),
754cdf0e10cSrcweir                                aPasswordRequest.Mode,
755cdf0e10cSrcweir                                rRequest->getContinuations(),
756cdf0e10cSrcweir                                rtl::OUString(),
757cdf0e10cSrcweir                                false /* bool bMSCryptoMode */,
758cdf0e10cSrcweir                                false /* bool bIsPasswordToModify */,
759cdf0e10cSrcweir                                true  /* bool bIsSimplePasswordRequest */ );
760cdf0e10cSrcweir         return true;
761cdf0e10cSrcweir     }
762cdf0e10cSrcweir 
763cdf0e10cSrcweir     return false;
764cdf0e10cSrcweir }
765