2020-03-30 11:44:18 +00:00
|
|
|
import {AbstractServerConnection, ServerCommand} from "tc-shared/connection/ConnectionBase";
|
|
|
|
import {HandshakeIdentityHandler} from "tc-shared/connection/HandshakeHandler";
|
|
|
|
import {AbstractCommandHandler} from "tc-shared/connection/AbstractCommandHandler";
|
|
|
|
|
|
|
|
export enum IdentitifyType {
|
|
|
|
TEAFORO,
|
|
|
|
TEAMSPEAK,
|
|
|
|
NICKNAME
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface Identity {
|
|
|
|
fallback_name(): string | undefined ;
|
|
|
|
uid() : string;
|
|
|
|
type() : IdentitifyType;
|
|
|
|
|
|
|
|
valid() : boolean;
|
|
|
|
|
|
|
|
encode?() : string;
|
|
|
|
decode(data: string) : Promise<void>;
|
|
|
|
|
|
|
|
spawn_identity_handshake_handler(connection: AbstractServerConnection) : HandshakeIdentityHandler;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* avoid circular dependencies here */
|
|
|
|
export async function decode_identity(type: IdentitifyType, data: string) : Promise<Identity> {
|
|
|
|
let identity: Identity;
|
|
|
|
switch (type) {
|
|
|
|
case IdentitifyType.NICKNAME:
|
|
|
|
const nidentity = require("tc-shared/profiles/identities/NameIdentity");
|
|
|
|
identity = new nidentity.NameIdentity();
|
|
|
|
break;
|
|
|
|
case IdentitifyType.TEAFORO:
|
|
|
|
const fidentity = require("tc-shared/profiles/identities/TeaForumIdentity");
|
|
|
|
identity = new fidentity.TeaForumIdentity(undefined);
|
|
|
|
break;
|
|
|
|
case IdentitifyType.TEAMSPEAK:
|
|
|
|
const tidentity = require("tc-shared/profiles/identities/TeamSpeakIdentity");
|
|
|
|
identity = new tidentity.TeaSpeakIdentity(undefined, undefined);
|
|
|
|
break;
|
2018-12-28 14:39:23 +00:00
|
|
|
}
|
2020-03-30 11:44:18 +00:00
|
|
|
if(!identity)
|
|
|
|
return undefined;
|
|
|
|
|
|
|
|
try {
|
|
|
|
await identity.decode(data)
|
|
|
|
} catch(error) {
|
|
|
|
/* todo better error handling! */
|
|
|
|
console.error(error);
|
|
|
|
return undefined;
|
2020-03-29 10:54:15 +00:00
|
|
|
}
|
2019-02-23 13:15:22 +00:00
|
|
|
|
2020-03-30 11:44:18 +00:00
|
|
|
return identity;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function create_identity(type: IdentitifyType) {
|
|
|
|
let identity: Identity;
|
|
|
|
switch (type) {
|
|
|
|
case IdentitifyType.NICKNAME:
|
|
|
|
const nidentity = require("tc-shared/profiles/identities/NameIdentity");
|
|
|
|
identity = new nidentity.NameIdentity();
|
|
|
|
break;
|
|
|
|
case IdentitifyType.TEAFORO:
|
|
|
|
const fidentity = require("tc-shared/profiles/identities/TeaForumIdentity");
|
|
|
|
identity = new fidentity.TeaForumIdentity(undefined);
|
|
|
|
break;
|
|
|
|
case IdentitifyType.TEAMSPEAK:
|
|
|
|
const tidentity = require("tc-shared/profiles/identities/TeamSpeakIdentity");
|
|
|
|
identity = new tidentity.TeaSpeakIdentity(undefined, undefined);
|
|
|
|
break;
|
2019-02-23 13:15:22 +00:00
|
|
|
}
|
2020-03-30 11:44:18 +00:00
|
|
|
return identity;
|
|
|
|
}
|
2019-02-23 13:15:22 +00:00
|
|
|
|
2020-03-30 11:44:18 +00:00
|
|
|
export class HandshakeCommandHandler<T extends AbstractHandshakeIdentityHandler> extends AbstractCommandHandler {
|
|
|
|
readonly handle: T;
|
2018-12-28 14:39:23 +00:00
|
|
|
|
2020-03-30 11:44:18 +00:00
|
|
|
constructor(connection: AbstractServerConnection, handle: T) {
|
|
|
|
super(connection);
|
|
|
|
this.handle = handle;
|
|
|
|
}
|
2018-12-28 14:39:23 +00:00
|
|
|
|
|
|
|
|
2020-03-30 11:44:18 +00:00
|
|
|
handle_command(command: ServerCommand): boolean {
|
|
|
|
if($.isFunction(this[command.command]))
|
|
|
|
this[command.command](command.arguments);
|
|
|
|
else if(command.command == "error") {
|
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
console.warn(tr("Received unknown command while handshaking (%o)"), command);
|
2020-03-29 10:54:15 +00:00
|
|
|
}
|
2020-03-30 11:44:18 +00:00
|
|
|
return true;
|
2020-03-27 22:36:57 +00:00
|
|
|
}
|
2020-03-30 11:44:18 +00:00
|
|
|
}
|
2018-12-28 14:39:23 +00:00
|
|
|
|
2020-03-30 11:44:18 +00:00
|
|
|
export abstract class AbstractHandshakeIdentityHandler implements HandshakeIdentityHandler {
|
|
|
|
connection: AbstractServerConnection;
|
2018-12-28 14:39:23 +00:00
|
|
|
|
2020-03-30 11:44:18 +00:00
|
|
|
protected callbacks: ((success: boolean, message?: string) => any)[] = [];
|
2020-03-29 10:54:15 +00:00
|
|
|
|
2020-03-30 11:44:18 +00:00
|
|
|
protected constructor(connection: AbstractServerConnection) {
|
|
|
|
this.connection = connection;
|
|
|
|
}
|
2020-03-29 10:54:15 +00:00
|
|
|
|
2020-03-30 11:44:18 +00:00
|
|
|
register_callback(callback: (success: boolean, message?: string) => any) {
|
|
|
|
this.callbacks.push(callback);
|
|
|
|
}
|
2018-12-28 14:39:23 +00:00
|
|
|
|
2020-03-30 11:44:18 +00:00
|
|
|
abstract start_handshake();
|
2020-03-29 10:54:15 +00:00
|
|
|
|
2020-03-30 11:44:18 +00:00
|
|
|
protected trigger_success() {
|
|
|
|
for(const callback of this.callbacks)
|
|
|
|
callback(true);
|
|
|
|
}
|
2020-03-29 10:54:15 +00:00
|
|
|
|
2020-03-30 11:44:18 +00:00
|
|
|
protected trigger_fail(message: string) {
|
|
|
|
for(const callback of this.callbacks)
|
|
|
|
callback(false, message);
|
2018-12-28 14:39:23 +00:00
|
|
|
}
|
|
|
|
}
|