2018-09-11 10:36:58 +02:00
|
|
|
"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]',
|
2018-09-11 11:15:28 +02:00
|
|
|
'[--debug]',
|
|
|
|
'[--help]',
|
2018-09-11 10:36:58 +02:00
|
|
|
].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;
|
|
|
|
|
2019-10-29 09:09:40 +01:00
|
|
|
LoginRequester.runCrawl('https://login.microsoftonline.com' + urlPost)
|
2018-09-11 10:36:58 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
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],
|
2019-07-14 12:30:55 +02:00
|
|
|
LoginOptions: 3
|
2018-09-11 10:36:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|