diff options
author | Giuseppe Castagno <giuseppe.castagno@acca-esse.eu> | 2016-03-15 17:33:29 +0100 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2016-05-02 10:57:40 +0000 |
commit | 3db082a75210bbf0fc657831443c589a4226b997 (patch) | |
tree | ddbe3a7a8e182b5a419b11aa26ab8dd9a0fd16a2 | |
parent | af1a3d8b484ed96938e8c2a8cf34f5f424791657 (diff) |
Related tdf#98416 Libcmis: add a patch to fix Google Drive login
The new Google login sequence uses two html pages: one for user email
the other for password.
The older sequence used only one page for both user email and
user password.
Change-Id: If875ba3ec9680d7e8c700a269873e427ac037a8e
Reviewed-on: https://gerrit.libreoffice.org/24513
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: David Tardon <dtardon@redhat.com>
-rw-r--r-- | external/libcmis/UnpackedTarball_cmis.mk | 1 | ||||
-rw-r--r-- | external/libcmis/libcmis-fix-google-drive.patch | 106 |
2 files changed, 107 insertions, 0 deletions
diff --git a/external/libcmis/UnpackedTarball_cmis.mk b/external/libcmis/UnpackedTarball_cmis.mk index 9880947385d2..435e7c588018 100644 --- a/external/libcmis/UnpackedTarball_cmis.mk +++ b/external/libcmis/UnpackedTarball_cmis.mk @@ -15,6 +15,7 @@ $(eval $(call gb_UnpackedTarball_set_patchlevel,cmis,1)) $(eval $(call gb_UnpackedTarball_add_patches,cmis, \ external/libcmis/libcmis-libxml2_compatibility.patch \ + external/libcmis/libcmis-fix-google-drive.patch \ )) ifeq ($(OS)$(COM),WNTMSC) diff --git a/external/libcmis/libcmis-fix-google-drive.patch b/external/libcmis/libcmis-fix-google-drive.patch new file mode 100644 index 000000000000..77961ce80863 --- /dev/null +++ b/external/libcmis/libcmis-fix-google-drive.patch @@ -0,0 +1,106 @@ +diff -aru old-src/src/libcmis/oauth2-providers.cxx new-src/src/libcmis/oauth2-providers.cxx +--- old-src/src/libcmis/oauth2-providers.cxx 2016-03-01 17:14:26.000000000 +0100 ++++ new-src/src/libcmis/oauth2-providers.cxx 2016-04-28 11:28:25.233803971 +0200 +@@ -37,11 +37,28 @@ + string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUrl, + const string& username, const string& password ) + { ++ /* This member function implements 'Google OAuth 2.0' ++ * ++ * The interaction is carried out by libcmis, with no web browser involved. ++ * ++ * Normal sequence (without 2FA) is: ++ * 1) a get to activate login page ++ * receive first login page, html format ++ * 2) subsequent post to sent email ++ * receive html page for password input ++ * 3) subsequent post to send password ++ * receive html page for application consent ++ * 4) subsequent post to send a consent for the application ++ * receive a single-use authorization code ++ * this code is returned as a string ++ */ ++ + static const string CONTENT_TYPE( "application/x-www-form-urlencoded" ); + // STEP 1: Log in + string res; + try + { ++ // send the first get, receive the html login page + res = session->httpGetRequest( authUrl )->getStream( )->str( ); + } + catch ( const CurlException& e ) +@@ -49,20 +66,39 @@ + return string( ); + } + +- string loginPost, loginLink; +- if ( !parseResponse( res.c_str( ), loginPost, loginLink ) ) ++ string loginEmailPost, loginEmailLink; ++ if ( !parseResponse( res.c_str( ), loginEmailPost, loginEmailLink ) ) ++ return string( ); ++ ++ loginEmailPost += "Email="; ++ loginEmailPost += string( username ); ++ ++ istringstream loginEmailIs( loginEmailPost ); ++ string loginEmailRes; ++ try ++ { ++ // send a post with user email, receive the html page for password input ++ loginEmailRes = session->httpPostRequest ( loginEmailLink, loginEmailIs, CONTENT_TYPE ) ++ ->getStream( )->str( ); ++ } ++ catch ( const CurlException& e ) ++ { ++ return string( ); ++ } ++ ++ string loginPasswdPost, loginPasswdLink; ++ if ( !parseResponse( loginEmailRes.c_str( ), loginPasswdPost, loginPasswdLink ) ) + return string( ); +- +- loginPost += "Email="; +- loginPost += string( username ); +- loginPost += "&Passwd="; +- loginPost += string( password ); +- +- istringstream loginIs( loginPost ); +- string loginRes; +- try ++ ++ loginPasswdPost += "&Passwd="; ++ loginPasswdPost += string( password ); ++ ++ istringstream loginPasswdIs( loginPasswdPost ); ++ string loginPasswdRes; ++ try + { +- loginRes = session->httpPostRequest ( loginLink, loginIs, CONTENT_TYPE ) ++ // send a post with user password, receive the application consent page ++ loginPasswdRes = session->httpPostRequest ( loginPasswdLink, loginPasswdIs, CONTENT_TYPE ) + ->getStream( )->str( ); + } + catch ( const CurlException& e ) +@@ -71,8 +107,8 @@ + } + + // STEP 2: allow libcmis to access google drive +- string approvalPost, approvalLink; +- if ( !parseResponse( loginRes. c_str( ), approvalPost, approvalLink) ) ++ string approvalPost, approvalLink; ++ if ( !parseResponse( loginPasswdRes. c_str( ), approvalPost, approvalLink) ) + return string( ); + approvalPost += "submit_access=true"; + +@@ -80,7 +116,8 @@ + string approvalRes; + try + { +- approvalRes = session->httpPostRequest ( approvalLink, approvalIs, ++ // send a post with application consent ++ approvalRes = session->httpPostRequest ( approvalLink, approvalIs, + CONTENT_TYPE) ->getStream( )->str( ); + } + catch ( const CurlException& e ) +Only in new-src/src/libcmis: oauth2-providers.cxx~ |