var username = params.credentials.identifier; var password = params.credentials.password; var server = params.server.replace(/[\/]+$/, ''); var insecure = params.insecure; var proxy = params.proxy; var baseAFF = server + '/WebServices/WSDispatcher.pl'; var baseAFA = server + '/afa/php/ws.php'; var baseBF = server + '/BusinessFlow/rest/v1/network_objects/find'; function fillInSoapContent(content, service) { var request = service === 'AFF' ? '%content%' : '%content%'; return replaceInTemplates(request, {content: content}); } function fillInSOAPRequestTemplate(method, content, service) { var template = service === 'AFF' ? '1%content%' : '%content%'; return fillInSoapContent(replaceInTemplates(template, {content: content, method: method}), service); } var responseDict = { 'authenticate': /(.*)<\/sessionId/, 'getTicket': /((.|\n)*)<\/soap:Body/, 'createTicket': /((.|\n)*)<\/soap:Body/, 'ConnectRequest': /(.*)<\/SessionID/, 'DisconnectRequest': /(.*)<\/ns1:DisconnectResponse/, 'QueryRequest': /((.|\n)*)<\/SOAP-ENV:Body/ }; var commandToMethod = { 'algosec-get-ticket': 'getTicket', 'algosec-create-ticket': 'createTicket', 'algosec-query': 'QueryRequest' }; var commandToURL = { 'algosec-get-applications': '/applications', 'algosec-get-network-object': '' }; var sessionData = '%sessionId%'; var methodDict = { 'authenticate': '%username%%password%', 'getTicket': sessionData + '%ticketId%', 'trafficLines': '%action%
%destAddress%
ftp
%sourceAddress%
%user%%application%
', 'createTicket': sessionData + '%requestor%%subject%%trafficLines%', 'ConnectRequest': '%username%%password%', 'DisconnectRequest': '%sessionId%', 'QueryRequest': '%sessionId%%query%', 'QueryInput': '%source%%destination%%service%' }; var affCommands = ['algosec-create-ticket', 'algosec-get-ticket']; var bfCommands = ['algosec-get-applications', 'algosec-get-network-object']; function createTemplate(method, args) { switch (method) { case 'createTicket': var trafficLines = (args.description ? '"%description%"' : '') + methodDict['trafficLines']; return replaceInTemplates(methodDict[method], {trafficLines: trafficLines}); case 'QueryRequest': var query = methodDict['QueryInput'] + (args.user ? '%user%' : '') + (args.application ? '%application%' : ''); return replaceInTemplates(methodDict[method], {query: query}); default: return methodDict[method]; } } function sendSOAPRequest(method, args, service) { var req = fillInSOAPRequestTemplate(method, replaceInTemplates(createTemplate(method, args), args), service); var res = http( service === 'AFF' ? baseAFF : baseAFA, { Method: 'POST', Body: req }, insecure, proxy ); if (res.StatusCode < 200 || res.StatusCode >= 300) { throw 'Failed to ' + method + ', request status code: ' + res.StatusCode + ' and Body: ' + res.Body + '.'; } return res.Body; } function sendRESTRequest(url, args) { var res = http( baseBF + url + encodeToURLQuery(args), { Method: 'GET', Username: username, Password: password }, insecure, proxy ); if (res.StatusCode < 200 || res.StatusCode >= 300) { throw 'Failed to ' + url + ', request status code: ' + res.StatusCode + ' and Body: ' + res.Body + '.'; } return res.Body; } function sendAndParse(method, args, service) { var responseXML = sendSOAPRequest(method, args, service); var match = responseDict[method].exec(responseXML); if (match && match[1]) { return match[1]; } throw method +' failed'; } if (command === 'test-module') { if (sendAndParse('authenticate', {username: username, password: password}, 'AFF')) { return 'ok'; } return 'something is wrong'; } if (affCommands.indexOf(command) !== -1) { args.sessionId = sendAndParse('authenticate', {username: username, password: password}, 'AFF'); return JSON.parse(x2j(sendAndParse(commandToMethod[command], args, 'AFF'))); } if (bfCommands.indexOf(command) !== -1) { return JSON.parse(sendRESTRequest(commandToURL[command] ,args)); } args.sessionId = sendAndParse('ConnectRequest', {username: username, password: password}, 'AFA'); res = JSON.parse(x2j(sendAndParse(commandToMethod[command], args))); sendAndParse('DisconnectRequest', {sessionId: args.sessionId}, 'AFA'); return res;