Skip to content
Prev Previous commit
Next Next commit
format naming by review and refactor the parse cookie function(includ…
…e if cn test) to make it more clear, also fixed a tiny bug before
  • Loading branch information
yihong0618 committed Dec 30, 2019
commit e3680fec38128f208483e1d3ededa240007ce88c
46 changes: 17 additions & 29 deletions lib/plugins/leetcode.js
Original file line number Diff line number Diff line change
Expand Up @@ -471,8 +471,8 @@ plugin.deleteSession = function(session, cb) {
};

plugin.signin = function(user, cb) {
log.debug('running leetcode.signin');
const spin = h.spin('Signing in leetcode.com');
const isCN = config.app === 'leetcode.cn';
const spin = isCN ? h.spin('Signing in leetcode-cn.com') : h.spin('Signing in leetcode.com');
request(config.sys.urls.login, function(e, resp, body) {
spin.stop();
e = plugin.checkError(e, resp, 200);
Expand Down Expand Up @@ -538,26 +538,18 @@ plugin.login = function(user, cb) {
});
};

function parseCookie(cookie, cb) {
function parseCookie(cookie, body, cb) {
const isCN = config.app === 'leetcode.cn';
const SessionPattern = /LEETCODE_SESSION=(.+?)(;|$)/;
const csrfPattern = /csrftoken=(.+?)(;|$)/;
const reSessionResult = SessionPattern.exec(cookie);
const reCsrfResult = csrfPattern.exec(cookie);
if (reSessionResult === null || reCsrfResult === null) {
return cb('invalid cookie?');
let csrfPattern;
// leetcode-cn.com Cookie is not the same as leetcode.com in third parties
if (isCN) {
csrfPattern = /name="csrfmiddlewaretoken" value="(.*?)"/;
} else {
csrfPattern = /csrftoken=(.+?)(;|$)/;
}
return {
sessionId: reSessionResult[1],
sessionCSRF: reCsrfResult[1],
};
}

// leetcode-cn.com Cookie is not the same as leetcode.com in third parties
function parseCNCookie(cookie, body, cb) {
const SessionPattern = /LEETCODE_SESSION=(.+?)(;|$)/;
const csrfPattern = /name="csrfmiddlewaretoken" value="(.*?)"/;
const reSessionResult = SessionPattern.exec(cookie);
const reCsrfResult = csrfPattern.exec(body);
const reCsrfResult = csrfPattern.exec(isCN? body: cookie);
if (reSessionResult === null || reCsrfResult === null) {
return cb('invalid cookie?');
}
Expand All @@ -567,16 +559,13 @@ function parseCNCookie(cookie, body, cb) {
};
}

function requestLeetcodeAndSave(request, leetcodeUrl, user, cb, party) {
function requestLeetcodeAndSave(request, leetcodeUrl, user, cb) {
request.get({url: leetcodeUrl}, function(e, resp, body) {
const redirectUri = resp.request.uri.href;
if (redirectUri !== config.sys.urls.leetcode_redirect) {
return cb(`${party} login failed or ${party} did not connect to LeetCode`);
return cb('Login failed. Please make sure the credential is correct.');
}
let cookieData = {};
if (leetcodeUrl.includes('cn')) {
cookieData = parseCNCookie(resp.request.headers.cookie, body, cb);
} else cookieData = parseCookie(resp.request.headers.cookie, cb);
const cookieData = parseCookie(resp.request.headers.cookie, body, cb);
user.sessionId = cookieData.sessionId;
user.sessionCSRF = cookieData.sessionCSRF;
session.saveUser(user);
Expand Down Expand Up @@ -621,7 +610,6 @@ plugin.githubLogin = function(user, cb) {
return cb('GitHub login failed');
}
if (resp.request.uri.href === urls.github_tf_redirect) {
cb('Your GitHub are using two-factor authentication');
// read two-factor code must be sync.
const twoFactorcode = require('prompt-sync')()('Please enter your two-factor code: ');
const authenticityTokenTwoFactor = body.match(/name="authenticity_token" value="(.*?)"/);
Expand All @@ -645,10 +633,10 @@ plugin.githubLogin = function(user, cb) {
if (resp.request.uri.href === urls.github_tf_session_request) {
return cb('Invalid two-factor code please check');
}
requestLeetcodeAndSave(_request, leetcodeUrl, user, cb, config.sys.login_methods.GitHub);
requestLeetcodeAndSave(_request, leetcodeUrl, user, cb);
});
} else {
requestLeetcodeAndSave(_request, leetcodeUrl, user, cb, config.sys.login_methods.GitHub);
requestLeetcodeAndSave(_request, leetcodeUrl, user, cb);
}
});
});
Expand Down Expand Up @@ -689,7 +677,7 @@ plugin.linkedinLogin = function(user, cb) {
if (resp.statusCode !== 200) {
return cb('LinkedIn login failed');
}
requestLeetcodeAndSave(_request, leetcodeUrl, user, cb, config.sys.login_methods.LinkedIn);
requestLeetcodeAndSave(_request, leetcodeUrl, user, cb);
});
});
};
Expand Down