@casual-simulation/aux-records 3.3.7 → 3.3.8-alpha.10185283421
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AnthropicAIChatInterface.d.ts +18 -0
- package/AnthropicAIChatInterface.js +238 -0
- package/AnthropicAIChatInterface.js.map +1 -0
- package/AuthController.d.ts +2 -0
- package/AuthController.js +22 -12
- package/AuthController.js.map +1 -1
- package/FileRecordsStore.d.ts +4 -0
- package/GoogleAIChatInterface.js +5 -1
- package/GoogleAIChatInterface.js.map +1 -1
- package/InstrumentedHashHelpers.d.ts +28 -0
- package/InstrumentedHashHelpers.js +61 -0
- package/InstrumentedHashHelpers.js.map +1 -0
- package/MemoryModerationJobProvider.d.ts +15 -0
- package/MemoryModerationJobProvider.js +45 -0
- package/MemoryModerationJobProvider.js.map +1 -0
- package/MemoryStore.d.ts +9 -1
- package/MemoryStore.js +30 -0
- package/MemoryStore.js.map +1 -1
- package/ModerationConfiguration.d.ts +84 -0
- package/ModerationConfiguration.js +95 -0
- package/ModerationConfiguration.js.map +1 -1
- package/ModerationController.d.ts +59 -2
- package/ModerationController.js +171 -1
- package/ModerationController.js.map +1 -1
- package/ModerationJobProvider.d.ts +110 -0
- package/ModerationJobProvider.js +2 -0
- package/ModerationJobProvider.js.map +1 -0
- package/ModerationScanner.d.ts +1 -0
- package/ModerationScanner.js +1 -0
- package/ModerationScanner.js.map +1 -0
- package/ModerationStore.d.ts +90 -0
- package/NotificationMessenger.d.ts +42 -2
- package/NotificationMessenger.js +27 -0
- package/NotificationMessenger.js.map +1 -1
- package/RecordsController.d.ts +1 -0
- package/RecordsController.js +9 -3
- package/RecordsController.js.map +1 -1
- package/RecordsServer.d.ts +12 -0
- package/RecordsServer.js +82 -1
- package/RecordsServer.js.map +1 -1
- package/ServerConfig.d.ts +392 -16
- package/ServerConfig.js +126 -2
- package/ServerConfig.js.map +1 -1
- package/StabilityAIImageInterface.d.ts +9 -0
- package/StabilityAIImageInterface.js +156 -0
- package/StabilityAIImageInterface.js.map +1 -1
- package/Utils.js.map +1 -1
- package/index.d.ts +3 -0
- package/index.js +3 -0
- package/index.js.map +1 -1
- package/package.json +5 -4
- package/tracing/TracingDecorators.d.ts +51 -3
- package/tracing/TracingDecorators.js +41 -38
- package/tracing/TracingDecorators.js.map +1 -1
- package/websockets/WebsocketController.js +1 -1
- package/websockets/WebsocketController.js.map +1 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AIChatInterface, AIChatInterfaceRequest, AIChatInterfaceResponse, AIChatInterfaceStreamResponse } from './AIChatInterface';
|
|
2
|
+
export interface AnthropicAIChatOptions {
|
|
3
|
+
/**
|
|
4
|
+
* The API key to use.
|
|
5
|
+
*/
|
|
6
|
+
apiKey: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Defines a class that implements {@link AIChatInterface} using the Anthropic Claude API.
|
|
10
|
+
*/
|
|
11
|
+
export declare class AnthropicAIChatInterface implements AIChatInterface {
|
|
12
|
+
private _options;
|
|
13
|
+
private _ai;
|
|
14
|
+
constructor(options: AnthropicAIChatOptions);
|
|
15
|
+
chat(request: AIChatInterfaceRequest): Promise<AIChatInterfaceResponse>;
|
|
16
|
+
chatStream(request: AIChatInterfaceRequest): AsyncIterable<AIChatInterfaceStreamResponse>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=AnthropicAIChatInterface.d.ts.map
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
8
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
9
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
10
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
11
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
12
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
13
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
17
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
18
|
+
var m = o[Symbol.asyncIterator], i;
|
|
19
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
20
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
21
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
22
|
+
};
|
|
23
|
+
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
|
|
24
|
+
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
|
|
25
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
26
|
+
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
27
|
+
return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
28
|
+
function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
|
|
29
|
+
function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
|
|
30
|
+
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
31
|
+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
|
32
|
+
function fulfill(value) { resume("next", value); }
|
|
33
|
+
function reject(value) { resume("throw", value); }
|
|
34
|
+
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
35
|
+
};
|
|
36
|
+
import { traced } from './tracing/TracingDecorators';
|
|
37
|
+
import { SpanKind, SpanStatusCode, trace, } from '@opentelemetry/api';
|
|
38
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
39
|
+
const TRACE_NAME = 'AnthropicAIChatInterface';
|
|
40
|
+
const SPAN_OPTIONS = {
|
|
41
|
+
kind: SpanKind.CLIENT,
|
|
42
|
+
attributes: {
|
|
43
|
+
'peer.service': 'anthropic',
|
|
44
|
+
'service.name': 'anthropic',
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Defines a class that implements {@link AIChatInterface} using the Anthropic Claude API.
|
|
49
|
+
*/
|
|
50
|
+
export class AnthropicAIChatInterface {
|
|
51
|
+
constructor(options) {
|
|
52
|
+
this._options = options;
|
|
53
|
+
this._ai = new Anthropic({
|
|
54
|
+
apiKey: options.apiKey,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
chat(request) {
|
|
58
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
try {
|
|
60
|
+
let maxTokens = Math.min(request.maxTokens, 4096);
|
|
61
|
+
// TODO: Support 8192 tokens for sonnet
|
|
62
|
+
// See https://docs.anthropic.com/en/docs/about-claude/models
|
|
63
|
+
// if (/claude-3-5-sonnet/.test(request.model)) {
|
|
64
|
+
// maxTokens = Math.min(request.maxTokens, 8192);
|
|
65
|
+
// }
|
|
66
|
+
const response = yield this._ai.messages.create({
|
|
67
|
+
max_tokens: maxTokens,
|
|
68
|
+
top_p: request.topP,
|
|
69
|
+
temperature: request.temperature,
|
|
70
|
+
stop_sequences: request.stopWords,
|
|
71
|
+
model: request.model,
|
|
72
|
+
messages: request.messages.map((m) => mapMessage(m)),
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
choices: [
|
|
76
|
+
{
|
|
77
|
+
content: mapOutputContent(response.content),
|
|
78
|
+
role: response.role,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
totalTokens: response.usage.input_tokens + response.usage.output_tokens,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
const span = trace.getActiveSpan();
|
|
86
|
+
span === null || span === void 0 ? void 0 : span.recordException(err);
|
|
87
|
+
span === null || span === void 0 ? void 0 : span.setStatus({ code: SpanStatusCode.ERROR });
|
|
88
|
+
if (err instanceof Error) {
|
|
89
|
+
console.error('[AnthropicAIChatInterface] Error occurred while generating content.', err);
|
|
90
|
+
return {
|
|
91
|
+
choices: [
|
|
92
|
+
{
|
|
93
|
+
role: 'system',
|
|
94
|
+
content: `Error: ${err.message}`,
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
totalTokens: 0,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
chatStream(request) {
|
|
105
|
+
return __asyncGenerator(this, arguments, function* chatStream_1() {
|
|
106
|
+
var _a, e_1, _b, _c;
|
|
107
|
+
try {
|
|
108
|
+
let maxTokens = Math.min(request.maxTokens, 4096);
|
|
109
|
+
// TODO: Support 8192 tokens for sonnet
|
|
110
|
+
// See https://docs.anthropic.com/en/docs/about-claude/models
|
|
111
|
+
// if (/claude-3-5-sonnet/.test(request.model)) {
|
|
112
|
+
// maxTokens = Math.min(request.maxTokens, 8192);
|
|
113
|
+
// }
|
|
114
|
+
const response = this._ai.messages.stream({
|
|
115
|
+
max_tokens: maxTokens,
|
|
116
|
+
top_p: request.topP,
|
|
117
|
+
temperature: request.temperature,
|
|
118
|
+
stop_sequences: request.stopWords,
|
|
119
|
+
model: request.model,
|
|
120
|
+
messages: request.messages.map((m) => mapMessage(m)),
|
|
121
|
+
});
|
|
122
|
+
try {
|
|
123
|
+
for (var _d = true, response_1 = __asyncValues(response), response_1_1; response_1_1 = yield __await(response_1.next()), _a = response_1_1.done, !_a; _d = true) {
|
|
124
|
+
_c = response_1_1.value;
|
|
125
|
+
_d = false;
|
|
126
|
+
const chunk = _c;
|
|
127
|
+
if (chunk.type === 'message_start') {
|
|
128
|
+
yield yield __await({
|
|
129
|
+
choices: [],
|
|
130
|
+
totalTokens: chunk.message.usage.input_tokens +
|
|
131
|
+
chunk.message.usage.output_tokens,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
else if (chunk.type === 'content_block_delta') {
|
|
135
|
+
if (chunk.delta.type === 'text_delta') {
|
|
136
|
+
yield yield __await({
|
|
137
|
+
choices: [
|
|
138
|
+
{
|
|
139
|
+
content: chunk.delta.text,
|
|
140
|
+
role: 'assistant',
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
totalTokens: 0,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
150
|
+
finally {
|
|
151
|
+
try {
|
|
152
|
+
if (!_d && !_a && (_b = response_1.return)) yield __await(_b.call(response_1));
|
|
153
|
+
}
|
|
154
|
+
finally { if (e_1) throw e_1.error; }
|
|
155
|
+
}
|
|
156
|
+
return yield __await({
|
|
157
|
+
choices: [],
|
|
158
|
+
totalTokens: 0,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
const span = trace.getActiveSpan();
|
|
163
|
+
span === null || span === void 0 ? void 0 : span.recordException(err);
|
|
164
|
+
span === null || span === void 0 ? void 0 : span.setStatus({ code: SpanStatusCode.ERROR });
|
|
165
|
+
if (err instanceof Error) {
|
|
166
|
+
console.error('[AnthropicAIChatInterface] Error occurred while generating content.', err);
|
|
167
|
+
yield yield __await({
|
|
168
|
+
choices: [
|
|
169
|
+
{
|
|
170
|
+
role: 'system',
|
|
171
|
+
content: `Error: ${err.message}`,
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
totalTokens: 0,
|
|
175
|
+
});
|
|
176
|
+
return yield __await({
|
|
177
|
+
choices: [],
|
|
178
|
+
totalTokens: 0,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
__decorate([
|
|
187
|
+
traced(TRACE_NAME, SPAN_OPTIONS)
|
|
188
|
+
], AnthropicAIChatInterface.prototype, "chat", null);
|
|
189
|
+
__decorate([
|
|
190
|
+
traced(TRACE_NAME, SPAN_OPTIONS)
|
|
191
|
+
], AnthropicAIChatInterface.prototype, "chatStream", null);
|
|
192
|
+
function mapMessage(message) {
|
|
193
|
+
return {
|
|
194
|
+
role: message.role === 'user' || message.role === 'system'
|
|
195
|
+
? 'user'
|
|
196
|
+
: 'assistant',
|
|
197
|
+
content: mapContent(message.content),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function mapContent(content) {
|
|
201
|
+
if (typeof content === 'string') {
|
|
202
|
+
return content;
|
|
203
|
+
}
|
|
204
|
+
return content.map((c) => {
|
|
205
|
+
if ('text' in c) {
|
|
206
|
+
return {
|
|
207
|
+
type: 'text',
|
|
208
|
+
text: c.text,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
else if ('base64' in c) {
|
|
212
|
+
return {
|
|
213
|
+
type: 'image',
|
|
214
|
+
source: {
|
|
215
|
+
data: c.base64,
|
|
216
|
+
media_type: c.mimeType,
|
|
217
|
+
type: 'base64',
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
throw new Error('URL content is not supported for Anthropic Claude models');
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
function mapOutputContent(content) {
|
|
225
|
+
if (content.length === 1 && content[0].type === 'text') {
|
|
226
|
+
return content[0].text;
|
|
227
|
+
}
|
|
228
|
+
return content
|
|
229
|
+
.map((c) => {
|
|
230
|
+
if (c.type === 'text') {
|
|
231
|
+
return {
|
|
232
|
+
text: c.text,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
})
|
|
236
|
+
.filter((c) => !!c);
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=AnthropicAIChatInterface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnthropicAIChatInterface.js","sourceRoot":"","sources":["AnthropicAIChatInterface.ts"],"names":[],"mappings":"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"}
|
package/AuthController.d.ts
CHANGED
|
@@ -100,6 +100,7 @@ export declare class AuthController {
|
|
|
100
100
|
set relyingParties(value: RelyingParty[]);
|
|
101
101
|
constructor(authStore: AuthStore, messenger: AuthMessenger, configStore: ConfigurationStore, forceAllowSubscriptionFeatures?: boolean, privoClient?: PrivoClientInterface, relyingParties?: RelyingParty[]);
|
|
102
102
|
createAccount(request: CreateAccountRequest): Promise<CreateAccountResult>;
|
|
103
|
+
hashHighEntropyPasswordWithSalt(sessionSecret: string, sessionId: string): string;
|
|
103
104
|
requestLogin(request: LoginRequest): Promise<LoginRequestResult>;
|
|
104
105
|
private _validateAddress;
|
|
105
106
|
completeLogin(request: CompleteLoginRequest): Promise<CompleteLoginResult>;
|
|
@@ -114,6 +115,7 @@ export declare class AuthController {
|
|
|
114
115
|
listUserAuthenticators(userId: string): Promise<ListUserAuthenticatorsResult>;
|
|
115
116
|
deleteUserAuthenticator(userId: string, authenticatorId: string): Promise<DeleteUserAuthenticatorResult>;
|
|
116
117
|
validateSessionKey(key: string): Promise<ValidateSessionKeyResult>;
|
|
118
|
+
verifyPasswordAgainstHashes(sessionSecret: string, sessionId: string, hashes: string[]): boolean;
|
|
117
119
|
validateConnectionToken(token: string): Promise<ValidateConnectionTokenResult>;
|
|
118
120
|
revokeSession(request: RevokeSessionRequest): Promise<RevokeSessionResult>;
|
|
119
121
|
/**
|
package/AuthController.js
CHANGED
|
@@ -15,7 +15,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
15
15
|
};
|
|
16
16
|
import { v4 as uuid } from 'uuid';
|
|
17
17
|
import { randomBytes } from 'tweetnacl';
|
|
18
|
-
import { hashHighEntropyPasswordWithSalt,
|
|
18
|
+
import { hashHighEntropyPasswordWithSalt, hashLowEntropyPasswordWithSalt, verifyPasswordAgainstHashes, } from './InstrumentedHashHelpers';
|
|
19
19
|
import { fromByteArray } from 'base64-js';
|
|
20
20
|
import { cleanupObject, isActiveSubscription, isStringValid, } from './Utils';
|
|
21
21
|
import { formatV1ConnectionKey, formatV1SessionKey, isSuperUserRole, parseSessionKey, randomCode, verifyConnectionToken, } from './AuthUtils';
|
|
@@ -141,7 +141,7 @@ export class AuthController {
|
|
|
141
141
|
requestId: null,
|
|
142
142
|
// sessionSecret and sessionId are high-entropy (128 bits of random data)
|
|
143
143
|
// so we should use a hash that is optimized for high-entropy inputs.
|
|
144
|
-
secretHash: hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
|
|
144
|
+
secretHash: this.hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
|
|
145
145
|
connectionSecret: connectionSecret,
|
|
146
146
|
grantedTimeMs: now,
|
|
147
147
|
revokeTimeMs: null,
|
|
@@ -173,6 +173,9 @@ export class AuthController {
|
|
|
173
173
|
}
|
|
174
174
|
});
|
|
175
175
|
}
|
|
176
|
+
hashHighEntropyPasswordWithSalt(sessionSecret, sessionId) {
|
|
177
|
+
return hashHighEntropyPasswordWithSalt(sessionSecret, sessionId);
|
|
178
|
+
}
|
|
176
179
|
requestLogin(request) {
|
|
177
180
|
return __awaiter(this, void 0, void 0, function* () {
|
|
178
181
|
if (typeof request.address !== 'string' || request.address === '') {
|
|
@@ -263,7 +266,7 @@ export class AuthController {
|
|
|
263
266
|
const requestTime = Date.now();
|
|
264
267
|
const requestId = fromByteArray(randomBytes(LOGIN_REQUEST_ID_BYTE_LENGTH));
|
|
265
268
|
const code = randomCode();
|
|
266
|
-
const hash =
|
|
269
|
+
const hash = hashLowEntropyPasswordWithSalt(code, requestId);
|
|
267
270
|
const loginRequest = {
|
|
268
271
|
userId: user.id,
|
|
269
272
|
requestId: requestId,
|
|
@@ -407,7 +410,7 @@ export class AuthController {
|
|
|
407
410
|
}
|
|
408
411
|
let validCode = false;
|
|
409
412
|
try {
|
|
410
|
-
if (verifyPasswordAgainstHashes(request.code, loginRequest.requestId, [loginRequest.secretHash])) {
|
|
413
|
+
if (this.verifyPasswordAgainstHashes(request.code, loginRequest.requestId, [loginRequest.secretHash])) {
|
|
411
414
|
validCode = true;
|
|
412
415
|
}
|
|
413
416
|
}
|
|
@@ -447,7 +450,7 @@ export class AuthController {
|
|
|
447
450
|
requestId: loginRequest.requestId,
|
|
448
451
|
// sessionSecret and sessionId are high-entropy (128 bits of random data)
|
|
449
452
|
// so we should use a hash that is optimized for high-entropy inputs.
|
|
450
|
-
secretHash: hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
|
|
453
|
+
secretHash: this.hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
|
|
451
454
|
connectionSecret: connectionSecret,
|
|
452
455
|
grantedTimeMs: now,
|
|
453
456
|
revokeTimeMs: null,
|
|
@@ -735,7 +738,7 @@ export class AuthController {
|
|
|
735
738
|
oidRequestId: loginRequest.requestId,
|
|
736
739
|
// sessionSecret and sessionId are high-entropy (128 bits of random data)
|
|
737
740
|
// so we should use a hash that is optimized for high-entropy inputs.
|
|
738
|
-
secretHash: hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
|
|
741
|
+
secretHash: this.hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
|
|
739
742
|
connectionSecret: connectionSecret,
|
|
740
743
|
grantedTimeMs: now,
|
|
741
744
|
revokeTimeMs: null,
|
|
@@ -906,7 +909,7 @@ export class AuthController {
|
|
|
906
909
|
userId: userId,
|
|
907
910
|
sessionId: newSessionId,
|
|
908
911
|
requestId: null,
|
|
909
|
-
secretHash:
|
|
912
|
+
secretHash: hashHighEntropyPasswordWithSalt(newSessionSecret, newSessionId),
|
|
910
913
|
connectionSecret: newConnectionSecret,
|
|
911
914
|
grantedTimeMs: nowMs,
|
|
912
915
|
revokeTimeMs: null,
|
|
@@ -1247,7 +1250,7 @@ export class AuthController {
|
|
|
1247
1250
|
webauthnRequestId: loginRequest.requestId,
|
|
1248
1251
|
// sessionSecret and sessionId are high-entropy (128 bits of random data)
|
|
1249
1252
|
// so we should use a hash that is optimized for high-entropy inputs.
|
|
1250
|
-
secretHash: hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
|
|
1253
|
+
secretHash: this.hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
|
|
1251
1254
|
connectionSecret: connectionSecret,
|
|
1252
1255
|
grantedTimeMs: now,
|
|
1253
1256
|
revokeTimeMs: null,
|
|
@@ -1383,9 +1386,7 @@ export class AuthController {
|
|
|
1383
1386
|
errorMessage: INVALID_KEY_ERROR_MESSAGE,
|
|
1384
1387
|
};
|
|
1385
1388
|
}
|
|
1386
|
-
if (!verifyPasswordAgainstHashes(sessionSecret, session.sessionId, [
|
|
1387
|
-
session.secretHash,
|
|
1388
|
-
])) {
|
|
1389
|
+
if (!this.verifyPasswordAgainstHashes(sessionSecret, session.sessionId, [session.secretHash])) {
|
|
1389
1390
|
console.log('[AuthController] [validateSessionKey] Session secret was invalid.');
|
|
1390
1391
|
return {
|
|
1391
1392
|
success: false,
|
|
@@ -1466,6 +1467,9 @@ export class AuthController {
|
|
|
1466
1467
|
}
|
|
1467
1468
|
});
|
|
1468
1469
|
}
|
|
1470
|
+
verifyPasswordAgainstHashes(sessionSecret, sessionId, hashes) {
|
|
1471
|
+
return verifyPasswordAgainstHashes(sessionSecret, sessionId, hashes);
|
|
1472
|
+
}
|
|
1469
1473
|
validateConnectionToken(token) {
|
|
1470
1474
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1471
1475
|
if (typeof token !== 'string' || token === '') {
|
|
@@ -1766,7 +1770,7 @@ export class AuthController {
|
|
|
1766
1770
|
userId: userId,
|
|
1767
1771
|
sessionId: newSessionId,
|
|
1768
1772
|
requestId: null,
|
|
1769
|
-
secretHash:
|
|
1773
|
+
secretHash: hashHighEntropyPasswordWithSalt(newSessionSecret, newSessionId),
|
|
1770
1774
|
connectionSecret: newConnectionSecret,
|
|
1771
1775
|
grantedTimeMs: now,
|
|
1772
1776
|
revokeTimeMs: null,
|
|
@@ -2277,6 +2281,9 @@ export class AuthController {
|
|
|
2277
2281
|
__decorate([
|
|
2278
2282
|
traced(TRACE_NAME)
|
|
2279
2283
|
], AuthController.prototype, "createAccount", null);
|
|
2284
|
+
__decorate([
|
|
2285
|
+
traced(TRACE_NAME)
|
|
2286
|
+
], AuthController.prototype, "hashHighEntropyPasswordWithSalt", null);
|
|
2280
2287
|
__decorate([
|
|
2281
2288
|
traced(TRACE_NAME)
|
|
2282
2289
|
], AuthController.prototype, "requestLogin", null);
|
|
@@ -2316,6 +2323,9 @@ __decorate([
|
|
|
2316
2323
|
__decorate([
|
|
2317
2324
|
traced(TRACE_NAME)
|
|
2318
2325
|
], AuthController.prototype, "validateSessionKey", null);
|
|
2326
|
+
__decorate([
|
|
2327
|
+
traced(TRACE_NAME)
|
|
2328
|
+
], AuthController.prototype, "verifyPasswordAgainstHashes", null);
|
|
2319
2329
|
__decorate([
|
|
2320
2330
|
traced(TRACE_NAME)
|
|
2321
2331
|
], AuthController.prototype, "validateConnectionToken", null);
|