@@ -1,6 +1,6 @@
|
||||
"use strict";
|
||||
'use strict';
|
||||
|
||||
const Config = require("../lib/Config");
|
||||
const Config = require('../lib/Config');
|
||||
|
||||
const loginWithWrongCredentialsShouldFail = function(username, password) {
|
||||
return new Promise((resolve, reject) => {
|
||||
@@ -22,7 +22,12 @@ const isAccountLockoutError = function(username, password, duration, waitTime) {
|
||||
Parse.User.logIn(username, password)
|
||||
.then(() => reject('login should have failed'))
|
||||
.catch(err => {
|
||||
if (err.message === 'Your account is locked due to multiple failed login attempts. Please try again after ' + duration + ' minute(s)') {
|
||||
if (
|
||||
err.message ===
|
||||
'Your account is locked due to multiple failed login attempts. Please try again after ' +
|
||||
duration +
|
||||
' minute(s)'
|
||||
) {
|
||||
resolve();
|
||||
} else {
|
||||
reject(err);
|
||||
@@ -32,8 +37,7 @@ const isAccountLockoutError = function(username, password, duration, waitTime) {
|
||||
});
|
||||
};
|
||||
|
||||
describe("Account Lockout Policy: ", () => {
|
||||
|
||||
describe('Account Lockout Policy: ', () => {
|
||||
it('account should not be locked even after failed login attempts if account lockout policy is not set', done => {
|
||||
reconfigureServer({
|
||||
appName: 'unlimited',
|
||||
@@ -46,17 +50,28 @@ describe("Account Lockout Policy: ", () => {
|
||||
return user.signUp(null);
|
||||
})
|
||||
.then(() => {
|
||||
return loginWithWrongCredentialsShouldFail('username1', 'incorrect password 1');
|
||||
return loginWithWrongCredentialsShouldFail(
|
||||
'username1',
|
||||
'incorrect password 1'
|
||||
);
|
||||
})
|
||||
.then(() => {
|
||||
return loginWithWrongCredentialsShouldFail('username1', 'incorrect password 2');
|
||||
return loginWithWrongCredentialsShouldFail(
|
||||
'username1',
|
||||
'incorrect password 2'
|
||||
);
|
||||
})
|
||||
.then(() => {
|
||||
return loginWithWrongCredentialsShouldFail('username1', 'incorrect password 3');
|
||||
return loginWithWrongCredentialsShouldFail(
|
||||
'username1',
|
||||
'incorrect password 3'
|
||||
);
|
||||
})
|
||||
.then(() => done())
|
||||
.catch(err => {
|
||||
fail('allow unlimited failed login attempts failed: ' + JSON.stringify(err));
|
||||
fail(
|
||||
'allow unlimited failed login attempts failed: ' + JSON.stringify(err)
|
||||
);
|
||||
done();
|
||||
});
|
||||
});
|
||||
@@ -66,9 +81,9 @@ describe("Account Lockout Policy: ", () => {
|
||||
appName: 'duration',
|
||||
accountLockout: {
|
||||
duration: 'invalid value',
|
||||
threshold: 5
|
||||
threshold: 5,
|
||||
},
|
||||
publicServerURL: "https://my.public.server.com/1"
|
||||
publicServerURL: 'https://my.public.server.com/1',
|
||||
})
|
||||
.then(() => {
|
||||
Config.get('test');
|
||||
@@ -76,10 +91,17 @@ describe("Account Lockout Policy: ", () => {
|
||||
done();
|
||||
})
|
||||
.catch(err => {
|
||||
if (err && err === 'Account lockout duration should be greater than 0 and less than 100000') {
|
||||
if (
|
||||
err &&
|
||||
err ===
|
||||
'Account lockout duration should be greater than 0 and less than 100000'
|
||||
) {
|
||||
done();
|
||||
} else {
|
||||
fail('set duration to an invalid number test failed: ' + JSON.stringify(err));
|
||||
fail(
|
||||
'set duration to an invalid number test failed: ' +
|
||||
JSON.stringify(err)
|
||||
);
|
||||
done();
|
||||
}
|
||||
});
|
||||
@@ -90,9 +112,9 @@ describe("Account Lockout Policy: ", () => {
|
||||
appName: 'threshold',
|
||||
accountLockout: {
|
||||
duration: 5,
|
||||
threshold: 'invalid number'
|
||||
threshold: 'invalid number',
|
||||
},
|
||||
publicServerURL: "https://my.public.server.com/1"
|
||||
publicServerURL: 'https://my.public.server.com/1',
|
||||
})
|
||||
.then(() => {
|
||||
Config.get('test');
|
||||
@@ -100,10 +122,17 @@ describe("Account Lockout Policy: ", () => {
|
||||
done();
|
||||
})
|
||||
.catch(err => {
|
||||
if (err && err === 'Account lockout threshold should be an integer greater than 0 and less than 1000') {
|
||||
if (
|
||||
err &&
|
||||
err ===
|
||||
'Account lockout threshold should be an integer greater than 0 and less than 1000'
|
||||
) {
|
||||
done();
|
||||
} else {
|
||||
fail('set threshold to an invalid number test failed: ' + JSON.stringify(err));
|
||||
fail(
|
||||
'set threshold to an invalid number test failed: ' +
|
||||
JSON.stringify(err)
|
||||
);
|
||||
done();
|
||||
}
|
||||
});
|
||||
@@ -114,9 +143,9 @@ describe("Account Lockout Policy: ", () => {
|
||||
appName: 'threshold',
|
||||
accountLockout: {
|
||||
duration: 5,
|
||||
threshold: 0
|
||||
threshold: 0,
|
||||
},
|
||||
publicServerURL: "https://my.public.server.com/1"
|
||||
publicServerURL: 'https://my.public.server.com/1',
|
||||
})
|
||||
.then(() => {
|
||||
Config.get('test');
|
||||
@@ -124,10 +153,16 @@ describe("Account Lockout Policy: ", () => {
|
||||
done();
|
||||
})
|
||||
.catch(err => {
|
||||
if (err && err === 'Account lockout threshold should be an integer greater than 0 and less than 1000') {
|
||||
if (
|
||||
err &&
|
||||
err ===
|
||||
'Account lockout threshold should be an integer greater than 0 and less than 1000'
|
||||
) {
|
||||
done();
|
||||
} else {
|
||||
fail('threshold value < 1 is invalid test failed: ' + JSON.stringify(err));
|
||||
fail(
|
||||
'threshold value < 1 is invalid test failed: ' + JSON.stringify(err)
|
||||
);
|
||||
done();
|
||||
}
|
||||
});
|
||||
@@ -138,9 +173,9 @@ describe("Account Lockout Policy: ", () => {
|
||||
appName: 'threshold',
|
||||
accountLockout: {
|
||||
duration: 5,
|
||||
threshold: 1000
|
||||
threshold: 1000,
|
||||
},
|
||||
publicServerURL: "https://my.public.server.com/1"
|
||||
publicServerURL: 'https://my.public.server.com/1',
|
||||
})
|
||||
.then(() => {
|
||||
Config.get('test');
|
||||
@@ -148,10 +183,17 @@ describe("Account Lockout Policy: ", () => {
|
||||
done();
|
||||
})
|
||||
.catch(err => {
|
||||
if (err && err === 'Account lockout threshold should be an integer greater than 0 and less than 1000') {
|
||||
if (
|
||||
err &&
|
||||
err ===
|
||||
'Account lockout threshold should be an integer greater than 0 and less than 1000'
|
||||
) {
|
||||
done();
|
||||
} else {
|
||||
fail('threshold value > 999 is invalid test failed: ' + JSON.stringify(err));
|
||||
fail(
|
||||
'threshold value > 999 is invalid test failed: ' +
|
||||
JSON.stringify(err)
|
||||
);
|
||||
done();
|
||||
}
|
||||
});
|
||||
@@ -162,9 +204,9 @@ describe("Account Lockout Policy: ", () => {
|
||||
appName: 'duration',
|
||||
accountLockout: {
|
||||
duration: 0,
|
||||
threshold: 5
|
||||
threshold: 5,
|
||||
},
|
||||
publicServerURL: "https://my.public.server.com/1"
|
||||
publicServerURL: 'https://my.public.server.com/1',
|
||||
})
|
||||
.then(() => {
|
||||
Config.get('test');
|
||||
@@ -172,10 +214,16 @@ describe("Account Lockout Policy: ", () => {
|
||||
done();
|
||||
})
|
||||
.catch(err => {
|
||||
if (err && err === 'Account lockout duration should be greater than 0 and less than 100000') {
|
||||
if (
|
||||
err &&
|
||||
err ===
|
||||
'Account lockout duration should be greater than 0 and less than 100000'
|
||||
) {
|
||||
done();
|
||||
} else {
|
||||
fail('duration value < 1 is invalid test failed: ' + JSON.stringify(err));
|
||||
fail(
|
||||
'duration value < 1 is invalid test failed: ' + JSON.stringify(err)
|
||||
);
|
||||
done();
|
||||
}
|
||||
});
|
||||
@@ -186,9 +234,9 @@ describe("Account Lockout Policy: ", () => {
|
||||
appName: 'duration',
|
||||
accountLockout: {
|
||||
duration: 100000,
|
||||
threshold: 5
|
||||
threshold: 5,
|
||||
},
|
||||
publicServerURL: "https://my.public.server.com/1"
|
||||
publicServerURL: 'https://my.public.server.com/1',
|
||||
})
|
||||
.then(() => {
|
||||
Config.get('test');
|
||||
@@ -196,10 +244,17 @@ describe("Account Lockout Policy: ", () => {
|
||||
done();
|
||||
})
|
||||
.catch(err => {
|
||||
if (err && err === 'Account lockout duration should be greater than 0 and less than 100000') {
|
||||
if (
|
||||
err &&
|
||||
err ===
|
||||
'Account lockout duration should be greater than 0 and less than 100000'
|
||||
) {
|
||||
done();
|
||||
} else {
|
||||
fail('duration value > 99999 is invalid test failed: ' + JSON.stringify(err));
|
||||
fail(
|
||||
'duration value > 99999 is invalid test failed: ' +
|
||||
JSON.stringify(err)
|
||||
);
|
||||
done();
|
||||
}
|
||||
});
|
||||
@@ -210,21 +265,27 @@ describe("Account Lockout Policy: ", () => {
|
||||
appName: 'lockout threshold',
|
||||
accountLockout: {
|
||||
duration: 1,
|
||||
threshold: 2
|
||||
threshold: 2,
|
||||
},
|
||||
publicServerURL: "http://localhost:8378/1"
|
||||
publicServerURL: 'http://localhost:8378/1',
|
||||
})
|
||||
.then(() => {
|
||||
const user = new Parse.User();
|
||||
user.setUsername("username2");
|
||||
user.setPassword("failedLoginAttemptsThreshold");
|
||||
user.setUsername('username2');
|
||||
user.setPassword('failedLoginAttemptsThreshold');
|
||||
return user.signUp();
|
||||
})
|
||||
.then(() => {
|
||||
return loginWithWrongCredentialsShouldFail('username2', 'wrong password');
|
||||
return loginWithWrongCredentialsShouldFail(
|
||||
'username2',
|
||||
'wrong password'
|
||||
);
|
||||
})
|
||||
.then(() => {
|
||||
return loginWithWrongCredentialsShouldFail('username2', 'wrong password');
|
||||
return loginWithWrongCredentialsShouldFail(
|
||||
'username2',
|
||||
'wrong password'
|
||||
);
|
||||
})
|
||||
.then(() => {
|
||||
return isAccountLockoutError('username2', 'wrong password', 1, 1);
|
||||
@@ -233,7 +294,10 @@ describe("Account Lockout Policy: ", () => {
|
||||
done();
|
||||
})
|
||||
.catch(err => {
|
||||
fail('lock account after failed login attempts test failed: ' + JSON.stringify(err));
|
||||
fail(
|
||||
'lock account after failed login attempts test failed: ' +
|
||||
JSON.stringify(err)
|
||||
);
|
||||
done();
|
||||
});
|
||||
});
|
||||
@@ -243,34 +307,43 @@ describe("Account Lockout Policy: ", () => {
|
||||
appName: 'lockout threshold',
|
||||
accountLockout: {
|
||||
duration: 0.05, // 0.05*60 = 3 secs
|
||||
threshold: 2
|
||||
threshold: 2,
|
||||
},
|
||||
publicServerURL: "http://localhost:8378/1"
|
||||
publicServerURL: 'http://localhost:8378/1',
|
||||
})
|
||||
.then(() => {
|
||||
const user = new Parse.User();
|
||||
user.setUsername("username3");
|
||||
user.setPassword("failedLoginAttemptsThreshold");
|
||||
user.setUsername('username3');
|
||||
user.setPassword('failedLoginAttemptsThreshold');
|
||||
return user.signUp();
|
||||
})
|
||||
.then(() => {
|
||||
return loginWithWrongCredentialsShouldFail('username3', 'wrong password');
|
||||
return loginWithWrongCredentialsShouldFail(
|
||||
'username3',
|
||||
'wrong password'
|
||||
);
|
||||
})
|
||||
.then(() => {
|
||||
return loginWithWrongCredentialsShouldFail('username3', 'wrong password');
|
||||
return loginWithWrongCredentialsShouldFail(
|
||||
'username3',
|
||||
'wrong password'
|
||||
);
|
||||
})
|
||||
.then(() => {
|
||||
return isAccountLockoutError('username3', 'wrong password', 0.05, 1);
|
||||
})
|
||||
.then(() => {
|
||||
// account should still be locked even after 2 seconds.
|
||||
// account should still be locked even after 2 seconds.
|
||||
return isAccountLockoutError('username3', 'wrong password', 0.05, 2000);
|
||||
})
|
||||
.then(() => {
|
||||
done();
|
||||
})
|
||||
.catch(err => {
|
||||
fail('account should be locked for duration mins test failed: ' + JSON.stringify(err));
|
||||
fail(
|
||||
'account should be locked for duration mins test failed: ' +
|
||||
JSON.stringify(err)
|
||||
);
|
||||
done();
|
||||
});
|
||||
});
|
||||
@@ -280,24 +353,30 @@ describe("Account Lockout Policy: ", () => {
|
||||
appName: 'lockout threshold',
|
||||
accountLockout: {
|
||||
duration: 0.05, // 0.05*60 = 3 secs
|
||||
threshold: 2
|
||||
threshold: 2,
|
||||
},
|
||||
publicServerURL: "http://localhost:8378/1"
|
||||
publicServerURL: 'http://localhost:8378/1',
|
||||
})
|
||||
.then(() => {
|
||||
const user = new Parse.User();
|
||||
user.setUsername("username4");
|
||||
user.setPassword("correct password");
|
||||
user.setUsername('username4');
|
||||
user.setPassword('correct password');
|
||||
return user.signUp();
|
||||
})
|
||||
.then(() => {
|
||||
return loginWithWrongCredentialsShouldFail('username4', 'wrong password');
|
||||
return loginWithWrongCredentialsShouldFail(
|
||||
'username4',
|
||||
'wrong password'
|
||||
);
|
||||
})
|
||||
.then(() => {
|
||||
return loginWithWrongCredentialsShouldFail('username4', 'wrong password');
|
||||
return loginWithWrongCredentialsShouldFail(
|
||||
'username4',
|
||||
'wrong password'
|
||||
);
|
||||
})
|
||||
.then(() => {
|
||||
// allow locked user to login after 3 seconds with a valid userid and password
|
||||
// allow locked user to login after 3 seconds with a valid userid and password
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
Parse.User.logIn('username4', 'correct password')
|
||||
@@ -310,9 +389,11 @@ describe("Account Lockout Policy: ", () => {
|
||||
done();
|
||||
})
|
||||
.catch(err => {
|
||||
fail('allow login for locked account after accountPolicy.duration minutes test failed: ' + JSON.stringify(err));
|
||||
fail(
|
||||
'allow login for locked account after accountPolicy.duration minutes test failed: ' +
|
||||
JSON.stringify(err)
|
||||
);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
})
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user