diff --git a/ext/rhoconnect-client/RhoConnectClient.rb b/ext/rhoconnect-client/RhoConnectClient.rb index e5d0a33..4c27521 100644 --- a/ext/rhoconnect-client/RhoConnectClient.rb +++ b/ext/rhoconnect-client/RhoConnectClient.rb @@ -103,7 +103,13 @@ def self.getSourceNameById( sourceId ) nil end - + def self.setOIDCToken( token ) + setProtocolExtras( + { + 'headers' => { 'Authorization' => "Bearer #{token}" } + } + ) + end # vvv DEPRECATED vvv diff --git a/ext/rhoconnect-client/ext/RhoConnectClient.xml b/ext/rhoconnect-client/ext/RhoConnectClient.xml index bcd8670..289860b 100644 --- a/ext/rhoconnect-client/ext/RhoConnectClient.xml +++ b/ext/rhoconnect-client/ext/RhoConnectClient.xml @@ -307,6 +307,18 @@ Be sure to review the [Ruby API Usage](/guide/api_ruby) guide for important info + + + Sets extras to be added to protocol requests. + + + Hash of extras + + + + + + 1.0.0 diff --git a/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.cpp b/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.cpp index 9b0ca15..2dcb1f2 100644 --- a/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.cpp +++ b/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.cpp @@ -191,6 +191,30 @@ void RhoConnectClientImpl::login( const rho::String& login, const rho::String& handleSyncResult(oResult); } + +void RhoConnectClientImpl::setProtocolExtras( const rho::Hashtable& extras, rho::apiGenerator::CMethodResult& oResult) { + + rho::sync::CSyncEngine::ProtocolExtras parsedExtras; + + for ( auto it = extras.begin(); it != extras.end(); ++it ) { + + rho::Hashtable< rho::String, rho::String > parsedExtra; + + rho::json::CJSONEntry json( it->second.c_str() ); + if ( json.isObject() ) { + for( rho::json::CJSONStructIterator jobj( json ); !jobj.isEnd(); jobj.next()) { + if ( jobj.getCurValue().isString()) { + parsedExtra.put( jobj.getCurKey(), jobj.getCurString() ); + } + } + } + + parsedExtras.put( it->first, parsedExtra ); + + } + + getSyncThread()->addQueueCommand(new sync::CSyncThread::CSyncSetProtoExtrasCommand( parsedExtras )); +} void RhoConnectClientImpl::handleSyncResult(rho::apiGenerator::CMethodResult& oResult) { if ( getSyncEngine().isNoThreadedMode() ) { diff --git a/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.h b/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.h index 672d309..cf1dffd 100644 --- a/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.h +++ b/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.h @@ -45,6 +45,7 @@ class RhoConnectClientImpl : public CRhoConnectClientSingletonBase virtual void getLastSyncObjectCount( const rho::String& sourceName, rho::apiGenerator::CMethodResult& oResult); virtual void setSourceProperty( const rho::String& sourceName, const rho::String& propertyName, const rho::String& propertyValue, rho::apiGenerator::CMethodResult& oResult); virtual void getSourceProperty( const rho::String& sourceName, const rho::String& propertyName, rho::apiGenerator::CMethodResult& oResult); + virtual void setProtocolExtras( const rho::Hashtable& extras, rho::apiGenerator::CMethodResult& oResult); private: void handleSyncResult(rho::apiGenerator::CMethodResult& oResult); diff --git a/ext/rhoconnect-client/ext/shared/sync/SyncEngine.cpp b/ext/rhoconnect-client/ext/shared/sync/SyncEngine.cpp index 4617e9e..708b59b 100755 --- a/ext/rhoconnect-client/ext/shared/sync/SyncEngine.cpp +++ b/ext/rhoconnect-client/ext/shared/sync/SyncEngine.cpp @@ -1078,7 +1078,18 @@ void CSyncEngine::login(String name, String password, const CSyncNotification& o //try { loadAllSources(); - NetResponse resp = getNet().pullCookies( getProtocol().getLoginUrl(), getProtocol().getLoginBody(name, password), this ); + Hashtable reqHeaders; + alterRequestHeaders(reqHeaders); + NetResponse resp = getNet().doRequest( "POST", getProtocol().getLoginUrl(), getProtocol().getLoginBody(name,password), this, &reqHeaders ); + + String strSession = ""; + + if ( resp.getRespCode() == 200 ) + { + strSession = resp.getCookies().c_str(); + } + + int nErrCode = RhoAppAdapter.getErrorFromResponse(resp); if ( nErrCode != RhoAppAdapter.ERR_NONE ) { @@ -1086,7 +1097,6 @@ void CSyncEngine::login(String name, String password, const CSyncNotification& o return; } - String strSession = resp.getCharData(); if ( strSession.length() == 0 ) { LOG(ERROR) + "Return empty session."; @@ -1203,6 +1213,16 @@ String CSyncEngine::getSyncServer() const { return RHOCONF().getString("syncserver"); } +void CSyncEngine::alterRequestHeaders( Hashtable& headers ) +{ + if ( m_protocolExtras.containsKey("headers") ) { + const Hashtable& extraHeaders = m_protocolExtras.get("headers"); + for ( auto it = extraHeaders.begin(); it != extraHeaders.end(); ++it ) { + headers.put(it->first,it->second); + } + } +} + static String getHostFromUrl( const String& strUrl ) { diff --git a/ext/rhoconnect-client/ext/shared/sync/SyncEngine.h b/ext/rhoconnect-client/ext/shared/sync/SyncEngine.h index 06a95a4..89666b8 100644 --- a/ext/rhoconnect-client/ext/shared/sync/SyncEngine.h +++ b/ext/rhoconnect-client/ext/shared/sync/SyncEngine.h @@ -93,6 +93,8 @@ class CSyncEngine : public net::IRhoSession void clearProperties(); }; + typedef rho::Hashtable< rho::String, rho::Hashtable< rho::String, rho::String >> ProtocolExtras; + private: VectorPtr m_sources; NetRequest m_NetRequest, m_NetRequestClientID; @@ -112,6 +114,8 @@ class CSyncEngine : public net::IRhoSession net::CNetRequestWrapper getNetClientID(){ return getNetRequest(&m_NetRequestClientID); } + ProtocolExtras m_protocolExtras; + public: CSyncEngine(); ~CSyncEngine(void){} @@ -185,6 +189,10 @@ class CSyncEngine : public net::IRhoSession void setNonThreadedMode(boolean b){m_bNoThreaded = b;} void applyChangedValues(db::CDBAdapter& db); + + void setProtocolExtras( const ProtocolExtras& e ) { m_protocolExtras = e; } + void alterRequestHeaders( Hashtable& headers ); + private: bool recoverSearch( const String& strUrl, const String& strBody, int& errorCode, String& strError, int nProgressStep ); diff --git a/ext/rhoconnect-client/ext/shared/sync/SyncSource.cpp b/ext/rhoconnect-client/ext/shared/sync/SyncSource.cpp index 6c7d100..070db2d 100644 --- a/ext/rhoconnect-client/ext/shared/sync/SyncSource.cpp +++ b/ext/rhoconnect-client/ext/shared/sync/SyncSource.cpp @@ -391,6 +391,8 @@ void CSyncSource::doSyncClientChanges() { Hashtable reqHeaders; reqHeaders.put(getProtocol().getClientIDHeader(), getSync().getClientID()); + getSync().alterRequestHeaders(reqHeaders); + if ( m_arMultipartItems.size() > 0 ) { CMultipartItem* pItem = new CMultipartItem(); @@ -644,6 +646,7 @@ void CSyncSource::syncServerChanges() String strUrl = getProtocol().getServerQueryUrl(getName(), getSync().getClientID(), getSync().getSyncPageSize()); Hashtable reqHeaders; reqHeaders.put(getProtocol().getClientIDHeader(), getSync().getClientID()); + getSync().alterRequestHeaders(reqHeaders); if ( !m_bTokenFromDB && getToken() > 1 ) strUrl += "&token=" + convertToStringA(getToken()); diff --git a/ext/rhoconnect-client/ext/shared/sync/SyncThread.cpp b/ext/rhoconnect-client/ext/shared/sync/SyncThread.cpp index e88230e..a402a76 100644 --- a/ext/rhoconnect-client/ext/shared/sync/SyncThread.cpp +++ b/ext/rhoconnect-client/ext/shared/sync/SyncThread.cpp @@ -184,37 +184,39 @@ void CSyncThread::checkShowStatus(CSyncCommand& oSyncCmd) void CSyncThread::processCommand(IQueueCommand* pCmd) { CSyncCommand& oSyncCmd = *((CSyncCommand*)pCmd); - switch(oSyncCmd.m_nCmdCode) + checkShowStatus(oSyncCmd); + oSyncCmd.executeForSyncEngine( m_oSyncEngine ); +} + +void CSyncThread::CSyncCommand::executeForSyncEngine( CSyncEngine& sync ) +{ + switch(m_nCmdCode) { case scSyncAll: - checkShowStatus(oSyncCmd); - m_oSyncEngine.doSyncAllSources(oSyncCmd.m_strQueryParams,oSyncCmd.m_bSyncOnlyChangedSources); - break; - case scSyncOne: - { - checkShowStatus(oSyncCmd); - m_oSyncEngine.doSyncSource(CSyncEngine::CSourceID(oSyncCmd.m_nCmdParam,oSyncCmd.m_strCmdParam), oSyncCmd.m_strQueryParams ); - } - break; - case scSearchOne: - { - checkShowStatus(oSyncCmd); - m_oSyncEngine.doSearch( ((CSyncSearchCommand&)oSyncCmd).m_arSources, oSyncCmd.m_strCmdParam, ((CSyncSearchCommand&)oSyncCmd).m_strFrom, - ((CSyncSearchCommand&)oSyncCmd).m_bSyncChanges, - oSyncCmd.m_nCmdParam); - } + sync.doSyncAllSources(m_strQueryParams,m_bSyncOnlyChangedSources); break; - case scLogin: - { - CSyncLoginCommand& oLoginCmd = (CSyncLoginCommand&)oSyncCmd; - checkShowStatus(oSyncCmd); - m_oSyncEngine.login(oLoginCmd.m_strName, oLoginCmd.m_strPassword, *oLoginCmd.m_pNotify ); - } + case scSyncOne: + sync.doSyncSource(CSyncEngine::CSourceID(m_nCmdParam,m_strCmdParam), m_strQueryParams ); break; } } +void CSyncThread::CSyncSearchCommand::executeForSyncEngine(CSyncEngine &sync) +{ + sync.doSearch( m_arSources, m_strCmdParam, m_strFrom, m_bSyncChanges, m_nCmdParam); +} + +void CSyncThread::CSyncLoginCommand::executeForSyncEngine(CSyncEngine &sync) +{ + sync.login(m_strName, m_strPassword, *m_pNotify ); +} + +void CSyncThread::CSyncSetProtoExtrasCommand::executeForSyncEngine(CSyncEngine &sync) +{ + sync.setProtocolExtras( m_extras ); +} + void CSyncThread::setPollInterval(int nInterval) { // if ( nInterval == 0 ) @@ -272,6 +274,8 @@ String CSyncThread::CSyncCommand::toString() return "Login"; case scSearchOne: return "Search"; + case scSetProtoExtras: + return "SetProtoExtras"; } return "Unknown; Code : " + convertToStringA(m_nCmdCode); diff --git a/ext/rhoconnect-client/ext/shared/sync/SyncThread.h b/ext/rhoconnect-client/ext/shared/sync/SyncThread.h index 4094840..3634999 100644 --- a/ext/rhoconnect-client/ext/shared/sync/SyncThread.h +++ b/ext/rhoconnect-client/ext/shared/sync/SyncThread.h @@ -62,7 +62,7 @@ namespace sync { class CSyncThread : public common::CThreadQueue { public: - enum ESyncCommands{ scNone = 0, scSyncAll, scSyncOne, scLogin, scSearchOne}; + enum ESyncCommands{ scNone = 0, scSyncAll, scSyncOne, scLogin, scSearchOne, scSetProtoExtras }; private: @@ -126,6 +126,8 @@ class CSyncThread : public common::CThreadQueue virtual String toString(); + virtual void executeForSyncEngine( CSyncEngine& sync ); + }; class CSyncLoginCommand : public CSyncCommand @@ -140,6 +142,8 @@ class CSyncThread : public common::CThreadQueue m_strPassword = password; m_pNotify = pNotify; } + + virtual void executeForSyncEngine( CSyncEngine& sync ); }; class CSyncSearchCommand : public CSyncCommand @@ -149,12 +153,29 @@ class CSyncThread : public common::CThreadQueue boolean m_bSyncChanges; rho::Vector m_arSources; - CSyncSearchCommand(String from, String params, const rho::Vector& arSources, boolean sync_changes, int nProgressStep) : CSyncCommand(CSyncThread::scSearchOne,params,nProgressStep, false, "") + CSyncSearchCommand(String from, String params, const rho::Vector& arSources, boolean sync_changes, int nProgressStep) : + CSyncCommand(CSyncThread::scSearchOne,params,nProgressStep, false, "") { m_strFrom = from; m_bSyncChanges = sync_changes; m_arSources = arSources; } + + virtual void executeForSyncEngine( CSyncEngine& sync ); + }; + + class CSyncSetProtoExtrasCommand : public CSyncCommand + { + CSyncEngine::ProtocolExtras m_extras; + public: + CSyncSetProtoExtrasCommand( const CSyncEngine::ProtocolExtras& extras ) : + CSyncCommand(CSyncThread::scSetProtoExtras,"",false,"",false), + m_extras(extras) + { + + } + + virtual void executeForSyncEngine( CSyncEngine& sync ); }; private: