summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCao Cuong Ngo <cao.cuong.ngo@gmail.com>2013-07-14 23:59:51 +0200
committerCao Cuong Ngo <cao.cuong.ngo@gmail.com>2013-07-14 23:59:51 +0200
commita3e5c43ff690da09390634dd7c54c9ff193a95cc (patch)
treefcfe975c69fa4791ae4e1960c419ecddb5b09513
parent0d7869b0a73f5df4a81ac6e01a06b0f951387ee9 (diff)
CMIS: connect LO to Google Drive
Change-Id: I2c1b1d3e2bfd50ceb8647e62d37512ee3a0b9dae
-rw-r--r--officecfg/registry/data/org/openoffice/Office/Common.xcu2
-rw-r--r--ucb/source/ucp/cmis/cmis_content.cxx12
-rw-r--r--ucb/source/ucp/cmis/cmis_oauth2_providers.hxx32
-rw-r--r--ucb/source/ucp/cmis/cmis_url.cxx26
4 files changed, 60 insertions, 12 deletions
diff --git a/officecfg/registry/data/org/openoffice/Office/Common.xcu b/officecfg/registry/data/org/openoffice/Office/Common.xcu
index fb84a881a326..ef0e765431b5 100644
--- a/officecfg/registry/data/org/openoffice/Office/Common.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/Common.xcu
@@ -583,6 +583,7 @@
<it>https://&lt;host&gt;/cmis/atom</it>
<it>http://ec2-184-72-233-127.compute-1.amazonaws.com/ot-cmis/services/RepositoryService?wsdl</it>
<it>http://&lt;host&gt;/_vti_bin/CMISSoapwsdl.aspx</it>
+ <it>https://www.googleapis.com/drive/v2</it>
</value>
</prop>
<prop oor:name="CmisServersNames">
@@ -595,6 +596,7 @@
<it>OpenDataSpace</it>
<it>OpenText ELS 10.2.0</it>
<it>SharePoint 2010</it>
+ <it>Google Drive</it>
</value>
</prop>
</node>
diff --git a/ucb/source/ucp/cmis/cmis_content.cxx b/ucb/source/ucp/cmis/cmis_content.cxx
index 9d4beeb0dc72..e4a206c026b2 100644
--- a/ucb/source/ucp/cmis/cmis_content.cxx
+++ b/ucb/source/ucp/cmis/cmis_content.cxx
@@ -49,6 +49,7 @@
#include "cmis_content.hxx"
#include "cmis_provider.hxx"
#include "cmis_resultset.hxx"
+#include "cmis_oauth2_providers.hxx"
#define OUSTR_TO_STDSTR(s) string( OUStringToOString( s, RTL_TEXTENCODING_UTF8 ).getStr() )
#define STD_TO_OUSTR( str ) OUString( str.c_str(), str.length( ), RTL_TEXTENCODING_UTF8 )
@@ -316,9 +317,16 @@ namespace cmis
if ( authProvider.authenticationQuery( rUsername, rPassword ) )
{
// Initiate a CMIS session and register it as we found nothing
+ libcmis::OAuth2DataPtr oauth2Data = NULL;
+ if ( m_aURL.getBindingUrl( ) == GDRIVE_BASE_URL )
+ oauth2Data.reset( new libcmis::OAuth2Data(
+ GDRIVE_AUTH_URL, GDRIVE_TOKEN_URL,
+ GDRIVE_SCOPE, GDRIVE_REDIRECT_URI,
+ GDRIVE_CLIENT_ID, GDRIVE_CLIENT_SECRET ) );
+
m_pSession = libcmis::SessionFactory::createSession(
OUSTR_TO_STDSTR( m_aURL.getBindingUrl( ) ),
- rUsername, rPassword, OUSTR_TO_STDSTR( m_aURL.getRepositoryId( ) ) );
+ rUsername, rPassword, OUSTR_TO_STDSTR( m_aURL.getRepositoryId( ) ), oauth2Data );
if ( m_pSession == NULL )
ucbhelper::cancelCommandExecution(
ucb::IOErrorCode_INVALID_DEVICE,
@@ -1773,6 +1781,8 @@ namespace cmis
if ( sPath[sPath.getLength( ) - 1] != '/' )
sPath += "/";
sPath += STD_TO_OUSTR( ( *it )->getName( ) );
+ OUString sId = STD_TO_OUSTR( ( *it )->getId( ) );
+ aUrl.setObjectId( sId );
aUrl.setObjectPath( sPath );
uno::Reference< ucb::XContentIdentifier > xId = new ucbhelper::ContentIdentifier( aUrl.asString( ) );
uno::Reference< ucb::XContent > xContent = new Content( m_xContext, m_pProvider, xId, *it );
diff --git a/ucb/source/ucp/cmis/cmis_oauth2_providers.hxx b/ucb/source/ucp/cmis/cmis_oauth2_providers.hxx
new file mode 100644
index 000000000000..bd3df5b22ba9
--- /dev/null
+++ b/ucb/source/ucp/cmis/cmis_oauth2_providers.hxx
@@ -0,0 +1,32 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ */
+
+#ifndef CMIS_OAUTH2_PROVIDER2_HXX
+#define CMIS_OAUTH2_PROVIDERS_HXX
+
+
+namespace cmis
+{
+
+#define GDRIVE_BASE_URL "https://www.googleapis.com/drive/v2"
+#define GDRIVE_CLIENT_ID "457862564325.apps.googleusercontent.com"
+#define GDRIVE_CLIENT_SECRET "GYWrDtzyZQZ0_g5YoBCC6F0I"
+#define GDRIVE_AUTH_URL "https://accounts.google.com/o/oauth2/auth"
+#define GDRIVE_TOKEN_URL "https://accounts.google.com/o/oauth2/token"
+#define GDRIVE_REDIRECT_URI "urn:ietf:wg:oauth:2.0:oob"
+#define GDRIVE_SCOPE "https://www.googleapis.com/auth/drive"
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/cmis/cmis_url.cxx b/ucb/source/ucp/cmis/cmis_url.cxx
index 79c7a9e68e27..5d82e18804d0 100644
--- a/ucb/source/ucp/cmis/cmis_url.cxx
+++ b/ucb/source/ucp/cmis/cmis_url.cxx
@@ -15,6 +15,7 @@
#include <rtl/uri.hxx>
#include "cmis_url.hxx"
+#include "cmis_oauth2_providers.hxx"
using namespace std;
@@ -34,7 +35,11 @@ namespace cmis
m_sPass = aUrl.GetPass( INetURLObject::DECODE_WITH_CHARSET );
// Store the path to the object
- m_sPath = aUrl.GetURLPath( INetURLObject::DECODE_WITH_CHARSET );
+ // Google Drive doesn't support getObjectByPath
+ if ( m_sBindingUrl == GDRIVE_BASE_URL )
+ m_sPath = OUString( );
+ else
+ m_sPath = aUrl.GetURLPath( INetURLObject::DECODE_WITH_CHARSET );
m_sId = aUrl.GetMark( INetURLObject::DECODE_WITH_CHARSET );
if ( !m_sId.isEmpty( ) )
@@ -64,12 +69,10 @@ namespace cmis
void URL::setObjectPath( OUString sPath )
{
m_sPath = sPath;
- m_sId = OUString( );
}
void URL::setObjectId( OUString sId )
{
- m_sPath = OUString( );
m_sId = sId;
}
@@ -83,7 +86,15 @@ namespace cmis
RTL_TEXTENCODING_UTF8 );
sUrl = "vnd.libreoffice.cmis://" + sEncodedBinding;
- if ( !m_sPath.isEmpty( ) )
+ // Prefer get object by ID
+ if ( !m_sId.isEmpty( ) )
+ {
+ sUrl += "#" + rtl::Uri::encode( m_sId,
+ rtl_UriCharClassRelSegment,
+ rtl_UriEncodeKeepEscapes,
+ RTL_TEXTENCODING_UTF8 );
+ }
+ else if ( !m_sPath.isEmpty( ) )
{
sal_Int32 nPos = -1;
OUString sEncodedPath;
@@ -107,13 +118,6 @@ namespace cmis
while ( nPos != -1 );
sUrl += sEncodedPath;
}
- else if ( !m_sId.isEmpty( ) )
- {
- sUrl += "#" + rtl::Uri::encode( m_sId,
- rtl_UriCharClassRelSegment,
- rtl_UriEncodeKeepEscapes,
- RTL_TEXTENCODING_UTF8 );
- }
return sUrl;
}