1818 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1919 */
2020
21+ import Rx from 'rxjs'
2122import { getInterpreter , isNamedInterpreter , cleanCommand , extractPostConnectCommandsFromServerConfig } from 'services/commandUtils'
23+ import { extractWhitelistFromConfigString , addProtocolsToUrlList , firstSuccessPromise } from 'services/utils'
2224import { hydrate } from 'services/duckUtils'
2325import helper from 'services/commandInterpreterHelper'
2426import { addHistory } from '../history/historyDuck'
2527import { getCmdChar , getMaxHistory } from '../settings/settingsDuck'
28+ import { fetchRemoteGuide } from './helpers/play'
2629import { CONNECTION_SUCCESS } from '../connections/connectionsDuck'
27- import { UPDATE_SETTINGS , getAvailableSettings , fetchMetaData } from '../dbMeta/dbMetaDuck'
30+ import { UPDATE_SETTINGS , getAvailableSettings , fetchMetaData , getRemoteContentHostnameWhitelist } from '../dbMeta/dbMetaDuck'
2831import { USER_CLEAR } from 'shared/modules/app/appDuck'
2932
3033export const NAME = 'commands'
@@ -36,6 +39,7 @@ export const SHOW_ERROR_MESSAGE = NAME + '/SHOW_ERROR_MESSAGE'
3639export const CYPHER = NAME + '/CYPHER'
3740export const CYPHER_SUCCEEDED = NAME + '/CYPHER_SUCCEEDED'
3841export const CYPHER_FAILED = NAME + '/CYPHER_FAILED'
42+ export const FETCH_GUIDE_FROM_WHITELIST = NAME + 'FETCH_GUIDE_FROM_WHITELIST'
3943
4044const initialState = {
4145 lastCommandWasUnknown : false
@@ -91,6 +95,7 @@ export const showErrorMessage = (errorMessage) => ({
9195export const cypher = ( query ) => ( { type : CYPHER , query } )
9296export const successfulCypher = ( query ) => ( { type : CYPHER_SUCCEEDED , query } )
9397export const unsuccessfulCypher = ( query ) => ( { type : CYPHER_FAILED , query } )
98+ export const fetchGuideFromWhitelistAction = ( url ) => ( { type : FETCH_GUIDE_FROM_WHITELIST , url } )
9499
95100// Epics
96101export const handleCommandsEpic = ( action$ , store ) =>
@@ -143,3 +148,18 @@ export const postConnectCmdEpic = (some$, store) =>
143148 }
144149 } )
145150 . mapTo ( { type : 'NOOP' } )
151+
152+ export const fetchGuideFromWhitelistEpic = ( some$ , store ) =>
153+ some$ . ofType ( FETCH_GUIDE_FROM_WHITELIST )
154+ . mergeMap ( ( action ) => {
155+ if ( ! action . $$responseChannel || ! action . url ) return Rx . Observable . of ( { type : 'NOOP' } )
156+ const whitelistStr = getRemoteContentHostnameWhitelist ( store . getState ( ) )
157+ const whitelist = extractWhitelistFromConfigString ( whitelistStr )
158+ const urlWhitelist = addProtocolsToUrlList ( whitelist )
159+ const guidesUrls = urlWhitelist . map ( ( url ) => url + '/' + action . url )
160+ return firstSuccessPromise ( guidesUrls , ( url ) => { // Get first successful fetch
161+ return fetchRemoteGuide ( url , whitelistStr )
162+ . then ( ( r ) => ( { type : action . $$responseChannel , success : true , result : r } ) )
163+ } )
164+ . catch ( ( e ) => ( { type : action . $$responseChannel , success : false , error : e } ) ) // If all fails, report that
165+ } )
0 commit comments