"use strict"; var Crawler = require("crawler"); var path = require('path'); var output = new(require('./src/console/output')); var input = new(require('./src/console/input'))(process); var pregMatch = require('./src/preg-match'); var logger = require('./src/logger.js'); var cookieBag = new(require('./src/cookie-bag.js')); process.chdir(path.dirname(input.script)); var isDebugMode = input.has('debug'); if (!isDebugMode) { process.on('uncaughtException', function() { output.json({ error: true, message: 'UncaughtException' }); process.exit(1); }); } if (input.has('help')) { output.write([ process.argv[0], process.argv[1], '[--crawler-debug]', '[--crawler-info]', '[--crawler-error]', '[--debug]', '[--help]', ].join(' ')); process.exit(1); } var handlerCrawlerError = function(response, e) { output.json({ error: true, message: { body: response.body, response: response, error: e, }, }, true); } var handlerCrawlerException = function(e, done) { if (isDebugMode) { throw e; } else { done(); return output.json({ error: true, message: e }); } } var headers = function(crawler) { var datas = { 'User-Agent': 'Mozilla/5.0 (Windows NT 5.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'fr,fr-FR;q=0.5', 'Cookie': cookieBag.toString(), }; if (crawler.storage.hasOwnProperty('referer')) { datas['referer'] = crawler.storage.referer; } return datas; } var createCrawlerOptions = function(config) { var options = { maxConnections: 10, retries: 1, logger: logger, jQuery: false, }; config = config || {}; for (var i in config) { options[i] = config[i]; } return options; } var createCrawler = function(options) { options = createCrawlerOptions(options || {}); if (!options.hasOwnProperty('callback') && options.hasOwnProperty('onSuccess')) { options.callback = function(error, response, done) { if (error) { handlerCrawlerError(response, error); } else { try { options.onSuccess(response, done); } catch (e) { return handlerCrawlerException(e, done); } } done(); } } var c = new Crawler(options); c.storage = {}; c.runCrawl = function(url) { c.options.headers = headers(c); return c.queue(url); }; return c; } try { var UrlRefreshRequester = createCrawler({ onSuccess: function(response) { cookieBag.handleResponse(response); var urlRefresh = pregMatch(/"urlRefresh":"([^"]+)"/, response.body)[1]; LoginFormRequester.runCrawl(urlRefresh); }, }); var LoginFormRequester = createCrawler({ onSuccess: function(response) { cookieBag.handleResponse(response); var urlPost = pregMatch(/"urlPost":"([^"]+)"/, response.body)[1]; var urlLogin = pregMatch(/"urlLogin":"([^"]+)"/, response.body)[1]; var data = { canary: pregMatch(/"canary":"([^"]+)"/, response.body)[1], ctx: pregMatch(/ctx=(.+)/, urlLogin)[1], hpgrequestid: pregMatch(/"sessionId":"([^"]+)"/, response.body)[1], flowToken: pregMatch(/"sFT":"([^"]+)"/, response.body)[1], f1: 'Suivant', NewUser: 1, CookieDisclosure: 1, fspost: 0, IsFidoSupported: 0, FoundMSAs: null, i2: 1, i13: 0, i17: '', i18: '', i19: 19471, ps: 2, psRNGCDefaultType: '', psRNGCEntropy: '', psRNGCSLK: '', PPSX: '', FoundMSAs: '', type: 11, LoginOptions: 3, Irt: '', IrtPartition: '', hisRegion: '', hisScaleUnit: '', loginfmt: process.env.MS_OFFICE365_LOGIN, login: process.env.MS_OFFICE365_LOGIN, passwd: process.env.MS_OFFICE365_PASSWORD, } LoginRequester.options.form = data; LoginRequester.runCrawl('https://login.microsoftonline.com' + urlPost) } }); var LoginRequester = createCrawler({ method: 'POST', onSuccess: function(response) { cookieBag.handleResponse(response); var data = { canary: pregMatch(/"canary":"([^"]+)"/, response.body)[1], ctx: pregMatch(/"sCtx":"([^"]+)"/, response.body)[1], hpgrequestid: pregMatch(/"sessionId":"([^"]+)"/, response.body)[1], flowToken: pregMatch(/"sFT":"([^"]+)"/, response.body)[1], LoginOptions: 3 } KmsiRequester.options.form = data; KmsiRequester.runCrawl('https://login.microsoftonline.com/kmsi'); } }); var KmsiRequester = createCrawler({ method: 'POST', jQuery: true, onSuccess: function(response) { cookieBag.handleResponse(response); var data = { code: response.$('[name="code"]').val(), id_token: response.$('[name="id_token"]').val(), session_state: response.$('[name="session_state"]').val(), correlation_id: response.$('[name="correlation_id"]').val(), }; SiteRequester.options.form = data; SiteRequester.storage.referer = 'https://login.microsoftonline.com/kmsi'; SiteRequester.runCrawl(process.env.MS_OFFICE365_SITE + '_forms/default.aspx'); } }); var SiteRequester = createCrawler({ method: 'POST', jQuery: true, onSuccess: function(response, done) { cookieBag.handleResponse(response); if (SiteRequester.storage.hasOwnProperty('finish')) { output.json({ rtFa: cookieBag.get('rtFa'), FedAuth: cookieBag.get('FedAuth'), }, true); return; } if (SiteRequester.storage.hasOwnProperty('kmsi')) { delete SiteRequester.storage.kmsi; SiteRequester.storage.finish = true; return KmsiRequester.options.onSuccess(response); } if (response.headers.hasOwnProperty('location')) { SiteRequester.options.method = 'GET'; var location = response.headers.location; SiteRequester.runCrawl(location); } else { var urlPost = response.$('form').attr('action'); var data = { code: response.$('[name="code"]').val(), id_token: response.$('[name="id_token"]').val(), session_state: response.$('[name="session_state"]').val(), correlation_id: response.$('[name="correlation_id"]').val(), }; var params = urlPost.split('?')[1].split('&'); params.forEach(function(param) { var name = pregMatch(/([a-zA-Z0-9_-]+)=/, param)[1]; var value = pregMatch(/=(.+)/, param)[1]; data[name] = decodeURIComponent(value); }); SiteRequester.options.method = 'POST'; SiteRequester.options.form = data; SiteRequester.storage.referer = 'https://login.microsoftonline.com/kmsi'; SiteRequester.storage.kmsi = true; SiteRequester.runCrawl(urlPost); } }, }); UrlRefreshRequester.runCrawl(process.env.MS_OFFICE365_SITE); } catch (e) { if (isDebugMode) { throw e; } else { output.json({ error: true, message: e }); } process.exit(1); }