summaryrefslogtreecommitdiffstats
path: root/src/libcmis-c/session-factory.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcmis-c/session-factory.cxx')
-rw-r--r--src/libcmis-c/session-factory.cxx239
1 files changed, 239 insertions, 0 deletions
diff --git a/src/libcmis-c/session-factory.cxx b/src/libcmis-c/session-factory.cxx
new file mode 100644
index 0000000..cee4532
--- /dev/null
+++ b/src/libcmis-c/session-factory.cxx
@@ -0,0 +1,239 @@
+/* libcmis
+ * Version: MPL 1.1 / GPLv2+ / LGPLv2+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License or as specified alternatively below. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * Major Contributor(s):
+ * Copyright (C) 2011 SUSE <cbosdonnat@suse.com>
+ *
+ *
+ * All Rights Reserved.
+ *
+ * For minor contributions see the git repository.
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPLv2+"), or
+ * the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"),
+ * in which case the provisions of the GPLv2+ or the LGPLv2+ are applicable
+ * instead of those above.
+ */
+
+#include <libcmis-c/session-factory.h>
+
+#include <map>
+#include <string>
+#include <stdlib.h>
+
+#include <libcmis/session-factory.hxx>
+
+#include <libcmis-c/session.h>
+#include <libcmis-c/vectors.h>
+
+#include "internals.hxx"
+
+using namespace std;
+
+namespace
+{
+ size_t const CRED_MAX_LEN = 1024;
+
+ class WrapperAuthProvider : public libcmis::AuthProvider
+ {
+ private:
+ libcmis_authenticationCallback m_callback;
+
+ public:
+ WrapperAuthProvider( libcmis_authenticationCallback callback ) :
+ m_callback( callback )
+ {
+ }
+ virtual ~WrapperAuthProvider( ) { };
+
+ virtual bool authenticationQuery( string& username, string& password );
+ };
+
+ bool WrapperAuthProvider::authenticationQuery( string& username, string& password )
+ {
+ /* NOTE: As I understand this, the callback is responsible for
+ * filling the correct username and password (possibly using
+ * the passed values as defaults in some dialog or so). But then
+ * there is no guarantee that the new username/password will
+ * not be longer than the present one, in which case it will
+ * not fit into the available space! For now, use a buffer size
+ * big enough for practical purposes.
+ *
+ * It might be a better idea to change the callback's signature
+ * to bool ( * )( char** username, char** password )
+ * and make it the callee's responsibility to reallocate the
+ * strings if it needs to.
+ */
+ char user[CRED_MAX_LEN];
+ strncpy(user, username.c_str( ), sizeof( user ) );
+ user[CRED_MAX_LEN - 1] = '\0';
+ char pass[CRED_MAX_LEN];
+ strncpy(pass, password.c_str( ), sizeof( pass ) );
+ pass[CRED_MAX_LEN - 1] = '\0';
+
+ bool result = m_callback( user, pass );
+
+ // Update the username and password with the input
+ username = user;
+ password = pass;
+
+ return result;
+ }
+
+
+ class WrapperCertHandler : public libcmis::CertValidationHandler
+ {
+ private:
+ libcmis_certValidationCallback m_callback;
+ public:
+ WrapperCertHandler( libcmis_certValidationCallback callback ) :
+ m_callback( callback )
+ {
+ }
+ virtual ~WrapperCertHandler( ) { };
+
+ virtual bool validateCertificate( vector< string > certificatesChain );
+ };
+
+ bool WrapperCertHandler::validateCertificate( vector< string > certificatesChain )
+ {
+ libcmis_vector_string_Ptr chain = new ( nothrow ) libcmis_vector_string( );
+ if ( chain )
+ chain->handle = certificatesChain;
+
+ bool result = m_callback( chain );
+
+ libcmis_vector_string_free( chain );
+ return result;
+ }
+}
+
+std::string createString( char* str )
+{
+ if ( str )
+ return string( str );
+ else
+ return string( );
+}
+
+void libcmis_setAuthenticationCallback( libcmis_authenticationCallback callback )
+{
+ libcmis::AuthProviderPtr provider( new ( nothrow ) WrapperAuthProvider( callback ) );
+ if ( provider )
+ libcmis::SessionFactory::setAuthenticationProvider( provider );
+}
+
+void libcmis_setCertValidationCallback( libcmis_certValidationCallback callback )
+{
+ libcmis::CertValidationHandlerPtr handler( new ( nothrow )WrapperCertHandler( callback ) );
+ if ( handler )
+ libcmis::SessionFactory::setCertificateValidationHandler( handler );
+}
+
+void libcmis_setOAuth2AuthCodeProvider( libcmis_oauth2AuthCodeProvider callback )
+{
+ libcmis::SessionFactory::setOAuth2AuthCodeProvider( callback );
+}
+
+libcmis_oauth2AuthCodeProvider libcmis_getOAuth2AuthCodeProvider( )
+{
+ return libcmis::SessionFactory::getOAuth2AuthCodeProvider( );
+}
+
+void libcmis_setProxySettings( char* proxy, char* noProxy,
+ char* proxyUser, char* proxyPass )
+{
+ libcmis::SessionFactory::setProxySettings( string( proxy ), string( noProxy ),
+ string( proxyUser ), string( proxyPass ) );
+}
+
+const char* libcmis_getProxy( )
+{
+ return libcmis::SessionFactory::getProxy( ).c_str();
+}
+
+const char* libcmis_getNoProxy( )
+{
+ return libcmis::SessionFactory::getNoProxy( ).c_str();
+}
+
+const char* libcmis_getProxyUser( )
+{
+ return libcmis::SessionFactory::getProxyUser( ).c_str();
+}
+
+const char* libcmis_getProxyPass( )
+{
+ return libcmis::SessionFactory::getProxyPass( ).c_str();
+}
+
+libcmis_SessionPtr libcmis_createSession(
+ char* bindingUrl,
+ char* repositoryId,
+ char* username,
+ char* password,
+ bool noSslCheck,
+ libcmis_OAuth2DataPtr oauth2,
+ bool verbose,
+ libcmis_ErrorPtr error )
+{
+ libcmis_SessionPtr session = NULL;
+
+ try
+ {
+ libcmis::OAuth2DataPtr oauth2Handle;
+ if ( oauth2 != NULL )
+ oauth2Handle = oauth2->handle;
+
+ libcmis::Session* handle = libcmis::SessionFactory::createSession(
+ createString( bindingUrl ),
+ createString( username ),
+ createString( password ),
+ createString( repositoryId ), noSslCheck, oauth2Handle, verbose );
+ session = new libcmis_session( );
+ session->handle = handle;
+ }
+ catch ( const libcmis::Exception& e )
+ {
+ if ( error != NULL )
+ {
+ error->message = strdup( e.what() );
+ error->type = strdup( e.getType().c_str() );
+ }
+ }
+ catch ( const bad_alloc& e )
+ {
+ if ( error != NULL )
+ {
+ error->message = strdup( e.what() );
+ error->badAlloc = true;
+ }
+ }
+
+ return session;
+}
+
+libcmis_vector_Repository_Ptr libcmis_getRepositories(
+ char* bindingUrl,
+ char* username,
+ char* password,
+ bool verbose,
+ libcmis_ErrorPtr error )
+{
+ libcmis_SessionPtr session = libcmis_createSession(
+ bindingUrl, NULL, username, password, false, NULL, verbose, error );
+ libcmis_vector_Repository_Ptr repositories = libcmis_session_getRepositories( session );
+ libcmis_session_free( session );
+ return repositories;
+}