@passwd/passwd-lib 1.1.0
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/dist/api.d.ts +23 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +146 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +11 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +218 -0
- package/dist/auth.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +116 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +34 -0
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Secret, SecretListItem, TOTPResponse, ShareResponse, UserProfile, GroupInfo, ContactInfo } from "./types.js";
|
|
2
|
+
export interface ListSecretsParams {
|
|
3
|
+
query?: string;
|
|
4
|
+
secretType?: string;
|
|
5
|
+
offset?: number;
|
|
6
|
+
limit?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ListSecretsResult {
|
|
9
|
+
secrets: SecretListItem[];
|
|
10
|
+
totalCount: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function listSecrets(params?: ListSecretsParams): Promise<ListSecretsResult>;
|
|
13
|
+
export declare function getSecret(id: string): Promise<Secret>;
|
|
14
|
+
export declare function createSecret(secret: Partial<Secret>): Promise<Secret>;
|
|
15
|
+
export declare function updateSecret(id: string, updates: Partial<Secret>): Promise<Secret>;
|
|
16
|
+
export declare function deleteSecret(id: string): Promise<void>;
|
|
17
|
+
export declare function getTotpCode(id: string): Promise<TOTPResponse>;
|
|
18
|
+
export declare function enableSharing(id: string): Promise<ShareResponse>;
|
|
19
|
+
export declare function revokeSharing(id: string): Promise<void>;
|
|
20
|
+
export declare function listGroups(): Promise<GroupInfo[]>;
|
|
21
|
+
export declare function listContacts(): Promise<ContactInfo[]>;
|
|
22
|
+
export declare function getCurrentUser(): Promise<UserProfile>;
|
|
23
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,MAAM,EACN,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,WAAW,EACZ,MAAM,YAAY,CAAC;AAoDpB,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,WAAW,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2C5F;AAED,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG3D;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAO3E;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAOxF;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ5D;AAID,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAGnE;AAID,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAKtE;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7D;AAID,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAIvD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAI3D;AAID,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAG3D"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { getApiUrl, getAccessToken, refreshToken, loadTokens } from "./auth.js";
|
|
2
|
+
async function authFetch(path, options = {}, baseVersion = "v2", retry = true) {
|
|
3
|
+
const apiUrl = await getApiUrl();
|
|
4
|
+
const token = await getAccessToken();
|
|
5
|
+
const url = `${apiUrl}/${baseVersion}${path}`;
|
|
6
|
+
const response = await fetch(url, {
|
|
7
|
+
...options,
|
|
8
|
+
headers: {
|
|
9
|
+
...options.headers,
|
|
10
|
+
Authorization: `Bearer ${token}`,
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
if (response.status === 401 && retry) {
|
|
14
|
+
// Try refreshing the token
|
|
15
|
+
try {
|
|
16
|
+
const tokens = await loadTokens();
|
|
17
|
+
if (!tokens)
|
|
18
|
+
throw new Error("No tokens");
|
|
19
|
+
const newTokens = await refreshToken(tokens);
|
|
20
|
+
const retryResponse = await fetch(url, {
|
|
21
|
+
...options,
|
|
22
|
+
headers: {
|
|
23
|
+
...options.headers,
|
|
24
|
+
Authorization: `Bearer ${newTokens.access_token}`,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
return retryResponse;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error("Authentication expired. Please re-authenticate.");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return response;
|
|
34
|
+
}
|
|
35
|
+
async function handleResponse(response) {
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
const text = await response.text();
|
|
38
|
+
throw new Error(`API error (${response.status}): ${text}`);
|
|
39
|
+
}
|
|
40
|
+
return response.json();
|
|
41
|
+
}
|
|
42
|
+
export async function listSecrets(params = {}) {
|
|
43
|
+
// The API does not support query parameters for filtering/pagination,
|
|
44
|
+
// so we fetch all secrets and filter/paginate client-side.
|
|
45
|
+
const response = await authFetch("/secrets", {}, "v3");
|
|
46
|
+
const data = await handleResponse(response);
|
|
47
|
+
// API may return object keyed by id or array
|
|
48
|
+
let secrets;
|
|
49
|
+
if (Array.isArray(data)) {
|
|
50
|
+
secrets = data;
|
|
51
|
+
}
|
|
52
|
+
else if (data && typeof data === "object") {
|
|
53
|
+
secrets = Object.values(data);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
secrets = [];
|
|
57
|
+
}
|
|
58
|
+
// Client-side filtering by secret type
|
|
59
|
+
if (params.secretType) {
|
|
60
|
+
secrets = secrets.filter((s) => s.type === params.secretType);
|
|
61
|
+
}
|
|
62
|
+
// Client-side filtering by query (case-insensitive match on name, username, or web)
|
|
63
|
+
if (params.query) {
|
|
64
|
+
const q = params.query.toLowerCase();
|
|
65
|
+
secrets = secrets.filter((s) => s.name?.toLowerCase().includes(q) ||
|
|
66
|
+
s.username?.toLowerCase().includes(q) ||
|
|
67
|
+
s.web?.toLowerCase().includes(q));
|
|
68
|
+
}
|
|
69
|
+
const totalCount = secrets.length;
|
|
70
|
+
// Client-side pagination
|
|
71
|
+
const offset = params.offset ?? 0;
|
|
72
|
+
if (params.limit !== undefined) {
|
|
73
|
+
secrets = secrets.slice(offset, offset + params.limit);
|
|
74
|
+
}
|
|
75
|
+
else if (offset > 0) {
|
|
76
|
+
secrets = secrets.slice(offset);
|
|
77
|
+
}
|
|
78
|
+
return { secrets, totalCount };
|
|
79
|
+
}
|
|
80
|
+
export async function getSecret(id) {
|
|
81
|
+
const response = await authFetch(`/secrets/${encodeURIComponent(id)}`);
|
|
82
|
+
return handleResponse(response);
|
|
83
|
+
}
|
|
84
|
+
export async function createSecret(secret) {
|
|
85
|
+
const response = await authFetch("/secrets", {
|
|
86
|
+
method: "POST",
|
|
87
|
+
headers: { "Content-Type": "application/json" },
|
|
88
|
+
body: JSON.stringify(secret),
|
|
89
|
+
});
|
|
90
|
+
return handleResponse(response);
|
|
91
|
+
}
|
|
92
|
+
export async function updateSecret(id, updates) {
|
|
93
|
+
const response = await authFetch(`/secrets/${encodeURIComponent(id)}`, {
|
|
94
|
+
method: "PUT",
|
|
95
|
+
headers: { "Content-Type": "application/json" },
|
|
96
|
+
body: JSON.stringify(updates),
|
|
97
|
+
});
|
|
98
|
+
return handleResponse(response);
|
|
99
|
+
}
|
|
100
|
+
export async function deleteSecret(id) {
|
|
101
|
+
const response = await authFetch(`/secrets/${encodeURIComponent(id)}`, {
|
|
102
|
+
method: "DELETE",
|
|
103
|
+
});
|
|
104
|
+
if (!response.ok) {
|
|
105
|
+
const text = await response.text();
|
|
106
|
+
throw new Error(`Delete failed (${response.status}): ${text}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// --- TOTP ---
|
|
110
|
+
export async function getTotpCode(id) {
|
|
111
|
+
const response = await authFetch(`/secrets/${encodeURIComponent(id)}/TOTP`);
|
|
112
|
+
return handleResponse(response);
|
|
113
|
+
}
|
|
114
|
+
// --- Sharing ---
|
|
115
|
+
export async function enableSharing(id) {
|
|
116
|
+
const response = await authFetch(`/secrets/${encodeURIComponent(id)}/share`, {
|
|
117
|
+
method: "POST",
|
|
118
|
+
});
|
|
119
|
+
return handleResponse(response);
|
|
120
|
+
}
|
|
121
|
+
export async function revokeSharing(id) {
|
|
122
|
+
const response = await authFetch(`/secrets/${encodeURIComponent(id)}/share`, {
|
|
123
|
+
method: "DELETE",
|
|
124
|
+
});
|
|
125
|
+
if (!response.ok) {
|
|
126
|
+
const text = await response.text();
|
|
127
|
+
throw new Error(`Revoke sharing failed (${response.status}): ${text}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// --- Groups & Contacts ---
|
|
131
|
+
export async function listGroups() {
|
|
132
|
+
const response = await authFetch("/groups-query");
|
|
133
|
+
const data = await handleResponse(response);
|
|
134
|
+
return data.data;
|
|
135
|
+
}
|
|
136
|
+
export async function listContacts() {
|
|
137
|
+
const response = await authFetch("/contacts-query");
|
|
138
|
+
const data = await handleResponse(response);
|
|
139
|
+
return data.data;
|
|
140
|
+
}
|
|
141
|
+
// --- User ---
|
|
142
|
+
export async function getCurrentUser() {
|
|
143
|
+
const response = await authFetch("/me");
|
|
144
|
+
return handleResponse(response);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AuthTokens } from "./types.js";
|
|
2
|
+
export declare function getApiUrl(): Promise<string>;
|
|
3
|
+
export declare function buildOAuthUrl(): Promise<string>;
|
|
4
|
+
export declare function extractCodeFromRedirectUrl(redirectUrl: string): string;
|
|
5
|
+
export declare function exchangeCode(code: string): Promise<AuthTokens>;
|
|
6
|
+
export declare function refreshToken(tokens: AuthTokens): Promise<AuthTokens>;
|
|
7
|
+
export declare function resetDiscoveryCache(): void;
|
|
8
|
+
export declare function getTokenDir(): string;
|
|
9
|
+
export declare function loadTokens(): Promise<AuthTokens | null>;
|
|
10
|
+
export declare function getAccessToken(): Promise<string>;
|
|
11
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAgF7C,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAUjD;AAQD,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAcrD;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAkBtE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA0BpE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAmC1E;AAaD,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAa7D;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAiBtD"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir, chmod } from "node:fs/promises";
|
|
2
|
+
import { randomUUID, createHash } from "node:crypto";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
const GOOGLE_AUTH_ORIGIN = "https://accounts.google.com/o/oauth2/v2/auth";
|
|
6
|
+
const SCOPES = "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email";
|
|
7
|
+
const TOKEN_DIR = join(homedir(), ".passwd");
|
|
8
|
+
function getTokenFile() {
|
|
9
|
+
const origin = getOrigin();
|
|
10
|
+
const hash = createHash("sha256").update(origin).digest("hex").slice(0, 12);
|
|
11
|
+
return join(TOKEN_DIR, `tokens-${hash}.json`);
|
|
12
|
+
}
|
|
13
|
+
function requireHttps(url, label) {
|
|
14
|
+
if (!url.startsWith("https://") &&
|
|
15
|
+
!url.startsWith("http://localhost") &&
|
|
16
|
+
!url.startsWith("http://127.0.0.1")) {
|
|
17
|
+
throw new Error(`${label} must use HTTPS (or http://localhost for development), got: ${url}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function getOrigin() {
|
|
21
|
+
const origin = process.env.PASSWD_ORIGIN;
|
|
22
|
+
if (!origin) {
|
|
23
|
+
throw new Error("PASSWD_ORIGIN environment variable is required (e.g. https://your-company.passwd.team)");
|
|
24
|
+
}
|
|
25
|
+
const normalized = origin.replace(/\/+$/, "");
|
|
26
|
+
requireHttps(normalized, "PASSWD_ORIGIN");
|
|
27
|
+
return normalized;
|
|
28
|
+
}
|
|
29
|
+
let _discoveredApiUrl = null;
|
|
30
|
+
let _discoveredClientId = null;
|
|
31
|
+
let _discoveryDone = false;
|
|
32
|
+
async function discoverFromOrigin(origin) {
|
|
33
|
+
if (_discoveryDone)
|
|
34
|
+
return;
|
|
35
|
+
_discoveryDone = true;
|
|
36
|
+
try {
|
|
37
|
+
const response = await fetch(origin, { headers: { Accept: "text/html" } });
|
|
38
|
+
const html = await response.text();
|
|
39
|
+
// Discover API URL from <meta name="app-api" content="...">
|
|
40
|
+
const apiMatch = html.match(/<meta\s+name=["']app-api["']\s+content=["']([^"']+)["']/i);
|
|
41
|
+
if (apiMatch?.[1]) {
|
|
42
|
+
const discovered = apiMatch[1].replace(/\/+$/, "");
|
|
43
|
+
requireHttps(discovered, "Discovered API URL");
|
|
44
|
+
_discoveredApiUrl = discovered;
|
|
45
|
+
}
|
|
46
|
+
// Discover client ID from the JS bundle
|
|
47
|
+
const scriptMatch = html.match(/src=["']([^"']*index[^"']*\.js)["']/i);
|
|
48
|
+
if (scriptMatch?.[1]) {
|
|
49
|
+
const scriptUrl = new URL(scriptMatch[1], origin).href;
|
|
50
|
+
const jsResponse = await fetch(scriptUrl);
|
|
51
|
+
const js = await jsResponse.text();
|
|
52
|
+
const clientIdMatch = js.match(/(\d+-[a-z0-9]+\.apps\.googleusercontent\.com)/);
|
|
53
|
+
if (clientIdMatch?.[1]) {
|
|
54
|
+
_discoveredClientId = clientIdMatch[1];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Fall through to defaults/env vars
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function getClientId() {
|
|
63
|
+
if (process.env.PASSWD_CLIENT_ID)
|
|
64
|
+
return process.env.PASSWD_CLIENT_ID;
|
|
65
|
+
await discoverFromOrigin(getOrigin());
|
|
66
|
+
if (_discoveredClientId)
|
|
67
|
+
return _discoveredClientId;
|
|
68
|
+
throw new Error("Could not discover Google OAuth client ID from the deployment. Set PASSWD_CLIENT_ID env var manually.");
|
|
69
|
+
}
|
|
70
|
+
export async function getApiUrl() {
|
|
71
|
+
const envUrl = process.env.PASSWD_API_URL;
|
|
72
|
+
if (envUrl) {
|
|
73
|
+
const normalized = envUrl.replace(/\/+$/, "");
|
|
74
|
+
requireHttps(normalized, "PASSWD_API_URL");
|
|
75
|
+
return normalized;
|
|
76
|
+
}
|
|
77
|
+
await discoverFromOrigin(getOrigin());
|
|
78
|
+
return _discoveredApiUrl || `${getOrigin()}/api`;
|
|
79
|
+
}
|
|
80
|
+
function getRedirectUri() {
|
|
81
|
+
return `${getOrigin()}/oauth/redirect`;
|
|
82
|
+
}
|
|
83
|
+
let _pendingOAuthState = null;
|
|
84
|
+
export async function buildOAuthUrl() {
|
|
85
|
+
const state = randomUUID();
|
|
86
|
+
_pendingOAuthState = state;
|
|
87
|
+
const clientId = await getClientId();
|
|
88
|
+
const url = new URL(GOOGLE_AUTH_ORIGIN);
|
|
89
|
+
url.searchParams.set("client_id", clientId);
|
|
90
|
+
url.searchParams.set("redirect_uri", getRedirectUri());
|
|
91
|
+
url.searchParams.set("state", state);
|
|
92
|
+
url.searchParams.set("prompt", "consent");
|
|
93
|
+
url.searchParams.set("scope", SCOPES);
|
|
94
|
+
url.searchParams.set("response_type", "code");
|
|
95
|
+
url.searchParams.set("access_type", "offline");
|
|
96
|
+
return url.toString();
|
|
97
|
+
}
|
|
98
|
+
export function extractCodeFromRedirectUrl(redirectUrl) {
|
|
99
|
+
const url = new URL(redirectUrl);
|
|
100
|
+
// Validate state parameter to prevent CSRF (login CSRF defense)
|
|
101
|
+
const returnedState = url.searchParams.get("state");
|
|
102
|
+
if (!_pendingOAuthState) {
|
|
103
|
+
throw new Error("No pending OAuth state. Please call passwd_login (or `login`) first to start the login flow.");
|
|
104
|
+
}
|
|
105
|
+
if (returnedState !== _pendingOAuthState) {
|
|
106
|
+
throw new Error("OAuth state mismatch — possible CSRF attack. Please restart the login flow.");
|
|
107
|
+
}
|
|
108
|
+
_pendingOAuthState = null;
|
|
109
|
+
const code = url.searchParams.get("code");
|
|
110
|
+
if (!code) {
|
|
111
|
+
throw new Error("No 'code' parameter found in the redirect URL");
|
|
112
|
+
}
|
|
113
|
+
return code;
|
|
114
|
+
}
|
|
115
|
+
export async function exchangeCode(code) {
|
|
116
|
+
const apiUrl = await getApiUrl();
|
|
117
|
+
const url = `${apiUrl}/v2/oauth/callback?code=${encodeURIComponent(code)}`;
|
|
118
|
+
const response = await fetch(url, {
|
|
119
|
+
method: "POST",
|
|
120
|
+
headers: {
|
|
121
|
+
"Content-Type": "application/json",
|
|
122
|
+
"x-islocalhost": "false",
|
|
123
|
+
},
|
|
124
|
+
body: JSON.stringify({}),
|
|
125
|
+
});
|
|
126
|
+
if (!response.ok) {
|
|
127
|
+
const text = await response.text();
|
|
128
|
+
throw new Error(`OAuth code exchange failed (${response.status}): ${text}`);
|
|
129
|
+
}
|
|
130
|
+
const data = await response.json();
|
|
131
|
+
if (!data.access_token) {
|
|
132
|
+
throw new Error("No access_token in OAuth response");
|
|
133
|
+
}
|
|
134
|
+
data.saved_at = Date.now();
|
|
135
|
+
await saveTokens(data);
|
|
136
|
+
return data;
|
|
137
|
+
}
|
|
138
|
+
export async function refreshToken(tokens) {
|
|
139
|
+
if (!tokens.refresh_token) {
|
|
140
|
+
throw new Error("No refresh token available. Please re-authenticate.");
|
|
141
|
+
}
|
|
142
|
+
const apiUrl = await getApiUrl();
|
|
143
|
+
const url = `${apiUrl}/v2/oauth/refresh-token`;
|
|
144
|
+
const response = await fetch(url, {
|
|
145
|
+
method: "POST",
|
|
146
|
+
headers: {
|
|
147
|
+
"Content-Type": "application/json",
|
|
148
|
+
"x-islocalhost": "false",
|
|
149
|
+
},
|
|
150
|
+
body: JSON.stringify({ refreshToken: tokens.refresh_token }),
|
|
151
|
+
});
|
|
152
|
+
if (!response.ok) {
|
|
153
|
+
const text = await response.text();
|
|
154
|
+
throw new Error(`Token refresh failed (${response.status}): ${text}`);
|
|
155
|
+
}
|
|
156
|
+
const data = await response.json();
|
|
157
|
+
if (!data.accessToken) {
|
|
158
|
+
throw new Error("No accessToken in refresh response");
|
|
159
|
+
}
|
|
160
|
+
const refreshed = {
|
|
161
|
+
access_token: data.accessToken,
|
|
162
|
+
refresh_token: tokens.refresh_token,
|
|
163
|
+
expiry_date: data.expiration,
|
|
164
|
+
saved_at: Date.now(),
|
|
165
|
+
};
|
|
166
|
+
await saveTokens(refreshed);
|
|
167
|
+
return refreshed;
|
|
168
|
+
}
|
|
169
|
+
async function saveTokens(tokens) {
|
|
170
|
+
const tokenFile = getTokenFile();
|
|
171
|
+
const data = { ...tokens, origin: getOrigin() };
|
|
172
|
+
await mkdir(TOKEN_DIR, { recursive: true, mode: 0o700 });
|
|
173
|
+
await writeFile(tokenFile, JSON.stringify(data, null, 2), {
|
|
174
|
+
encoding: "utf-8",
|
|
175
|
+
mode: 0o600,
|
|
176
|
+
});
|
|
177
|
+
await chmod(tokenFile, 0o600);
|
|
178
|
+
}
|
|
179
|
+
export function resetDiscoveryCache() {
|
|
180
|
+
_discoveredApiUrl = null;
|
|
181
|
+
_discoveredClientId = null;
|
|
182
|
+
_discoveryDone = false;
|
|
183
|
+
}
|
|
184
|
+
export function getTokenDir() {
|
|
185
|
+
return TOKEN_DIR;
|
|
186
|
+
}
|
|
187
|
+
export async function loadTokens() {
|
|
188
|
+
// Check env var first
|
|
189
|
+
const envToken = process.env.PASSWD_ACCESS_TOKEN;
|
|
190
|
+
if (envToken) {
|
|
191
|
+
return { access_token: envToken };
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
const content = await readFile(getTokenFile(), "utf-8");
|
|
195
|
+
return JSON.parse(content);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export async function getAccessToken() {
|
|
202
|
+
const tokens = await loadTokens();
|
|
203
|
+
if (!tokens) {
|
|
204
|
+
throw new Error("Not authenticated. Use the passwd_login tool or set PASSWD_ACCESS_TOKEN.");
|
|
205
|
+
}
|
|
206
|
+
// Proactively refresh if token expires within 5 minutes
|
|
207
|
+
if (tokens.expiry_date && Date.now() > tokens.expiry_date - 5 * 60 * 1000) {
|
|
208
|
+
try {
|
|
209
|
+
const refreshed = await refreshToken(tokens);
|
|
210
|
+
return refreshed.access_token;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return tokens.access_token; // let 401 retry handle it
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return tokens.access_token;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,MAAM,kBAAkB,GAAG,8CAA8C,CAAC;AAC1E,MAAM,MAAM,GAAG,iGAAiG,CAAC;AAEjH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAE7C,SAAS,YAAY;IACnB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,SAAS,EAAE,UAAU,IAAI,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,KAAa;IAC9C,IACE,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;QAC3B,CAAC,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;QACnC,CAAC,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,EACnC,CAAC;QACD,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,+DAA+D,GAAG,EAAE,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,YAAY,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAC1C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,IAAI,iBAAiB,GAAkB,IAAI,CAAC;AAC5C,IAAI,mBAAmB,GAAkB,IAAI,CAAC;AAC9C,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B,KAAK,UAAU,kBAAkB,CAAC,MAAc;IAC9C,IAAI,cAAc;QAAE,OAAO;IAC3B,cAAc,GAAG,IAAI,CAAC;IAEtB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QACxF,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACnD,YAAY,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;YAC/C,iBAAiB,GAAG,UAAU,CAAC;QACjC,CAAC;QAED,wCAAwC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACvE,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC;YACvD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAChF,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvB,mBAAmB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACtE,MAAM,kBAAkB,CAAC,SAAS,EAAE,CAAC,CAAC;IACtC,IAAI,mBAAmB;QAAE,OAAO,mBAAmB,CAAC;IACpD,MAAM,IAAI,KAAK,CAAC,uGAAuG,CAAC,CAAC;AAC3H,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9C,YAAY,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAC3C,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,kBAAkB,CAAC,SAAS,EAAE,CAAC,CAAC;IACtC,OAAO,iBAAiB,IAAI,GAAG,SAAS,EAAE,MAAM,CAAC;AACnD,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,GAAG,SAAS,EAAE,iBAAiB,CAAC;AACzC,CAAC;AAED,IAAI,kBAAkB,GAAkB,IAAI,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,kBAAkB,GAAG,KAAK,CAAC;IAE3B,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACxC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC5C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;IACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC1C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,WAAmB;IAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IAEjC,gEAAgE;IAChE,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,8FAA8F,CAAC,CAAC;IAClH,CAAC;IACD,IAAI,aAAa,KAAK,kBAAkB,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IACD,kBAAkB,GAAG,IAAI,CAAC;IAE1B,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,GAAG,MAAM,2BAA2B,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;IAE3E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,OAAO;SACzB;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;KACzB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACjD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAkB;IACnD,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,GAAG,MAAM,yBAAyB,CAAC;IAE/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,OAAO;SACzB;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;KAC7D,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAiD,CAAC;IAClF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,SAAS,GAAe;QAC5B,YAAY,EAAE,IAAI,CAAC,WAAW;QAC9B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,WAAW,EAAE,IAAI,CAAC,UAAU;QAC5B,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAC;IACF,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAAkB;IAC1C,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;IAChD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACxD,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,MAAM,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,iBAAiB,GAAG,IAAI,CAAC;IACzB,mBAAmB,GAAG,IAAI,CAAC;IAC3B,cAAc,GAAG,KAAK,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,sBAAsB;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IAED,wDAAwD;IACxD,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAC1E,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;YAC7C,OAAO,SAAS,CAAC,YAAY,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,0BAA0B;QACxD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { AuthTokens, UserProfile, SecretType, SecretBase, AccessPermission, GroupRef, UserRef, SecretFile, GroupInfo, ContactInfo, PasswordSecret, PaymentCardSecret, ApiCredentialsSecret, DatabaseCredentialsSecret, SshKeySecret, SecureNoteSecret, Secret, SecretListItem, ListSecretsResponse, TOTPCode, TOTPResponse, ShareResponse, } from "./types.js";
|
|
2
|
+
export { getApiUrl, buildOAuthUrl, extractCodeFromRedirectUrl, exchangeCode, refreshToken, loadTokens, getAccessToken, resetDiscoveryCache, getTokenDir, } from "./auth.js";
|
|
3
|
+
export type { ListSecretsParams, ListSecretsResult } from "./api.js";
|
|
4
|
+
export { listSecrets, getSecret, createSecret, updateSecret, deleteSecret, getTotpCode, enableSharing, revokeSharing, listGroups, listContacts, getCurrentUser, } from "./api.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,EACT,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,YAAY,EACZ,gBAAgB,EAChB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,aAAa,EACb,0BAA0B,EAC1B,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,WAAW,GACZ,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAErE,OAAO,EACL,WAAW,EACX,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,cAAc,GACf,MAAM,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { getApiUrl, buildOAuthUrl, extractCodeFromRedirectUrl, exchangeCode, refreshToken, loadTokens, getAccessToken, resetDiscoveryCache, getTokenDir, } from "./auth.js";
|
|
2
|
+
export { listSecrets, getSecret, createSecret, updateSecret, deleteSecret, getTotpCode, enableSharing, revokeSharing, listGroups, listContacts, getCurrentUser, } from "./api.js";
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAyBA,OAAO,EACL,SAAS,EACT,aAAa,EACb,0BAA0B,EAC1B,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,WAAW,GACZ,MAAM,WAAW,CAAC;AAInB,OAAO,EACL,WAAW,EACX,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,cAAc,GACf,MAAM,UAAU,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
export interface AuthTokens {
|
|
2
|
+
access_token: string;
|
|
3
|
+
refresh_token?: string;
|
|
4
|
+
expiry_date?: number;
|
|
5
|
+
saved_at?: number;
|
|
6
|
+
origin?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface UserProfile {
|
|
9
|
+
id: string;
|
|
10
|
+
email: string;
|
|
11
|
+
name: string;
|
|
12
|
+
picture?: string;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
export type SecretType = "password" | "paymentCard" | "apiCredentials" | "databaseCredentials" | "sshKey" | "secureNote";
|
|
16
|
+
export type AccessPermission = "read" | "write" | "autofillOnly" | "passkeyOnly";
|
|
17
|
+
export interface GroupRef {
|
|
18
|
+
id: string;
|
|
19
|
+
accessPermissions: AccessPermission[];
|
|
20
|
+
}
|
|
21
|
+
export interface UserRef {
|
|
22
|
+
id: string;
|
|
23
|
+
accessPermissions: AccessPermission[];
|
|
24
|
+
}
|
|
25
|
+
export interface SecretFile {
|
|
26
|
+
name: string;
|
|
27
|
+
data: string;
|
|
28
|
+
}
|
|
29
|
+
export interface GroupInfo {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
email: string;
|
|
33
|
+
visible: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface ContactInfo {
|
|
36
|
+
id: string;
|
|
37
|
+
email: string;
|
|
38
|
+
name: string;
|
|
39
|
+
isAdmin: boolean;
|
|
40
|
+
isWorkspaceAdmin: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface SecretBase {
|
|
43
|
+
id?: string;
|
|
44
|
+
type: SecretType;
|
|
45
|
+
name: string;
|
|
46
|
+
username?: string;
|
|
47
|
+
web?: string;
|
|
48
|
+
note?: string;
|
|
49
|
+
tags?: string[];
|
|
50
|
+
groups?: GroupRef[];
|
|
51
|
+
whitelistUsers?: UserRef[];
|
|
52
|
+
file?: SecretFile | null;
|
|
53
|
+
visibleToAll?: boolean;
|
|
54
|
+
hasTOTP?: boolean;
|
|
55
|
+
TOTP?: string | null;
|
|
56
|
+
passwordUpdatedAt?: string;
|
|
57
|
+
shareId?: string | null;
|
|
58
|
+
securityLevel?: string;
|
|
59
|
+
securityLeaks?: string;
|
|
60
|
+
ignoreSecurityReport?: boolean;
|
|
61
|
+
duplicities?: number;
|
|
62
|
+
}
|
|
63
|
+
export interface PasswordSecret extends SecretBase {
|
|
64
|
+
type: "password";
|
|
65
|
+
password?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface PaymentCardSecret extends SecretBase {
|
|
68
|
+
type: "paymentCard";
|
|
69
|
+
cardNumber?: string;
|
|
70
|
+
cvvCode?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface ApiCredentialsSecret extends SecretBase {
|
|
73
|
+
type: "apiCredentials";
|
|
74
|
+
password?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface DatabaseCredentialsSecret extends SecretBase {
|
|
77
|
+
type: "databaseCredentials";
|
|
78
|
+
credentials?: string;
|
|
79
|
+
}
|
|
80
|
+
export interface SshKeySecret extends SecretBase {
|
|
81
|
+
type: "sshKey";
|
|
82
|
+
privateKey?: string;
|
|
83
|
+
}
|
|
84
|
+
export interface SecureNoteSecret extends SecretBase {
|
|
85
|
+
type: "secureNote";
|
|
86
|
+
secureNote?: string;
|
|
87
|
+
}
|
|
88
|
+
export type Secret = PasswordSecret | PaymentCardSecret | ApiCredentialsSecret | DatabaseCredentialsSecret | SshKeySecret | SecureNoteSecret;
|
|
89
|
+
export interface SecretListItem {
|
|
90
|
+
id: string;
|
|
91
|
+
name: string;
|
|
92
|
+
type: SecretType;
|
|
93
|
+
username?: string;
|
|
94
|
+
web?: string;
|
|
95
|
+
tags?: string[];
|
|
96
|
+
hasTOTP?: boolean;
|
|
97
|
+
securityLevel?: string;
|
|
98
|
+
securityLeaks?: string;
|
|
99
|
+
duplicities?: number;
|
|
100
|
+
[key: string]: unknown;
|
|
101
|
+
}
|
|
102
|
+
export interface ListSecretsResponse {
|
|
103
|
+
secrets: Record<string, SecretListItem> | SecretListItem[];
|
|
104
|
+
totalCount?: number;
|
|
105
|
+
}
|
|
106
|
+
export interface TOTPCode {
|
|
107
|
+
code: string;
|
|
108
|
+
validityStart: number;
|
|
109
|
+
validityEnd: number;
|
|
110
|
+
}
|
|
111
|
+
export type TOTPResponse = TOTPCode[];
|
|
112
|
+
export interface ShareResponse {
|
|
113
|
+
shareId?: string;
|
|
114
|
+
[key: string]: unknown;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@passwd/passwd-lib",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Core library for passwd.team — auth, API client, and types",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc -b"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"passwd",
|
|
22
|
+
"password-manager",
|
|
23
|
+
"passwd-team"
|
|
24
|
+
],
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "https://github.com/pepuscz/passwd.git",
|
|
29
|
+
"directory": "packages/passwd-lib"
|
|
30
|
+
},
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
}
|
|
34
|
+
}
|