in ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/Login.java [89:163]
public LoginResponse doLogin(@FormParam("uname") String username,
@FormParam("psw") String pwd,
IUserStorage users,
String primarySrvId,
Collection<String> srvIds,
ITcLogin tcLogin) {
SecureRandom random = new SecureRandom();
byte[] tokBytes = random.generateSeed(TOKEN_LEN);
String tok = Base64Util.encodeBytesToString(tokBytes);
String sessId = Base64Util.encodeBytesToString(random.generateSeed(SESS_ID_LEN));
UserSession userSes = new UserSession();
userSes.username = username;
userSes.sessId = sessId;
userSes.loginTs = System.currentTimeMillis();
LoginResponse loginRes = new LoginResponse();
System.out.println("Saved session id " + sessId);
TcHelperUser user = getOrCreateUser(username, users, random);
byte[] userKeyCandidate = CryptUtil.hmacSha256(user.salt, (username + ":" + pwd));
byte[] userKeyCandidateKcv = CryptUtil.aesKcv(userKeyCandidate);
final User tcUser = tcLogin.checkServiceUserAndPassword(primarySrvId, username, pwd);
if (user.userKeyKcv == null) {
if (tcUser == null) {
loginRes.errorMessage =
"Service " + primarySrvId + " rejected credentials/user not found";
return loginRes;
}
//todo new registration should be checked on server first
user.userKeyKcv = userKeyCandidateKcv;
user.email = tcUser.email;
user.fullName = tcUser.name;
user.getOrCreateCreds(primarySrvId).setLogin(username).setPassword(pwd, userKeyCandidate);
user.enrichUserData(tcUser);
for (String addSrvId : srvIds) {
if (!addSrvId.equals(primarySrvId)) {
final User tcAddUser = tcLogin.checkServiceUserAndPassword(addSrvId, username, pwd);
if (tcAddUser != null) {
user.getOrCreateCreds(addSrvId).setLogin(username).setPassword(pwd, userKeyCandidate);
user.enrichUserData(tcAddUser);
}
}
}
users.putUser(username, user);
} else {
if (!Arrays.equals(userKeyCandidateKcv, user.userKeyKcv))
return loginRes; //password validation failed
}
//todo may be enrich user data here as well.
userSes.userKeyUnderToken = CryptUtil.aesEncrypt(tokBytes, userKeyCandidate);
users.putSession(sessId, userSes);
loginRes.fullToken = sessId + ":" + tok;
return loginRes;
}