Support more WebSocket endpoints
This commit is contained in:
parent
0fb3951078
commit
d5810d6bac
2 changed files with 48 additions and 6 deletions
|
@ -268,10 +268,8 @@ export class SocketManager extends EventListener {
|
||||||
public async fetch(url: string, init: RequestInit): Promise<Response> {
|
public async fetch(url: string, init: RequestInit): Promise<Response> {
|
||||||
const headers = new Headers(init.headers);
|
const headers = new Headers(init.headers);
|
||||||
|
|
||||||
const isAuthenticated = headers.has('Authorization');
|
|
||||||
|
|
||||||
let resource: WebSocketResource;
|
let resource: WebSocketResource;
|
||||||
if (isAuthenticated) {
|
if (this.isAuthenticated(headers)) {
|
||||||
resource = await this.getAuthenticatedResource();
|
resource = await this.getAuthenticatedResource();
|
||||||
} else {
|
} else {
|
||||||
resource = await this.getUnauthenticatedResource();
|
resource = await this.getUnauthenticatedResource();
|
||||||
|
@ -618,6 +616,33 @@ export class SocketManager extends EventListener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private isAuthenticated(headers: Headers): boolean {
|
||||||
|
if (!this.credentials) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const authorization = headers.get('Authorization');
|
||||||
|
if (!authorization) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const [basic, base64] = authorization.split(/\s+/, 2);
|
||||||
|
|
||||||
|
if (basic.toLowerCase() !== 'basic' || !base64) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const [username, password] = Bytes.toString(Bytes.fromBase64(base64)).split(
|
||||||
|
':',
|
||||||
|
2
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
username === this.credentials.username &&
|
||||||
|
password === this.credentials.password
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// EventEmitter types
|
// EventEmitter types
|
||||||
|
|
||||||
public on(type: 'authError', callback: (error: HTTPError) => void): this;
|
public on(type: 'authError', callback: (error: HTTPError) => void): this;
|
||||||
|
|
|
@ -696,6 +696,24 @@ const WEBSOCKET_CALLS = new Set<keyof typeof URL_CALLS>([
|
||||||
|
|
||||||
// RemoteConfigController
|
// RemoteConfigController
|
||||||
'config',
|
'config',
|
||||||
|
|
||||||
|
// Certificate
|
||||||
|
'deliveryCert',
|
||||||
|
'getGroupCredentials',
|
||||||
|
|
||||||
|
// Devices
|
||||||
|
'devices',
|
||||||
|
'registerCapabilities',
|
||||||
|
'supportUnauthenticatedDelivery',
|
||||||
|
|
||||||
|
// Directory
|
||||||
|
'directoryAuth',
|
||||||
|
|
||||||
|
// Storage
|
||||||
|
'storageManifest',
|
||||||
|
'storageModify',
|
||||||
|
'storageRead',
|
||||||
|
'storageToken',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
type InitializeOptionsType = {
|
type InitializeOptionsType = {
|
||||||
|
@ -1497,15 +1515,14 @@ export function initialize({
|
||||||
const call = deviceName ? 'devices' : 'accounts';
|
const call = deviceName ? 'devices' : 'accounts';
|
||||||
const urlPrefix = deviceName ? '/' : '/code/';
|
const urlPrefix = deviceName ? '/' : '/code/';
|
||||||
|
|
||||||
// We update our saved username and password, since we're creating a new account
|
|
||||||
await authenticate({ username: number, password: newPassword });
|
|
||||||
|
|
||||||
const response = await _ajax({
|
const response = await _ajax({
|
||||||
call,
|
call,
|
||||||
httpType: 'PUT',
|
httpType: 'PUT',
|
||||||
responseType: 'json',
|
responseType: 'json',
|
||||||
urlParameters: urlPrefix + code,
|
urlParameters: urlPrefix + code,
|
||||||
jsonData,
|
jsonData,
|
||||||
|
username: number,
|
||||||
|
password: newPassword,
|
||||||
});
|
});
|
||||||
|
|
||||||
// From here on out, our username will be our UUID or E164 combined with device
|
// From here on out, our username will be our UUID or E164 combined with device
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue