95 lines
3.3 KiB
TypeScript
95 lines
3.3 KiB
TypeScript
import { StatusEnum, WebSocketConnectOptions } from 'types';
|
|
import webClient from '../../WebClient';
|
|
import { hashPassword } from '../../utils';
|
|
import { SessionPersistence } from '../../persistence';
|
|
|
|
import {
|
|
disconnect,
|
|
listUsers,
|
|
listRooms,
|
|
updateStatus,
|
|
} from './';
|
|
|
|
export function login(options: WebSocketConnectOptions, passwordSalt?: string): void {
|
|
const { userName, password, hashedPassword } = options;
|
|
|
|
const loginConfig: any = {
|
|
...webClient.clientConfig,
|
|
clientid: 'webatrice',
|
|
userName,
|
|
};
|
|
|
|
if (passwordSalt) {
|
|
loginConfig.hashedPassword = hashedPassword || hashPassword(passwordSalt, password);
|
|
} else {
|
|
loginConfig.password = password;
|
|
}
|
|
|
|
const CmdLogin = webClient.protobuf.controller.Command_Login.create(loginConfig);
|
|
|
|
const command = webClient.protobuf.controller.SessionCommand.create({
|
|
'.Command_Login.ext': CmdLogin
|
|
});
|
|
|
|
webClient.protobuf.sendSessionCommand(command, raw => {
|
|
const resp = raw['.Response_Login.ext'];
|
|
|
|
if (raw.responseCode === webClient.protobuf.controller.Response.ResponseCode.RespOk) {
|
|
const { buddyList, ignoreList, userInfo } = resp;
|
|
|
|
SessionPersistence.updateBuddyList(buddyList);
|
|
SessionPersistence.updateIgnoreList(ignoreList);
|
|
SessionPersistence.updateUser(userInfo);
|
|
SessionPersistence.loginSuccessful(loginConfig);
|
|
|
|
listUsers();
|
|
listRooms();
|
|
|
|
updateStatus(StatusEnum.LOGGED_IN, 'Logged in.');
|
|
|
|
return;
|
|
}
|
|
|
|
switch (raw.responseCode) {
|
|
case webClient.protobuf.controller.Response.ResponseCode.RespClientUpdateRequired:
|
|
updateStatus(StatusEnum.DISCONNECTED, 'Login failed: missing features');
|
|
break;
|
|
|
|
case webClient.protobuf.controller.Response.ResponseCode.RespWrongPassword:
|
|
case webClient.protobuf.controller.Response.ResponseCode.RespUsernameInvalid:
|
|
updateStatus(StatusEnum.DISCONNECTED, 'Login failed: incorrect username or password');
|
|
break;
|
|
|
|
case webClient.protobuf.controller.Response.ResponseCode.RespWouldOverwriteOldSession:
|
|
updateStatus(StatusEnum.DISCONNECTED, 'Login failed: duplicated user session');
|
|
break;
|
|
|
|
case webClient.protobuf.controller.Response.ResponseCode.RespUserIsBanned:
|
|
updateStatus(StatusEnum.DISCONNECTED, 'Login failed: banned user');
|
|
break;
|
|
|
|
case webClient.protobuf.controller.Response.ResponseCode.RespRegistrationRequired:
|
|
updateStatus(StatusEnum.DISCONNECTED, 'Login failed: registration required');
|
|
break;
|
|
|
|
case webClient.protobuf.controller.Response.ResponseCode.RespClientIdRequired:
|
|
updateStatus(StatusEnum.DISCONNECTED, 'Login failed: missing client ID');
|
|
break;
|
|
|
|
case webClient.protobuf.controller.Response.ResponseCode.RespContextError:
|
|
updateStatus(StatusEnum.DISCONNECTED, 'Login failed: server error');
|
|
break;
|
|
|
|
case webClient.protobuf.controller.Response.ResponseCode.RespAccountNotActivated:
|
|
updateStatus(StatusEnum.DISCONNECTED, 'Login failed: account not activated');
|
|
SessionPersistence.accountAwaitingActivation(options);
|
|
break;
|
|
|
|
default:
|
|
updateStatus(StatusEnum.DISCONNECTED, `Login failed: unknown error: ${raw.responseCode}`);
|
|
}
|
|
|
|
SessionPersistence.loginFailed();
|
|
disconnect();
|
|
});
|
|
}
|