summaryrefslogtreecommitdiff
path: root/ucb/source/ucp/cmis/auth_provider.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'ucb/source/ucp/cmis/auth_provider.cxx')
-rw-r--r--ucb/source/ucp/cmis/auth_provider.cxx130
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: */