diff options
Diffstat (limited to 'ucb/source/ucp/cmis/auth_provider.cxx')
-rw-r--r-- | ucb/source/ucp/cmis/auth_provider.cxx | 130 |
1 files changed, 89 insertions, 41 deletions
diff --git a/ucb/source/ucp/cmis/auth_provider.cxx b/ucb/source/ucp/cmis/auth_provider.cxx index dd7b4f9f1e3c..c4407f47cc3f 100644 --- a/ucb/source/ucp/cmis/auth_provider.cxx +++ b/ucb/source/ucp/cmis/auth_provider.cxx @@ -11,7 +11,10 @@ #define STD_TO_OUSTR( str ) OUString( str.c_str(), str.length( ), RTL_TEXTENCODING_UTF8 ) #include <com/sun/star/task/XInteractionHandler.hpp> +#include <com/sun/star/task/PasswordContainer.hpp> +#include <com/sun/star/task/XPasswordContainer2.hpp> +#include <comphelper/processfactory.hxx> #include <ucbhelper/simpleauthenticationrequest.hxx> #include <ucbhelper/authenticationfallback.hxx> @@ -64,6 +67,91 @@ namespace cmis return false; } + string AuthProvider::getRefreshToken(string& rUsername) + { + string refreshToken; + const css::uno::Reference<css::ucb::XCommandEnvironment> xEnv = getXEnv(); + if (xEnv.is()) + { + uno::Reference<task::XInteractionHandler> xIH = xEnv->getInteractionHandler(); + + if (rUsername.empty()) + { + rtl::Reference<ucbhelper::SimpleAuthenticationRequest> xRequest + = new ucbhelper::SimpleAuthenticationRequest( + m_sUrl, m_sBindingUrl, + ucbhelper::SimpleAuthenticationRequest::EntityType::ENTITY_NA, OUString(), + ucbhelper::SimpleAuthenticationRequest::EntityType::ENTITY_MODIFY, + STD_TO_OUSTR(rUsername), + ucbhelper::SimpleAuthenticationRequest::EntityType::ENTITY_NA, OUString()); + xIH->handle(xRequest.get()); + + rtl::Reference<ucbhelper::InteractionContinuation> xSelection + = xRequest->getSelection(); + + if (xSelection.is()) + { + // Handler handled the request. + uno::Reference<task::XInteractionAbort> xAbort(xSelection.get(), + uno::UNO_QUERY); + if (!xAbort.is()) + { + const rtl::Reference<ucbhelper::InteractionSupplyAuthentication>& xSupp + = xRequest->getAuthenticationSupplier(); + + rUsername = OUSTR_TO_STDSTR(xSupp->getUserName()); + } + } + } + + uno::Reference<uno::XComponentContext> xContext + = ::comphelper::getProcessComponentContext(); + uno::Reference<task::XPasswordContainer2> xMasterPasswd + = task::PasswordContainer::create(xContext); + if (xMasterPasswd->hasMasterPassword()) + { + xMasterPasswd->authorizateWithMasterPassword(xIH); + } + if (xMasterPasswd->isPersistentStoringAllowed()) + { + task::UrlRecord aRec + = xMasterPasswd->findForName(m_sBindingUrl, STD_TO_OUSTR(rUsername), xIH); + if (aRec.UserList.hasElements() && aRec.UserList[0].Passwords.hasElements()) + refreshToken = OUSTR_TO_STDSTR(aRec.UserList[0].Passwords[0]); + } + } + return refreshToken; + } + + bool AuthProvider::storeRefreshToken(const string& username, const string& password, + const string& refreshToken) + { + if (refreshToken.empty()) + return false; + if (password == refreshToken) + return true; + const css::uno::Reference<css::ucb::XCommandEnvironment> xEnv = getXEnv(); + if (xEnv.is()) + { + uno::Reference<task::XInteractionHandler> xIH = xEnv->getInteractionHandler(); + uno::Reference<uno::XComponentContext> xContext + = ::comphelper::getProcessComponentContext(); + uno::Reference<task::XPasswordContainer2> xMasterPasswd + = task::PasswordContainer::create(xContext); + uno::Sequence<OUString> aPasswd{ STD_TO_OUSTR(refreshToken) }; + if (xMasterPasswd->isPersistentStoringAllowed()) + { + if (xMasterPasswd->hasMasterPassword()) + { + xMasterPasswd->authorizateWithMasterPassword(xIH); + } + xMasterPasswd->addPersistent(m_sBindingUrl, STD_TO_OUSTR(username), aPasswd, xIH); + return true; + } + } + return false; + } + css::uno::WeakReference< css::ucb::XCommandEnvironment> AuthProvider::sm_xEnv; void AuthProvider::setXEnv(const css::uno::Reference< css::ucb::XCommandEnvironment>& xEnv ) @@ -76,7 +164,7 @@ namespace cmis return sm_xEnv; } - char* AuthProvider::onedriveAuthCodeFallback( const char* url, + char* AuthProvider::copyWebAuthCodeFallback( const char* url, const char* /*username*/, const char* /*password*/ ) { @@ -120,46 +208,6 @@ namespace cmis return strdup( "" ); } - - char* AuthProvider::gdriveAuthCodeFallback( const char* /*url*/, - const char* /*username*/, - const char* /*password*/ ) - { - const css::uno::Reference< - css::ucb::XCommandEnvironment> xEnv = getXEnv( ); - - if ( xEnv.is() ) - { - uno::Reference< task::XInteractionHandler > xIH - = xEnv->getInteractionHandler(); - - if ( xIH.is() ) - { - rtl::Reference< ucbhelper::AuthenticationFallbackRequest > xRequest - = new ucbhelper::AuthenticationFallbackRequest ( - "PIN:", "" ); - - xIH->handle( xRequest.get() ); - - rtl::Reference< ucbhelper::InteractionContinuation > xSelection - = xRequest->getSelection(); - - if ( xSelection.is() ) - { - // Handler handled the request. - const rtl::Reference< ucbhelper::InteractionAuthFallback >& - xAuthFallback = xRequest->getAuthFallbackInter( ); - if ( xAuthFallback.is() ) - { - OUString code = xAuthFallback->getCode( ); - return strdup( OUSTR_TO_STDSTR( code ).c_str( ) ); - } - } - } - } - - return strdup( "" ); - } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |