mirror of
https://github.com/shuaiplus/nodewarden.git
synced 2026-08-05 06:50:10 +00:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bbbad40bba | ||
|
|
6ffdf05dc6 |
@@ -15,6 +15,7 @@
|
|||||||
"domains:sync": "node scripts/sync-global-domains.mjs",
|
"domains:sync": "node scripts/sync-global-domains.mjs",
|
||||||
"i18n": "node scripts/i18n-validate.cjs",
|
"i18n": "node scripts/i18n-validate.cjs",
|
||||||
"i18n:validate": "node scripts/i18n-validate.cjs",
|
"i18n:validate": "node scripts/i18n-validate.cjs",
|
||||||
|
"test:config-compatibility": "tsx --test scripts/config-compatibility.test.ts",
|
||||||
"test:web-crypto": "tsx --test scripts/web-crypto-availability.test.ts",
|
"test:web-crypto": "tsx --test scripts/web-crypto-availability.test.ts",
|
||||||
"test:webauthn-mobile": "node --test scripts/webauthn-mobile-connector.test.mjs",
|
"test:webauthn-mobile": "node --test scripts/webauthn-mobile-connector.test.mjs",
|
||||||
"test:webauthn-connector": "node --test scripts/webauthn-connector.test.mjs && tsx --test scripts/webauthn-connector-headers.test.ts",
|
"test:webauthn-connector": "node --test scripts/webauthn-connector.test.mjs && tsx --test scripts/webauthn-connector-headers.test.ts",
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import test from 'node:test';
|
||||||
|
|
||||||
|
import { buildConfigResponse } from '../src/config-response';
|
||||||
|
|
||||||
|
test('config enables the official Bitwarden desktop settings dialog', () => {
|
||||||
|
const body = buildConfigResponse('https://vault.example.test');
|
||||||
|
|
||||||
|
assert.equal(body.featureStates['desktop-ui-settings-dialog'], true);
|
||||||
|
assert.equal(body.environment.vault, 'https://vault.example.test');
|
||||||
|
assert.equal(body.object, 'config');
|
||||||
|
});
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
import { LIMITS } from './config/limits';
|
||||||
|
|
||||||
|
function buildIconServiceTemplate(origin: string): string {
|
||||||
|
return `${origin}/icons/{}/icon.png`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildIconServiceCsp(origin: string): string {
|
||||||
|
return `img-src 'self' data: ${origin}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function buildConfigResponse(origin: string) {
|
||||||
|
const fillAssistBase = `${origin}/fill-assist/`;
|
||||||
|
return {
|
||||||
|
version: LIMITS.compatibility.bitwardenServerVersion,
|
||||||
|
gitHash: 'nodewarden',
|
||||||
|
server: null,
|
||||||
|
environment: {
|
||||||
|
cloudRegion: 'self-hosted',
|
||||||
|
vault: origin,
|
||||||
|
api: origin + '/api',
|
||||||
|
identity: origin + '/identity',
|
||||||
|
notifications: origin + '/notifications',
|
||||||
|
icons: origin,
|
||||||
|
sso: '',
|
||||||
|
fillAssistRules: fillAssistBase,
|
||||||
|
},
|
||||||
|
push: {
|
||||||
|
pushTechnology: 0,
|
||||||
|
vapidPublicKey: null,
|
||||||
|
},
|
||||||
|
communication: null,
|
||||||
|
settings: {
|
||||||
|
disableUserRegistration: false,
|
||||||
|
},
|
||||||
|
_icon_service_url: buildIconServiceTemplate(origin),
|
||||||
|
_icon_service_csp: buildIconServiceCsp(origin),
|
||||||
|
featureStates: {
|
||||||
|
'cipher-key-encryption': LIMITS.compatibility.cipherKeyEncryptionFeatureEnabled,
|
||||||
|
'desktop-ui-settings-dialog': true,
|
||||||
|
'duo-redirect': true,
|
||||||
|
'email-verification': true,
|
||||||
|
'fill-assist-targeting-rules': true,
|
||||||
|
'pm-19051-send-email-verification': false,
|
||||||
|
'pm-19148-innovation-archive': true,
|
||||||
|
'pm-4516-devices-add-last-activity-date': true,
|
||||||
|
'pm-30529-webauthn-related-origins': true,
|
||||||
|
'unauth-ui-refresh': true,
|
||||||
|
'web-push': false,
|
||||||
|
},
|
||||||
|
object: 'config',
|
||||||
|
};
|
||||||
|
}
|
||||||
+1
-54
@@ -36,6 +36,7 @@ import { jsonResponse, unsupportedResponse } from './utils/response';
|
|||||||
import { StorageService } from './services/storage';
|
import { StorageService } from './services/storage';
|
||||||
import type { Env } from './types';
|
import type { Env } from './types';
|
||||||
import { getConfiguredWebAuthnAllowedOrigins } from './utils/origins';
|
import { getConfiguredWebAuthnAllowedOrigins } from './utils/origins';
|
||||||
|
import { buildConfigResponse } from './config-response';
|
||||||
|
|
||||||
type PublicRateLimiter = (category?: string, maxRequests?: number) => Promise<Response | null>;
|
type PublicRateLimiter = (category?: string, maxRequests?: number) => Promise<Response | null>;
|
||||||
type JwtUnsafeReason = 'missing' | 'too_short' | null;
|
type JwtUnsafeReason = 'missing' | 'too_short' | null;
|
||||||
@@ -95,60 +96,6 @@ function handleMissingWebsiteIcon(): Response {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildIconServiceBase(origin: string): string {
|
|
||||||
return `${origin}/icons`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildIconServiceTemplate(origin: string): string {
|
|
||||||
return `${buildIconServiceBase(origin)}/{}/icon.png`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildIconServiceCsp(origin: string): string {
|
|
||||||
return `img-src 'self' data: ${origin}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildConfigResponse(origin: string) {
|
|
||||||
const fillAssistBase = `${origin}/fill-assist/`;
|
|
||||||
return {
|
|
||||||
version: LIMITS.compatibility.bitwardenServerVersion,
|
|
||||||
gitHash: 'nodewarden',
|
|
||||||
server: null,
|
|
||||||
environment: {
|
|
||||||
cloudRegion: 'self-hosted',
|
|
||||||
vault: origin,
|
|
||||||
api: origin + '/api',
|
|
||||||
identity: origin + '/identity',
|
|
||||||
notifications: origin + '/notifications',
|
|
||||||
icons: origin,
|
|
||||||
sso: '',
|
|
||||||
fillAssistRules: fillAssistBase,
|
|
||||||
},
|
|
||||||
push: {
|
|
||||||
pushTechnology: 0,
|
|
||||||
vapidPublicKey: null,
|
|
||||||
},
|
|
||||||
communication: null,
|
|
||||||
settings: {
|
|
||||||
disableUserRegistration: false,
|
|
||||||
},
|
|
||||||
_icon_service_url: buildIconServiceTemplate(origin),
|
|
||||||
_icon_service_csp: buildIconServiceCsp(origin),
|
|
||||||
featureStates: {
|
|
||||||
'cipher-key-encryption': LIMITS.compatibility.cipherKeyEncryptionFeatureEnabled,
|
|
||||||
'duo-redirect': true,
|
|
||||||
'email-verification': true,
|
|
||||||
'fill-assist-targeting-rules': true,
|
|
||||||
'pm-19051-send-email-verification': false,
|
|
||||||
'pm-19148-innovation-archive': true,
|
|
||||||
'pm-4516-devices-add-last-activity-date': true,
|
|
||||||
'pm-30529-webauthn-related-origins': true,
|
|
||||||
'unauth-ui-refresh': true,
|
|
||||||
'web-push': false,
|
|
||||||
},
|
|
||||||
object: 'config',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function normalizeIconHost(rawHost: string): string | null {
|
function normalizeIconHost(rawHost: string): string | null {
|
||||||
let decoded: string;
|
let decoded: string;
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user