convex-zen 0.0.1
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/cli/generate.d.ts +14 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +297 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +111 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/index.d.ts +300 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +434 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/plugins/admin.d.ts +92 -0
- package/dist/client/plugins/admin.d.ts.map +1 -0
- package/dist/client/plugins/admin.js +165 -0
- package/dist/client/plugins/admin.js.map +1 -0
- package/dist/client/primitives.d.ts +57 -0
- package/dist/client/primitives.d.ts.map +1 -0
- package/dist/client/primitives.js +64 -0
- package/dist/client/primitives.js.map +1 -0
- package/dist/client/providers.d.ts +14 -0
- package/dist/client/providers.d.ts.map +1 -0
- package/dist/client/providers.js +25 -0
- package/dist/client/providers.js.map +1 -0
- package/dist/client/react.d.ts +23 -0
- package/dist/client/react.d.ts.map +1 -0
- package/dist/client/react.js +48 -0
- package/dist/client/react.js.map +1 -0
- package/dist/client/tanstack-start-client-plugins.d.ts +34 -0
- package/dist/client/tanstack-start-client-plugins.d.ts.map +1 -0
- package/dist/client/tanstack-start-client-plugins.js +32 -0
- package/dist/client/tanstack-start-client-plugins.js.map +1 -0
- package/dist/client/tanstack-start-client.d.ts +52 -0
- package/dist/client/tanstack-start-client.d.ts.map +1 -0
- package/dist/client/tanstack-start-client.js +130 -0
- package/dist/client/tanstack-start-client.js.map +1 -0
- package/dist/client/tanstack-start-plugins.d.ts +27 -0
- package/dist/client/tanstack-start-plugins.d.ts.map +1 -0
- package/dist/client/tanstack-start-plugins.js +145 -0
- package/dist/client/tanstack-start-plugins.js.map +1 -0
- package/dist/client/tanstack-start.d.ts +130 -0
- package/dist/client/tanstack-start.d.ts.map +1 -0
- package/dist/client/tanstack-start.js +331 -0
- package/dist/client/tanstack-start.js.map +1 -0
- package/dist/component/_generated/api.d.ts +50 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +92 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +121 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +78 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/convex.config.d.ts +3 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +4 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/core/sessions.d.ts +33 -0
- package/dist/component/core/sessions.d.ts.map +1 -0
- package/dist/component/core/sessions.js +186 -0
- package/dist/component/core/sessions.js.map +1 -0
- package/dist/component/core/users.d.ts +19 -0
- package/dist/component/core/users.d.ts.map +1 -0
- package/dist/component/core/users.js +154 -0
- package/dist/component/core/users.js.map +1 -0
- package/dist/component/core/verifications.d.ts +34 -0
- package/dist/component/core/verifications.d.ts.map +1 -0
- package/dist/component/core/verifications.js +135 -0
- package/dist/component/core/verifications.js.map +1 -0
- package/dist/component/gateway.d.ts +16 -0
- package/dist/component/gateway.d.ts.map +1 -0
- package/dist/component/gateway.js +229 -0
- package/dist/component/gateway.js.map +1 -0
- package/dist/component/lib/crypto.d.ts +24 -0
- package/dist/component/lib/crypto.d.ts.map +1 -0
- package/dist/component/lib/crypto.js +57 -0
- package/dist/component/lib/crypto.js.map +1 -0
- package/dist/component/lib/rateLimit.d.ts +26 -0
- package/dist/component/lib/rateLimit.d.ts.map +1 -0
- package/dist/component/lib/rateLimit.js +96 -0
- package/dist/component/lib/rateLimit.js.map +1 -0
- package/dist/component/lib/validators.d.ts +19 -0
- package/dist/component/lib/validators.d.ts.map +1 -0
- package/dist/component/lib/validators.js +12 -0
- package/dist/component/lib/validators.js.map +1 -0
- package/dist/component/plugins/admin.d.ts +72 -0
- package/dist/component/plugins/admin.d.ts.map +1 -0
- package/dist/component/plugins/admin.js +152 -0
- package/dist/component/plugins/admin.js.map +1 -0
- package/dist/component/providers/emailPassword.d.ts +49 -0
- package/dist/component/providers/emailPassword.d.ts.map +1 -0
- package/dist/component/providers/emailPassword.js +316 -0
- package/dist/component/providers/emailPassword.js.map +1 -0
- package/dist/component/providers/oauth.d.ts +33 -0
- package/dist/component/providers/oauth.d.ts.map +1 -0
- package/dist/component/providers/oauth.js +256 -0
- package/dist/component/providers/oauth.js.map +1 -0
- package/dist/component/schema.d.ts +132 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +82 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +121 -0
- package/src/cli/generate.ts +360 -0
- package/src/cli/index.ts +133 -0
- package/src/client/index.ts +707 -0
- package/src/client/plugins/admin.ts +205 -0
- package/src/client/primitives.ts +100 -0
- package/src/client/providers.ts +35 -0
- package/src/client/react.ts +97 -0
- package/src/client/tanstack-start-client-plugins.ts +113 -0
- package/src/client/tanstack-start-client.ts +259 -0
- package/src/client/tanstack-start-plugins.ts +203 -0
- package/src/client/tanstack-start.ts +535 -0
- package/src/component/_generated/api.ts +70 -0
- package/src/component/_generated/component.ts +184 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +156 -0
- package/src/component/convex.config.ts +5 -0
- package/src/component/core/sessions.ts +228 -0
- package/src/component/core/users.ts +199 -0
- package/src/component/core/verifications.ts +173 -0
- package/src/component/gateway.ts +321 -0
- package/src/component/lib/crypto.ts +63 -0
- package/src/component/lib/internalApi.ts +66 -0
- package/src/component/lib/rateLimit.ts +111 -0
- package/src/component/lib/validators.ts +12 -0
- package/src/component/plugins/admin.ts +178 -0
- package/src/component/providers/emailPassword.ts +374 -0
- package/src/component/providers/oauth.ts +324 -0
- package/src/component/schema.ts +88 -0
- package/src/types.ts +68 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a verification code for a given identifier and type.
|
|
3
|
+
* Any previous verification of the same type is replaced.
|
|
4
|
+
* Returns the raw code (to be sent to the user) and the expiry.
|
|
5
|
+
*/
|
|
6
|
+
export declare const create: import("convex/server").RegisteredMutation<"internal", any, Promise<{
|
|
7
|
+
code: string;
|
|
8
|
+
expiresAt: number;
|
|
9
|
+
}>>;
|
|
10
|
+
/**
|
|
11
|
+
* Get verification record without consuming it.
|
|
12
|
+
*/
|
|
13
|
+
export declare const getByIdentifierType: import("convex/server").RegisteredQuery<"internal", any, Promise<any>>;
|
|
14
|
+
/**
|
|
15
|
+
* Verify a code for an identifier and type.
|
|
16
|
+
* Increments attempt count; invalidates after MAX_ATTEMPTS.
|
|
17
|
+
* Returns status: "valid" | "invalid" | "expired" | "too_many_attempts"
|
|
18
|
+
*/
|
|
19
|
+
export declare const verify: import("convex/server").RegisteredMutation<"internal", any, Promise<{
|
|
20
|
+
status: "invalid";
|
|
21
|
+
} | {
|
|
22
|
+
status: "expired";
|
|
23
|
+
} | {
|
|
24
|
+
status: "too_many_attempts";
|
|
25
|
+
} | {
|
|
26
|
+
status: "valid";
|
|
27
|
+
}>>;
|
|
28
|
+
/** Delete a verification record (e.g., after successful use or on cancel). */
|
|
29
|
+
export declare const invalidate: import("convex/server").RegisteredMutation<"internal", any, Promise<void>>;
|
|
30
|
+
/**
|
|
31
|
+
* Cleanup expired verifications (intended to be scheduled).
|
|
32
|
+
*/
|
|
33
|
+
export declare const cleanup: import("convex/server").RegisteredMutation<"internal", any, Promise<void>>;
|
|
34
|
+
//# sourceMappingURL=verifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifications.d.ts","sourceRoot":"","sources":["../../../src/component/core/verifications.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,eAAO,MAAM,MAAM;;;GAwCjB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB,wEAgB9B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,MAAM;;;;;;;;GA+CjB,CAAC;AAEH,8EAA8E;AAC9E,eAAO,MAAM,UAAU,4EAmBrB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,OAAO,4EAYlB,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { v } from "convex/values";
|
|
2
|
+
import { internalMutation, internalQuery } from "../_generated/server";
|
|
3
|
+
import { generateCode, hashToken } from "../lib/crypto";
|
|
4
|
+
/** Max attempts before a verification code is locked. */
|
|
5
|
+
const MAX_ATTEMPTS = 10;
|
|
6
|
+
/** Email verification TTL: 60 minutes. */
|
|
7
|
+
const EMAIL_VERIFICATION_TTL_MS = 60 * 60 * 1000;
|
|
8
|
+
/** Password reset TTL: 15 minutes. */
|
|
9
|
+
const PASSWORD_RESET_TTL_MS = 15 * 60 * 1000;
|
|
10
|
+
/**
|
|
11
|
+
* Create a verification code for a given identifier and type.
|
|
12
|
+
* Any previous verification of the same type is replaced.
|
|
13
|
+
* Returns the raw code (to be sent to the user) and the expiry.
|
|
14
|
+
*/
|
|
15
|
+
export const create = internalMutation({
|
|
16
|
+
args: {
|
|
17
|
+
identifier: v.string(),
|
|
18
|
+
type: v.union(v.literal("email-verification"), v.literal("password-reset")),
|
|
19
|
+
},
|
|
20
|
+
handler: async (ctx, { identifier, type }) => {
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
const code = generateCode();
|
|
23
|
+
const codeHash = await hashToken(code);
|
|
24
|
+
const ttl = type === "email-verification"
|
|
25
|
+
? EMAIL_VERIFICATION_TTL_MS
|
|
26
|
+
: PASSWORD_RESET_TTL_MS;
|
|
27
|
+
const expiresAt = now + ttl;
|
|
28
|
+
// Remove any existing verification of this type for this identifier
|
|
29
|
+
const existing = await ctx.db
|
|
30
|
+
.query("verifications")
|
|
31
|
+
.withIndex("by_identifier_type", (q) => q.eq("identifier", identifier).eq("type", type))
|
|
32
|
+
.unique();
|
|
33
|
+
if (existing) {
|
|
34
|
+
await ctx.db.delete(existing._id);
|
|
35
|
+
}
|
|
36
|
+
await ctx.db.insert("verifications", {
|
|
37
|
+
identifier,
|
|
38
|
+
type,
|
|
39
|
+
codeHash,
|
|
40
|
+
expiresAt,
|
|
41
|
+
attempts: 0,
|
|
42
|
+
createdAt: now,
|
|
43
|
+
});
|
|
44
|
+
return { code, expiresAt };
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Get verification record without consuming it.
|
|
49
|
+
*/
|
|
50
|
+
export const getByIdentifierType = internalQuery({
|
|
51
|
+
args: {
|
|
52
|
+
identifier: v.string(),
|
|
53
|
+
type: v.union(v.literal("email-verification"), v.literal("password-reset")),
|
|
54
|
+
},
|
|
55
|
+
handler: async (ctx, { identifier, type }) => {
|
|
56
|
+
return await ctx.db
|
|
57
|
+
.query("verifications")
|
|
58
|
+
.withIndex("by_identifier_type", (q) => q.eq("identifier", identifier).eq("type", type))
|
|
59
|
+
.unique();
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
/**
|
|
63
|
+
* Verify a code for an identifier and type.
|
|
64
|
+
* Increments attempt count; invalidates after MAX_ATTEMPTS.
|
|
65
|
+
* Returns status: "valid" | "invalid" | "expired" | "too_many_attempts"
|
|
66
|
+
*/
|
|
67
|
+
export const verify = internalMutation({
|
|
68
|
+
args: {
|
|
69
|
+
identifier: v.string(),
|
|
70
|
+
type: v.union(v.literal("email-verification"), v.literal("password-reset")),
|
|
71
|
+
code: v.string(),
|
|
72
|
+
},
|
|
73
|
+
handler: async (ctx, { identifier, type, code }) => {
|
|
74
|
+
const record = await ctx.db
|
|
75
|
+
.query("verifications")
|
|
76
|
+
.withIndex("by_identifier_type", (q) => q.eq("identifier", identifier).eq("type", type))
|
|
77
|
+
.unique();
|
|
78
|
+
if (!record) {
|
|
79
|
+
return { status: "invalid" };
|
|
80
|
+
}
|
|
81
|
+
const now = Date.now();
|
|
82
|
+
if (record.expiresAt < now) {
|
|
83
|
+
await ctx.db.delete(record._id);
|
|
84
|
+
return { status: "expired" };
|
|
85
|
+
}
|
|
86
|
+
if (record.attempts >= MAX_ATTEMPTS) {
|
|
87
|
+
return { status: "too_many_attempts" };
|
|
88
|
+
}
|
|
89
|
+
const codeHash = await hashToken(code);
|
|
90
|
+
if (codeHash !== record.codeHash) {
|
|
91
|
+
// Increment attempts
|
|
92
|
+
await ctx.db.patch(record._id, { attempts: record.attempts + 1 });
|
|
93
|
+
if (record.attempts + 1 >= MAX_ATTEMPTS) {
|
|
94
|
+
return { status: "too_many_attempts" };
|
|
95
|
+
}
|
|
96
|
+
return { status: "invalid" };
|
|
97
|
+
}
|
|
98
|
+
// Valid — delete the verification (single-use)
|
|
99
|
+
await ctx.db.delete(record._id);
|
|
100
|
+
return { status: "valid" };
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
/** Delete a verification record (e.g., after successful use or on cancel). */
|
|
104
|
+
export const invalidate = internalMutation({
|
|
105
|
+
args: {
|
|
106
|
+
identifier: v.string(),
|
|
107
|
+
type: v.union(v.literal("email-verification"), v.literal("password-reset")),
|
|
108
|
+
},
|
|
109
|
+
handler: async (ctx, { identifier, type }) => {
|
|
110
|
+
const record = await ctx.db
|
|
111
|
+
.query("verifications")
|
|
112
|
+
.withIndex("by_identifier_type", (q) => q.eq("identifier", identifier).eq("type", type))
|
|
113
|
+
.unique();
|
|
114
|
+
if (record) {
|
|
115
|
+
await ctx.db.delete(record._id);
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
/**
|
|
120
|
+
* Cleanup expired verifications (intended to be scheduled).
|
|
121
|
+
*/
|
|
122
|
+
export const cleanup = internalMutation({
|
|
123
|
+
args: {},
|
|
124
|
+
handler: async (ctx) => {
|
|
125
|
+
const now = Date.now();
|
|
126
|
+
// Collect and delete expired records
|
|
127
|
+
const allVerifications = await ctx.db.query("verifications").collect();
|
|
128
|
+
for (const v of allVerifications) {
|
|
129
|
+
if (v.expiresAt < now) {
|
|
130
|
+
await ctx.db.delete(v._id);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=verifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifications.js","sourceRoot":"","sources":["../../../src/component/core/verifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const signUp: any;
|
|
2
|
+
export declare const signIn: any;
|
|
3
|
+
export declare const verifyEmail: any;
|
|
4
|
+
export declare const requestPasswordReset: any;
|
|
5
|
+
export declare const resetPassword: any;
|
|
6
|
+
export declare const validateSession: any;
|
|
7
|
+
export declare const invalidateSession: any;
|
|
8
|
+
export declare const invalidateAllSessions: any;
|
|
9
|
+
export declare const getAuthorizationUrl: any;
|
|
10
|
+
export declare const handleCallback: any;
|
|
11
|
+
export declare const adminListUsers: any;
|
|
12
|
+
export declare const adminBanUser: any;
|
|
13
|
+
export declare const adminUnbanUser: import("convex/server").RegisteredAction<"public", any, Promise<any>>;
|
|
14
|
+
export declare const adminSetRole: import("convex/server").RegisteredAction<"public", any, Promise<any>>;
|
|
15
|
+
export declare const adminDeleteUser: import("convex/server").RegisteredAction<"public", any, Promise<any>>;
|
|
16
|
+
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/component/gateway.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,MAAM,KASjB,CAAC;AAEH,eAAO,MAAM,MAAM,KAUjB,CAAC;AAEH,eAAO,MAAM,WAAW,KAOtB,CAAC;AAEH,eAAO,MAAM,oBAAoB,KAO/B,CAAC;AAEH,eAAO,MAAM,aAAa,KAQxB,CAAC;AAIH,eAAO,MAAM,eAAe,KAO1B,CAAC;AAEH,eAAO,MAAM,iBAAiB,KAI5B,CAAC;AAEH,eAAO,MAAM,qBAAqB,KAMhC,CAAC;AAIH,eAAO,MAAM,mBAAmB,KAO9B,CAAC;AAEH,eAAO,MAAM,cAAc,KAWzB,CAAC;AAIH,eAAO,MAAM,cAAc,KA4BzB,CAAC;AAEH,eAAO,MAAM,YAAY,KA8BvB,CAAC;AAEH,eAAO,MAAM,cAAc,uEA0BzB,CAAC;AAEH,eAAO,MAAM,YAAY,uEA4BvB,CAAC;AAEH,eAAO,MAAM,eAAe,uEA0B1B,CAAC"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public gateway — the only functions callable from the host app.
|
|
3
|
+
*
|
|
4
|
+
* All functions are `action` (not `internalAction`) so they appear in the
|
|
5
|
+
* component's public API and can be reached via ctx.runAction / ctx.runQuery
|
|
6
|
+
* from the parent Convex backend. They simply delegate to the corresponding
|
|
7
|
+
* internal functions.
|
|
8
|
+
*
|
|
9
|
+
* Internal functions remain `internalAction`/`internalMutation`/`internalQuery`
|
|
10
|
+
* and are only callable from within this component.
|
|
11
|
+
*/
|
|
12
|
+
import { v } from "convex/values";
|
|
13
|
+
import { action } from "./_generated/server";
|
|
14
|
+
import { internal } from "./_generated/api";
|
|
15
|
+
import { oauthProviderConfigValidator } from "./lib/validators";
|
|
16
|
+
// ─── Email / Password ──────────────────────────────────────────────────────
|
|
17
|
+
export const signUp = action({
|
|
18
|
+
args: {
|
|
19
|
+
email: v.string(),
|
|
20
|
+
password: v.string(),
|
|
21
|
+
name: v.optional(v.string()),
|
|
22
|
+
ipAddress: v.optional(v.string()),
|
|
23
|
+
},
|
|
24
|
+
handler: (ctx, args) => ctx.runAction(internal.providers.emailPassword.signUp, args),
|
|
25
|
+
});
|
|
26
|
+
export const signIn = action({
|
|
27
|
+
args: {
|
|
28
|
+
email: v.string(),
|
|
29
|
+
password: v.string(),
|
|
30
|
+
ipAddress: v.optional(v.string()),
|
|
31
|
+
userAgent: v.optional(v.string()),
|
|
32
|
+
requireEmailVerified: v.optional(v.boolean()),
|
|
33
|
+
},
|
|
34
|
+
handler: (ctx, args) => ctx.runAction(internal.providers.emailPassword.signIn, args),
|
|
35
|
+
});
|
|
36
|
+
export const verifyEmail = action({
|
|
37
|
+
args: {
|
|
38
|
+
email: v.string(),
|
|
39
|
+
code: v.string(),
|
|
40
|
+
},
|
|
41
|
+
handler: (ctx, args) => ctx.runAction(internal.providers.emailPassword.verifyEmail, args),
|
|
42
|
+
});
|
|
43
|
+
export const requestPasswordReset = action({
|
|
44
|
+
args: {
|
|
45
|
+
email: v.string(),
|
|
46
|
+
ipAddress: v.optional(v.string()),
|
|
47
|
+
},
|
|
48
|
+
handler: (ctx, args) => ctx.runAction(internal.providers.emailPassword.requestPasswordReset, args),
|
|
49
|
+
});
|
|
50
|
+
export const resetPassword = action({
|
|
51
|
+
args: {
|
|
52
|
+
email: v.string(),
|
|
53
|
+
code: v.string(),
|
|
54
|
+
newPassword: v.string(),
|
|
55
|
+
},
|
|
56
|
+
handler: (ctx, args) => ctx.runAction(internal.providers.emailPassword.resetPassword, args),
|
|
57
|
+
});
|
|
58
|
+
// ─── Sessions ──────────────────────────────────────────────────────────────
|
|
59
|
+
export const validateSession = action({
|
|
60
|
+
args: {
|
|
61
|
+
token: v.string(),
|
|
62
|
+
checkBanned: v.optional(v.boolean()),
|
|
63
|
+
},
|
|
64
|
+
handler: (ctx, args) => ctx.runAction(internal.core.sessions.validate, args),
|
|
65
|
+
});
|
|
66
|
+
export const invalidateSession = action({
|
|
67
|
+
args: { token: v.string() },
|
|
68
|
+
handler: (ctx, args) => ctx.runMutation(internal.core.sessions.invalidateByToken, args),
|
|
69
|
+
});
|
|
70
|
+
export const invalidateAllSessions = action({
|
|
71
|
+
args: { userId: v.string() },
|
|
72
|
+
handler: (ctx, { userId }) => ctx.runMutation(internal.core.sessions.invalidateAll, {
|
|
73
|
+
userId: userId,
|
|
74
|
+
}),
|
|
75
|
+
});
|
|
76
|
+
// ─── OAuth ─────────────────────────────────────────────────────────────────
|
|
77
|
+
export const getAuthorizationUrl = action({
|
|
78
|
+
args: {
|
|
79
|
+
provider: oauthProviderConfigValidator,
|
|
80
|
+
redirectUrl: v.optional(v.string()),
|
|
81
|
+
},
|
|
82
|
+
handler: (ctx, args) => ctx.runAction(internal.providers.oauth.getAuthorizationUrl, args),
|
|
83
|
+
});
|
|
84
|
+
export const handleCallback = action({
|
|
85
|
+
args: {
|
|
86
|
+
provider: oauthProviderConfigValidator,
|
|
87
|
+
code: v.string(),
|
|
88
|
+
state: v.string(),
|
|
89
|
+
redirectUrl: v.optional(v.string()),
|
|
90
|
+
ipAddress: v.optional(v.string()),
|
|
91
|
+
userAgent: v.optional(v.string()),
|
|
92
|
+
},
|
|
93
|
+
handler: (ctx, args) => ctx.runAction(internal.providers.oauth.handleCallback, args),
|
|
94
|
+
});
|
|
95
|
+
// ─── Admin ─────────────────────────────────────────────────────────────────
|
|
96
|
+
export const adminListUsers = action({
|
|
97
|
+
args: {
|
|
98
|
+
adminToken: v.string(),
|
|
99
|
+
limit: v.optional(v.number()),
|
|
100
|
+
cursor: v.optional(v.string()),
|
|
101
|
+
},
|
|
102
|
+
handler: async (ctx, { adminToken, limit, cursor }) => {
|
|
103
|
+
const session = await ctx.runAction(internal.core.sessions.validate, {
|
|
104
|
+
token: adminToken,
|
|
105
|
+
checkBanned: true,
|
|
106
|
+
});
|
|
107
|
+
if (!session) {
|
|
108
|
+
throw new Error("Unauthorized");
|
|
109
|
+
}
|
|
110
|
+
const adminUser = await ctx.runQuery(internal.core.users.getById, {
|
|
111
|
+
userId: session.userId,
|
|
112
|
+
});
|
|
113
|
+
if (!adminUser || adminUser.role !== "admin") {
|
|
114
|
+
throw new Error("Forbidden");
|
|
115
|
+
}
|
|
116
|
+
return ctx.runQuery(internal.plugins.admin.listUsers, {
|
|
117
|
+
actorUserId: session.userId,
|
|
118
|
+
limit,
|
|
119
|
+
cursor,
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
export const adminBanUser = action({
|
|
124
|
+
args: {
|
|
125
|
+
adminToken: v.string(),
|
|
126
|
+
userId: v.string(),
|
|
127
|
+
reason: v.optional(v.string()),
|
|
128
|
+
expiresAt: v.optional(v.number()),
|
|
129
|
+
},
|
|
130
|
+
handler: async (ctx, { adminToken, userId, reason, expiresAt }) => {
|
|
131
|
+
const session = await ctx.runAction(internal.core.sessions.validate, {
|
|
132
|
+
token: adminToken,
|
|
133
|
+
checkBanned: true,
|
|
134
|
+
});
|
|
135
|
+
if (!session) {
|
|
136
|
+
throw new Error("Unauthorized");
|
|
137
|
+
}
|
|
138
|
+
const adminUser = await ctx.runQuery(internal.core.users.getById, {
|
|
139
|
+
userId: session.userId,
|
|
140
|
+
});
|
|
141
|
+
if (!adminUser || adminUser.role !== "admin") {
|
|
142
|
+
throw new Error("Forbidden");
|
|
143
|
+
}
|
|
144
|
+
return ctx.runMutation(internal.plugins.admin.banUser, {
|
|
145
|
+
actorUserId: session.userId,
|
|
146
|
+
userId: userId,
|
|
147
|
+
reason,
|
|
148
|
+
expiresAt,
|
|
149
|
+
});
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
export const adminUnbanUser = action({
|
|
153
|
+
args: {
|
|
154
|
+
adminToken: v.string(),
|
|
155
|
+
userId: v.string(),
|
|
156
|
+
},
|
|
157
|
+
handler: async (ctx, { adminToken, userId }) => {
|
|
158
|
+
const session = await ctx.runAction(internal.core.sessions.validate, {
|
|
159
|
+
token: adminToken,
|
|
160
|
+
checkBanned: true,
|
|
161
|
+
});
|
|
162
|
+
if (!session) {
|
|
163
|
+
throw new Error("Unauthorized");
|
|
164
|
+
}
|
|
165
|
+
const adminUser = await ctx.runQuery(internal.core.users.getById, {
|
|
166
|
+
userId: session.userId,
|
|
167
|
+
});
|
|
168
|
+
if (!adminUser || adminUser.role !== "admin") {
|
|
169
|
+
throw new Error("Forbidden");
|
|
170
|
+
}
|
|
171
|
+
return ctx.runMutation(internal.plugins.admin.unbanUser, {
|
|
172
|
+
actorUserId: session.userId,
|
|
173
|
+
userId: userId,
|
|
174
|
+
});
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
export const adminSetRole = action({
|
|
178
|
+
args: {
|
|
179
|
+
adminToken: v.string(),
|
|
180
|
+
userId: v.string(),
|
|
181
|
+
role: v.string(),
|
|
182
|
+
},
|
|
183
|
+
handler: async (ctx, { adminToken, userId, role }) => {
|
|
184
|
+
const session = await ctx.runAction(internal.core.sessions.validate, {
|
|
185
|
+
token: adminToken,
|
|
186
|
+
checkBanned: true,
|
|
187
|
+
});
|
|
188
|
+
if (!session) {
|
|
189
|
+
throw new Error("Unauthorized");
|
|
190
|
+
}
|
|
191
|
+
const adminUser = await ctx.runQuery(internal.core.users.getById, {
|
|
192
|
+
userId: session.userId,
|
|
193
|
+
});
|
|
194
|
+
if (!adminUser || adminUser.role !== "admin") {
|
|
195
|
+
throw new Error("Forbidden");
|
|
196
|
+
}
|
|
197
|
+
return ctx.runMutation(internal.plugins.admin.setRole, {
|
|
198
|
+
actorUserId: session.userId,
|
|
199
|
+
userId: userId,
|
|
200
|
+
role,
|
|
201
|
+
});
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
export const adminDeleteUser = action({
|
|
205
|
+
args: {
|
|
206
|
+
adminToken: v.string(),
|
|
207
|
+
userId: v.string(),
|
|
208
|
+
},
|
|
209
|
+
handler: async (ctx, { adminToken, userId }) => {
|
|
210
|
+
const session = await ctx.runAction(internal.core.sessions.validate, {
|
|
211
|
+
token: adminToken,
|
|
212
|
+
checkBanned: true,
|
|
213
|
+
});
|
|
214
|
+
if (!session) {
|
|
215
|
+
throw new Error("Unauthorized");
|
|
216
|
+
}
|
|
217
|
+
const adminUser = await ctx.runQuery(internal.core.users.getById, {
|
|
218
|
+
userId: session.userId,
|
|
219
|
+
});
|
|
220
|
+
if (!adminUser || adminUser.role !== "admin") {
|
|
221
|
+
throw new Error("Forbidden");
|
|
222
|
+
}
|
|
223
|
+
return ctx.runMutation(internal.plugins.admin.deleteUser, {
|
|
224
|
+
actorUserId: session.userId,
|
|
225
|
+
userId: userId,
|
|
226
|
+
});
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/component/gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cryptographic utilities using Web Crypto API.
|
|
3
|
+
* All token generation uses crypto.getRandomValues for 256+ bit entropy.
|
|
4
|
+
* Tokens are stored as SHA-256 hashes only (never raw).
|
|
5
|
+
*/
|
|
6
|
+
/** Generate a cryptographically secure 32-byte random hex token (256 bits). */
|
|
7
|
+
export declare function generateToken(): string;
|
|
8
|
+
/** SHA-256 hash a string token, returns hex string. */
|
|
9
|
+
export declare function hashToken(token: string): Promise<string>;
|
|
10
|
+
/** Base64url encode bytes (no padding). Used for PKCE code challenge. */
|
|
11
|
+
export declare function base64url(bytes: Uint8Array): string;
|
|
12
|
+
/** Generate a PKCE code verifier (32 random bytes, base64url encoded). */
|
|
13
|
+
export declare function generateCodeVerifier(): string;
|
|
14
|
+
/** Generate a PKCE code challenge (SHA-256 of verifier, base64url encoded). */
|
|
15
|
+
export declare function generateCodeChallenge(verifier: string): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Generate a cryptographically secure 8-character alphanumeric code.
|
|
18
|
+
* Uses rejection sampling to avoid modulo bias.
|
|
19
|
+
* Charset: A-Z, 0-9 (36 chars) — avoids ambiguous chars like 0/O, 1/I/l.
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateCode(): string;
|
|
22
|
+
/** Generate a 32-byte random state token for OAuth (returned as hex). */
|
|
23
|
+
export declare function generateState(): string;
|
|
24
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/component/lib/crypto.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,+EAA+E;AAC/E,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAED,uDAAuD;AACvD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM9D;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAGnD;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAED,+EAA+E;AAC/E,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAOrC;AAED,yEAAyE;AACzE,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cryptographic utilities using Web Crypto API.
|
|
3
|
+
* All token generation uses crypto.getRandomValues for 256+ bit entropy.
|
|
4
|
+
* Tokens are stored as SHA-256 hashes only (never raw).
|
|
5
|
+
*/
|
|
6
|
+
/** Generate a cryptographically secure 32-byte random hex token (256 bits). */
|
|
7
|
+
export function generateToken() {
|
|
8
|
+
const bytes = new Uint8Array(32);
|
|
9
|
+
crypto.getRandomValues(bytes);
|
|
10
|
+
return Array.from(bytes)
|
|
11
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
12
|
+
.join("");
|
|
13
|
+
}
|
|
14
|
+
/** SHA-256 hash a string token, returns hex string. */
|
|
15
|
+
export async function hashToken(token) {
|
|
16
|
+
const encoder = new TextEncoder();
|
|
17
|
+
const data = encoder.encode(token);
|
|
18
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
|
|
19
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
20
|
+
return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
21
|
+
}
|
|
22
|
+
/** Base64url encode bytes (no padding). Used for PKCE code challenge. */
|
|
23
|
+
export function base64url(bytes) {
|
|
24
|
+
const base64 = btoa(String.fromCharCode(...bytes));
|
|
25
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
26
|
+
}
|
|
27
|
+
/** Generate a PKCE code verifier (32 random bytes, base64url encoded). */
|
|
28
|
+
export function generateCodeVerifier() {
|
|
29
|
+
const bytes = new Uint8Array(32);
|
|
30
|
+
crypto.getRandomValues(bytes);
|
|
31
|
+
return base64url(bytes);
|
|
32
|
+
}
|
|
33
|
+
/** Generate a PKCE code challenge (SHA-256 of verifier, base64url encoded). */
|
|
34
|
+
export async function generateCodeChallenge(verifier) {
|
|
35
|
+
const encoder = new TextEncoder();
|
|
36
|
+
const data = encoder.encode(verifier);
|
|
37
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
|
|
38
|
+
return base64url(new Uint8Array(hashBuffer));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Generate a cryptographically secure 8-character alphanumeric code.
|
|
42
|
+
* Uses rejection sampling to avoid modulo bias.
|
|
43
|
+
* Charset: A-Z, 0-9 (36 chars) — avoids ambiguous chars like 0/O, 1/I/l.
|
|
44
|
+
*/
|
|
45
|
+
export function generateCode() {
|
|
46
|
+
const charset = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // 32 chars, power of 2
|
|
47
|
+
const bytes = new Uint8Array(8);
|
|
48
|
+
crypto.getRandomValues(bytes);
|
|
49
|
+
return Array.from(bytes)
|
|
50
|
+
.map((b) => charset[b & 31]) // 32 = 2^5, no bias since 256 / 32 = 8 exactly
|
|
51
|
+
.join("");
|
|
52
|
+
}
|
|
53
|
+
/** Generate a 32-byte random state token for OAuth (returned as hex). */
|
|
54
|
+
export function generateState() {
|
|
55
|
+
return generateToken();
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../src/component/lib/crypto.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,+EAA+E;AAC/E,MAAM,UAAU,aAAa;IAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa;IAC3C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IAC1D,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/D,OAAO,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,kCAAkC,CAAC,CAAC,uBAAuB;IAC3E,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,+CAA+C;SAC3E,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,aAAa;IAC3B,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a key is currently rate limited.
|
|
3
|
+
* Returns { limited: true, retryAfter } if locked, { limited: false } otherwise.
|
|
4
|
+
*/
|
|
5
|
+
export declare const check: import("convex/server").RegisteredQuery<"internal", {
|
|
6
|
+
key: string;
|
|
7
|
+
}, Promise<{
|
|
8
|
+
limited: false;
|
|
9
|
+
retryAfter?: never;
|
|
10
|
+
} | {
|
|
11
|
+
limited: true;
|
|
12
|
+
retryAfter: number;
|
|
13
|
+
}>>;
|
|
14
|
+
/**
|
|
15
|
+
* Increment failure count for a key. Applies lockout if threshold reached.
|
|
16
|
+
*/
|
|
17
|
+
export declare const increment: import("convex/server").RegisteredMutation<"internal", {
|
|
18
|
+
key: string;
|
|
19
|
+
}, Promise<void>>;
|
|
20
|
+
/**
|
|
21
|
+
* Reset rate limit for a key (called on successful auth).
|
|
22
|
+
*/
|
|
23
|
+
export declare const reset: import("convex/server").RegisteredMutation<"internal", {
|
|
24
|
+
key: string;
|
|
25
|
+
}, Promise<void>>;
|
|
26
|
+
//# sourceMappingURL=rateLimit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../../src/component/lib/rateLimit.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,eAAO,MAAM,KAAK;;;;;;;;GA4BhB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS;;iBA0CpB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,KAAK;;iBAchB,CAAC"}
|