@oktis-works/api 0.8.1 → 0.9.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/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts +52 -7
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +351 -32
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/routes/auth/index.d.ts.map +1 -1
- package/dist/routes/auth/index.js +26 -1
- package/dist/routes/auth/index.js.map +1 -1
- package/dist/routes/content/index.d.ts.map +1 -1
- package/dist/routes/content/index.js +28 -1
- package/dist/routes/content/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import { bootstrap, getEventBus, registerEventAuditLog, getRegisteredPluginRoute
|
|
|
9
9
|
import { CMS_VERSION } from '@oktis-works/validation';
|
|
10
10
|
import { loadConfig } from '@oktis-works/config';
|
|
11
11
|
import { traceMiddleware } from './middleware/trace.js';
|
|
12
|
-
import { rateLimitMiddleware } from './middleware/rate-limit.js';
|
|
12
|
+
import { rateLimitMiddleware, loginRateLimitMiddleware } from './middleware/rate-limit.js';
|
|
13
13
|
import { csrfMiddleware } from './middleware/csrf.js';
|
|
14
14
|
import { auditMiddleware } from './middleware/audit.js';
|
|
15
15
|
import authRouter from './routes/auth/index.js';
|
|
@@ -86,7 +86,11 @@ async function main() {
|
|
|
86
86
|
credentials: true,
|
|
87
87
|
}));
|
|
88
88
|
app.use('*', prettyJSON());
|
|
89
|
-
// rest-api-003: rate limiting
|
|
89
|
+
// rest-api-003: rate limiting por classe de tráfego (429 + Retry-After).
|
|
90
|
+
// Credenciais primeiro: o brute force recebe 429 próprio (por IP e por
|
|
91
|
+
// e-mail) em vez de esvaziar o orçamento dos clientes legítimos. Depois o
|
|
92
|
+
// limiter global — anônimo por IP real, autenticado por user id da sessão.
|
|
93
|
+
app.use('/api/v1/auth/login', loginRateLimitMiddleware());
|
|
90
94
|
app.use('*', rateLimitMiddleware());
|
|
91
95
|
app.use('/api/*', csrfMiddleware);
|
|
92
96
|
app.use('/api/*', auditMiddleware);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,sCAAsC;AAEtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC7G,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,63 @@
|
|
|
1
1
|
import type { Context, Next } from 'hono';
|
|
2
|
+
import { type RateLimitSettings } from '@oktis-works/config';
|
|
2
3
|
export interface RateLimitOptions {
|
|
4
|
+
/** Máximo do bucket ANÔNIMO por janela. */
|
|
3
5
|
max?: number;
|
|
6
|
+
/** Janela (ms) dos buckets anônimo e autenticado. */
|
|
4
7
|
windowMs?: number;
|
|
8
|
+
/** Máximo do bucket AUTENTICADO por janela. */
|
|
9
|
+
authMax?: number;
|
|
10
|
+
/** Tentativas de login por IP na janela de credenciais. */
|
|
11
|
+
loginMaxPerIp?: number;
|
|
12
|
+
/** Tentativas de login por e-mail na janela de credenciais. */
|
|
13
|
+
loginMax?: number;
|
|
14
|
+
/** Janela (ms) do limiter de credenciais. */
|
|
15
|
+
loginWindowMs?: number;
|
|
5
16
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
windowMs: number;
|
|
9
|
-
};
|
|
10
|
-
export declare function clientKey(c: Context): string;
|
|
17
|
+
/** Parser único (delega para @oktis-works/config — mesma fonte do wizard da CLI). */
|
|
18
|
+
export declare function parseRateLimitEnv(env?: Record<string, string | undefined>): RateLimitSettings;
|
|
11
19
|
/** Reseta os buckets (uso em testes). */
|
|
12
20
|
export declare function resetRateLimiter(): void;
|
|
21
|
+
/** Observabilidade/testes: quantos buckets estão vivos agora. */
|
|
22
|
+
export declare function rateLimiterStats(): {
|
|
23
|
+
buckets: number;
|
|
24
|
+
};
|
|
25
|
+
/** Remove buckets cuja janela já venceu (uso em testes e em shutdown). */
|
|
26
|
+
export declare function sweepExpiredBuckets(now?: number): number;
|
|
27
|
+
export declare function isTrustedProxy(ip: string | null | undefined): boolean;
|
|
28
|
+
/** IP do par imediato (socket TCP) — a identidade que NUNCA é forjável. */
|
|
29
|
+
export declare function socketPeerIp(c: Context): string | null;
|
|
30
|
+
/** Resolve o IP do cliente final respeitando TRUST_PROXY (true/false/auto). */
|
|
31
|
+
export declare function resolveClientIp(c: Context): string;
|
|
32
|
+
/** User id da sessão, quando o request carrega um access token válido. */
|
|
33
|
+
export declare function authenticatedUserId(c: Context): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Chave do bucket: `u:<user id>` quando autenticado (orçamento próprio, não
|
|
36
|
+
* disputa com anônimos), senão `ip:<ip real>`. O tenant saiu da chave porque
|
|
37
|
+
* `X-Tenant-ID` é controlado pelo cliente e permitia trocar de balde à vontade.
|
|
38
|
+
*/
|
|
39
|
+
export declare function clientKey(c: Context): string;
|
|
40
|
+
/** Leitura é barata; escrita custa 5x para não ser engolida por rajadas de GET. */
|
|
41
|
+
export declare function requestCost(method: string): number;
|
|
42
|
+
/**
|
|
43
|
+
* Rotas que nunca consomem orçamento: probes (/health, /metrics), mídia
|
|
44
|
+
* estática (binário imutável, cache 30d no nginx) e o bootstrap do CSRF
|
|
45
|
+
* (UUID aleatório, não toca o banco) — nenhuma delas é API transacional.
|
|
46
|
+
*/
|
|
47
|
+
export declare function isExemptPath(method: string, path: string): boolean;
|
|
13
48
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
49
|
+
* Limiter global por classe de tráfego: 429 + Retry-After quando a classe
|
|
50
|
+
* estoura o próprio orçamento. Credenciais e probes ficam por conta de
|
|
51
|
+
* `loginRateLimitMiddleware` e das isenções acima.
|
|
16
52
|
*/
|
|
17
53
|
export declare function rateLimitMiddleware(options?: RateLimitOptions): (c: Context, next: Next) => Promise<Response | undefined>;
|
|
54
|
+
/**
|
|
55
|
+
* Limiter dedicado de credenciais (POST /auth/login).
|
|
56
|
+
*
|
|
57
|
+
* Duas chaves simultâneas: por IP (segura o ataque de um host rotando
|
|
58
|
+
* e-mails) e por e-mail (segura o ataque de muitos hosts mirando uma conta).
|
|
59
|
+
* Fica ANTES do limiter global para que o brute force receba 429 próprio em
|
|
60
|
+
* vez de esvaziar o orçamento dos demais clientes.
|
|
61
|
+
*/
|
|
62
|
+
export declare function loginRateLimitMiddleware(options?: RateLimitOptions): (c: Context, next: Next) => Promise<Response | undefined>;
|
|
18
63
|
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAsC,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAejG,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,iBAAiB,CAE1G;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAEtD;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAmB,GAAG,MAAM,CAIpE;AAgDD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGrE;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAKtD;AAmBD,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CA2BlD;AAuDD,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAO7D;AAID;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAG5C;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAMlE;AAsDD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,gBAAqB,OAW/C,OAAO,QAAQ,IAAI,KAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAqBrE;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,gBAAqB,OAOpD,OAAO,QAAQ,IAAI,KAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CA4BrE"}
|
|
@@ -1,56 +1,375 @@
|
|
|
1
|
-
// @oktis-works/api - Rate limiting por
|
|
1
|
+
// @oktis-works/api - Rate limiting por classe de tráfego (REQU-020/rest-api-003)
|
|
2
|
+
//
|
|
3
|
+
// Três classes, três orçamentos, três chaves:
|
|
4
|
+
//
|
|
5
|
+
// | Classe | Chave | Budget (default) |
|
|
6
|
+
// |--------------|--------------------|--------------------|
|
|
7
|
+
// | Credenciais | login:ip / login:e | 100 e 10 / 5 min |
|
|
8
|
+
// | Autenticado | u:<user id> | 1200 / 60s |
|
|
9
|
+
// | Anônimo | ip:<ip real> | 300 / 60s |
|
|
10
|
+
//
|
|
11
|
+
// Por que não é "300 req/min para todo mundo" (comportamento antigo):
|
|
12
|
+
//
|
|
13
|
+
// * a identidade do cliente vem do IP real (socket, ou X-Forwarded-For
|
|
14
|
+
// apenas quando o par imediato é um proxy de confiança) — nunca mais a
|
|
15
|
+
// chave literal `platform:unknown` que fazia TODOS os clientes dividirem
|
|
16
|
+
// um único balde;
|
|
17
|
+
// * `X-Tenant-ID` e `X-Forwarded-For` não compõem mais a chave: o primeiro
|
|
18
|
+
// é controlado pelo cliente (burlava o limite) e o segundo só vale atrás
|
|
19
|
+
// de proxy confiável;
|
|
20
|
+
// * requisições autenticadas têm balde próprio por usuário, então crawlers
|
|
21
|
+
// e visitantes anônimos do site público não derrubam o admin;
|
|
22
|
+
// * mídia estática (`/api/v1/media/file/...`, já servida com cache
|
|
23
|
+
// imutável) e o bootstrap de CSRF não consomem orçamento;
|
|
24
|
+
// * escritas custam mais que leituras (POST/PUT/PATCH/DELETE = 5), então
|
|
25
|
+
// uma rajada de GETs de miniatura não bloqueia um PUT legítimo;
|
|
26
|
+
// * os buckets expiram por varredura oportunista (nada fica no Map para
|
|
27
|
+
// sempre) e há teto de chaves vivas (vetor de DoS por memória fechado).
|
|
28
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
29
|
+
import { loadConfig, parseRateLimitSettings } from '@oktis-works/config';
|
|
2
30
|
const buckets = new Map();
|
|
31
|
+
/** Teto de chaves vivas: acima disso varre e evita o mais antigo (fecho DoS). */
|
|
32
|
+
const MAX_BUCKETS = 50_000;
|
|
33
|
+
/** Varre buckets expirados a cada N consumos (sem timer — nada segura o processo). */
|
|
34
|
+
const SWEEP_EVERY = 500;
|
|
35
|
+
let operations = 0;
|
|
36
|
+
/** Parser único (delega para @oktis-works/config — mesma fonte do wizard da CLI). */
|
|
3
37
|
export function parseRateLimitEnv(env = process.env) {
|
|
4
|
-
|
|
5
|
-
const windowSeconds = Number(env['RATE_LIMIT_WINDOW_SECONDS'] ?? 60);
|
|
6
|
-
return {
|
|
7
|
-
max: Number.isFinite(max) && max > 0 ? Math.floor(max) : 300,
|
|
8
|
-
windowMs: Number.isFinite(windowSeconds) && windowSeconds > 0 ? windowSeconds * 1000 : 60_000,
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
export function clientKey(c) {
|
|
12
|
-
const tenant = c.req.header('X-Tenant-ID') ?? 'platform';
|
|
13
|
-
const ip = c.req.header('X-Forwarded-For')?.split(',')[0]?.trim() ??
|
|
14
|
-
c.req.header('X-Real-IP') ??
|
|
15
|
-
'unknown';
|
|
16
|
-
return `${tenant}:${ip}`;
|
|
38
|
+
return parseRateLimitSettings(env);
|
|
17
39
|
}
|
|
18
40
|
/** Reseta os buckets (uso em testes). */
|
|
19
41
|
export function resetRateLimiter() {
|
|
20
42
|
buckets.clear();
|
|
43
|
+
operations = 0;
|
|
44
|
+
jwtSecretCache = null;
|
|
45
|
+
}
|
|
46
|
+
/** Observabilidade/testes: quantos buckets estão vivos agora. */
|
|
47
|
+
export function rateLimiterStats() {
|
|
48
|
+
return { buckets: buckets.size };
|
|
49
|
+
}
|
|
50
|
+
/** Remove buckets cuja janela já venceu (uso em testes e em shutdown). */
|
|
51
|
+
export function sweepExpiredBuckets(now = Date.now()) {
|
|
52
|
+
const before = buckets.size;
|
|
53
|
+
sweep(now);
|
|
54
|
+
return before - buckets.size;
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------- identidade ---
|
|
57
|
+
function readEnv(name) {
|
|
58
|
+
return (process.env[name] ?? '').trim();
|
|
59
|
+
}
|
|
60
|
+
/** Faixas privadas + loopback: o padrão de "proxy de confiança" (nginx/docker/local). */
|
|
61
|
+
function isPrivateOrLoopback(ip) {
|
|
62
|
+
if (ip === '::1' || ip === 'localhost')
|
|
63
|
+
return true;
|
|
64
|
+
if (/^127\./.test(ip))
|
|
65
|
+
return true;
|
|
66
|
+
if (/^10\./.test(ip))
|
|
67
|
+
return true;
|
|
68
|
+
if (/^192\.168\./.test(ip))
|
|
69
|
+
return true;
|
|
70
|
+
if (/^169\.254\./.test(ip))
|
|
71
|
+
return true;
|
|
72
|
+
const second = Number(ip.split('.')[1] ?? NaN);
|
|
73
|
+
if (ip.startsWith('172.') && second >= 16 && second <= 31)
|
|
74
|
+
return true;
|
|
75
|
+
// ULA do IPv6 (fc00::/7) e link-local (fe80::/10)
|
|
76
|
+
if (/^f[cd]/i.test(ip) || /^fe[89ab]/i.test(ip))
|
|
77
|
+
return true;
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
/** Lista explícita TRUSTED_PROXIES (IPs ou CIDRs, separados por vírgula). */
|
|
81
|
+
function isExplicitlyTrusted(ip) {
|
|
82
|
+
const raw = readEnv('TRUSTED_PROXIES');
|
|
83
|
+
if (!raw)
|
|
84
|
+
return false;
|
|
85
|
+
return raw.split(',').some((entry) => {
|
|
86
|
+
const value = entry.trim();
|
|
87
|
+
if (!value)
|
|
88
|
+
return false;
|
|
89
|
+
if (value === ip)
|
|
90
|
+
return true;
|
|
91
|
+
if (!value.includes('/'))
|
|
92
|
+
return false;
|
|
93
|
+
// CIDR /8 /16 /24 para IPv4 — suficiente para os casos reais de proxy.
|
|
94
|
+
const [base, prefixRaw] = value.split('/');
|
|
95
|
+
const prefix = Number(prefixRaw);
|
|
96
|
+
if (!base || !Number.isInteger(prefix))
|
|
97
|
+
return false;
|
|
98
|
+
const a = ip.split('.').map(Number);
|
|
99
|
+
const b = base.split('.').map(Number);
|
|
100
|
+
if (a.length !== 4 || b.length !== 4 || a.some(Number.isNaN) || b.some(Number.isNaN))
|
|
101
|
+
return false;
|
|
102
|
+
const maskBits = prefix;
|
|
103
|
+
for (let i = 0; i < 4; i++) {
|
|
104
|
+
const bits = Math.min(8, Math.max(0, maskBits - i * 8));
|
|
105
|
+
const mask = bits === 0 ? 0 : (0xff << (8 - bits)) & 0xff;
|
|
106
|
+
if ((a[i] & mask) !== (b[i] & mask))
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export function isTrustedProxy(ip) {
|
|
113
|
+
if (!ip)
|
|
114
|
+
return false;
|
|
115
|
+
return isExplicitlyTrusted(ip) || isPrivateOrLoopback(ip);
|
|
116
|
+
}
|
|
117
|
+
/** IP do par imediato (socket TCP) — a identidade que NUNCA é forjável. */
|
|
118
|
+
export function socketPeerIp(c) {
|
|
119
|
+
const env = c.env;
|
|
120
|
+
const raw = env?.incoming?.socket?.remoteAddress ?? null;
|
|
121
|
+
if (!raw)
|
|
122
|
+
return null;
|
|
123
|
+
return raw.startsWith('::ffff:') ? raw.slice(7) : raw;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Cliente final a partir de X-Forwarded-For: caminha da DIREITA para a
|
|
127
|
+
* esquerda pulando proxies de confiança e para no primeiro hop que NÃO é
|
|
128
|
+
* proxy — esse é o cliente real. O primeiro valor (o que o antigo código
|
|
129
|
+
* usava) é justamente o mais forjável: qualquer um manda `XFF: 1.2.3.4`.
|
|
130
|
+
*/
|
|
131
|
+
function clientFromForwarded(value) {
|
|
132
|
+
const hops = value.split(',').map((s) => s.trim()).filter(Boolean);
|
|
133
|
+
if (hops.length === 0)
|
|
134
|
+
return null;
|
|
135
|
+
for (let i = hops.length - 1; i >= 0; i--) {
|
|
136
|
+
const hop = hops[i];
|
|
137
|
+
if (!isTrustedProxy(hop))
|
|
138
|
+
return hop;
|
|
139
|
+
}
|
|
140
|
+
// Todos os hops são proxies de confiança: o mais externo é o cliente.
|
|
141
|
+
return hops[0] ?? null;
|
|
142
|
+
}
|
|
143
|
+
/** Resolve o IP do cliente final respeitando TRUST_PROXY (true/false/auto). */
|
|
144
|
+
export function resolveClientIp(c) {
|
|
145
|
+
const peer = socketPeerIp(c);
|
|
146
|
+
const forwarded = c.req.header('X-Forwarded-For');
|
|
147
|
+
const realIp = c.req.header('X-Real-IP');
|
|
148
|
+
const trust = readEnv('TRUST_PROXY').toLowerCase();
|
|
149
|
+
const trusted = trust === 'true' || trust === '1' || trust === 'on';
|
|
150
|
+
const distrusted = trust === 'false' || trust === '0' || trust === 'off';
|
|
151
|
+
// TRUST_PROXY=false: header de proxy é ignorado de propósito.
|
|
152
|
+
if (distrusted)
|
|
153
|
+
return peer ?? 'unknown';
|
|
154
|
+
// Sem par TCP identificável (testes, runtimes sem IncomingMessage): o header
|
|
155
|
+
// é a única sinalização de identidade existente e vem do proxy de edge.
|
|
156
|
+
if (!peer) {
|
|
157
|
+
if (forwarded)
|
|
158
|
+
return clientFromForwarded(forwarded) ?? 'unknown';
|
|
159
|
+
return realIp?.trim() || 'unknown';
|
|
160
|
+
}
|
|
161
|
+
// Par não-proxied (exposto direto na internet): só o socket vale. Um
|
|
162
|
+
// atacante direto não consegue trocar de balde mandando XFF forjado.
|
|
163
|
+
if (!trusted && !isTrustedProxy(peer))
|
|
164
|
+
return peer;
|
|
165
|
+
// TRUST_PROXY=true ou par é proxy de confiança → o header descreve o cliente.
|
|
166
|
+
if (forwarded)
|
|
167
|
+
return clientFromForwarded(forwarded) ?? peer;
|
|
168
|
+
if (realIp)
|
|
169
|
+
return realIp.trim() || peer;
|
|
170
|
+
return peer;
|
|
171
|
+
}
|
|
172
|
+
// ------------------------------------------------------------------- sessão ---
|
|
173
|
+
/**
|
|
174
|
+
* Secret do JWT em cache: `loadConfig()` faz I/O de disco a cada chamada e
|
|
175
|
+
* este caminho roda em TODA requisição autenticada.
|
|
176
|
+
*/
|
|
177
|
+
let jwtSecretCache = null;
|
|
178
|
+
function jwtSecret() {
|
|
179
|
+
if (jwtSecretCache === null)
|
|
180
|
+
jwtSecretCache = loadConfig().auth.jwtSecret;
|
|
181
|
+
return jwtSecretCache;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Extrai o user id da sessão verificando a assinatura HS256 do cookie
|
|
185
|
+
* `access_token` — HMAC puro, sem tocar o banco (custo desprezível frente a
|
|
186
|
+
* uma query) e, principalmente, IMPOSSÍVEL de forjar por um cliente.
|
|
187
|
+
*/
|
|
188
|
+
function subjectFromAccessToken(token) {
|
|
189
|
+
const parts = token.split('.');
|
|
190
|
+
if (parts.length !== 3)
|
|
191
|
+
return null;
|
|
192
|
+
const [headerPart, payloadPart, signature] = parts;
|
|
193
|
+
if (!headerPart || !payloadPart || !signature)
|
|
194
|
+
return null;
|
|
195
|
+
try {
|
|
196
|
+
const header = JSON.parse(Buffer.from(headerPart, 'base64url').toString('utf8'));
|
|
197
|
+
if (header.alg !== 'HS256')
|
|
198
|
+
return null;
|
|
199
|
+
const expected = createHmac('sha256', jwtSecret()).update(`${headerPart}.${payloadPart}`).digest('base64url');
|
|
200
|
+
const a = Buffer.from(signature);
|
|
201
|
+
const b = Buffer.from(expected);
|
|
202
|
+
if (a.length !== b.length || !timingSafeEqual(a, b))
|
|
203
|
+
return null;
|
|
204
|
+
const payload = JSON.parse(Buffer.from(payloadPart, 'base64url').toString('utf8'));
|
|
205
|
+
if (typeof payload.sub !== 'string' || !payload.sub)
|
|
206
|
+
return null;
|
|
207
|
+
if (typeof payload.exp === 'number' && payload.exp * 1000 <= Date.now())
|
|
208
|
+
return null;
|
|
209
|
+
return payload.sub;
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function readCookie(cookieHeader, name) {
|
|
216
|
+
if (!cookieHeader)
|
|
217
|
+
return null;
|
|
218
|
+
for (const part of cookieHeader.split(';')) {
|
|
219
|
+
const [key, ...rest] = part.trim().split('=');
|
|
220
|
+
if (key === name)
|
|
221
|
+
return decodeURIComponent(rest.join('='));
|
|
222
|
+
}
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
/** User id da sessão, quando o request carrega um access token válido. */
|
|
226
|
+
export function authenticatedUserId(c) {
|
|
227
|
+
const cookieToken = readCookie(c.req.header('Cookie'), 'access_token');
|
|
228
|
+
const bearer = c.req.header('Authorization')?.startsWith('Bearer ')
|
|
229
|
+
? c.req.header('Authorization').slice(7)
|
|
230
|
+
: undefined;
|
|
231
|
+
const token = cookieToken ?? bearer;
|
|
232
|
+
return token ? subjectFromAccessToken(token) : null;
|
|
233
|
+
}
|
|
234
|
+
// ------------------------------------------------------------------- chaves ---
|
|
235
|
+
/**
|
|
236
|
+
* Chave do bucket: `u:<user id>` quando autenticado (orçamento próprio, não
|
|
237
|
+
* disputa com anônimos), senão `ip:<ip real>`. O tenant saiu da chave porque
|
|
238
|
+
* `X-Tenant-ID` é controlado pelo cliente e permitia trocar de balde à vontade.
|
|
239
|
+
*/
|
|
240
|
+
export function clientKey(c) {
|
|
241
|
+
const userId = authenticatedUserId(c);
|
|
242
|
+
return userId ? `u:${userId}` : `ip:${resolveClientIp(c)}`;
|
|
243
|
+
}
|
|
244
|
+
/** Leitura é barata; escrita custa 5x para não ser engolida por rajadas de GET. */
|
|
245
|
+
export function requestCost(method) {
|
|
246
|
+
return ['GET', 'HEAD', 'OPTIONS', 'TRACE'].includes(method.toUpperCase()) ? 1 : 5;
|
|
21
247
|
}
|
|
22
248
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
249
|
+
* Rotas que nunca consomem orçamento: probes (/health, /metrics), mídia
|
|
250
|
+
* estática (binário imutável, cache 30d no nginx) e o bootstrap do CSRF
|
|
251
|
+
* (UUID aleatório, não toca o banco) — nenhuma delas é API transacional.
|
|
252
|
+
*/
|
|
253
|
+
export function isExemptPath(method, path) {
|
|
254
|
+
if (path === '/health' || path.startsWith('/api/v1/health') || path === '/metrics')
|
|
255
|
+
return true;
|
|
256
|
+
const get = method.toUpperCase() === 'GET';
|
|
257
|
+
if (get && path.startsWith('/api/v1/media/file/'))
|
|
258
|
+
return true;
|
|
259
|
+
if (get && path === '/api/v1/auth/csrf')
|
|
260
|
+
return true;
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
// ------------------------------------------------------------------ buckets ---
|
|
264
|
+
function sweep(now) {
|
|
265
|
+
for (const [key, bucket] of buckets) {
|
|
266
|
+
if (bucket.resetAt <= now)
|
|
267
|
+
buckets.delete(key);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function maybeSweep(now) {
|
|
271
|
+
operations += 1;
|
|
272
|
+
if (buckets.size <= MAX_BUCKETS && operations % SWEEP_EVERY !== 0)
|
|
273
|
+
return;
|
|
274
|
+
sweep(now);
|
|
275
|
+
if (buckets.size <= MAX_BUCKETS)
|
|
276
|
+
return;
|
|
277
|
+
// Estourou o teto mesmo com a varredura: evicta o bucket mais antigo.
|
|
278
|
+
const oldest = [...buckets.entries()].sort((a, b) => a[1].resetAt - b[1].resetAt);
|
|
279
|
+
for (const [key] of oldest.slice(0, buckets.size - MAX_BUCKETS))
|
|
280
|
+
buckets.delete(key);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* consome `cost` tokens do bucket da `key`, recriando a janela quando ela
|
|
284
|
+
* expira. Devolve o total consumido na janela corrente e o instante de reset
|
|
285
|
+
* (o caller compara com o max da própria classe).
|
|
286
|
+
*/
|
|
287
|
+
function consume(key, cost, windowMs, now) {
|
|
288
|
+
maybeSweep(now);
|
|
289
|
+
let bucket = buckets.get(key);
|
|
290
|
+
if (!bucket || bucket.resetAt <= now) {
|
|
291
|
+
bucket = { count: 0, resetAt: now + windowMs };
|
|
292
|
+
buckets.set(key, bucket);
|
|
293
|
+
}
|
|
294
|
+
bucket.count += cost;
|
|
295
|
+
return { count: bucket.count, resetAt: bucket.resetAt };
|
|
296
|
+
}
|
|
297
|
+
function rateLimitResponse(c, limit, resetAt) {
|
|
298
|
+
const retryAfter = Math.max(1, Math.ceil((resetAt - Date.now()) / 1000));
|
|
299
|
+
c.header('Retry-After', String(retryAfter));
|
|
300
|
+
c.header('X-RateLimit-Limit', String(limit));
|
|
301
|
+
c.header('X-RateLimit-Remaining', '0');
|
|
302
|
+
return c.json({ error: 'TOO_MANY_REQUESTS', message: `Rate limit exceeded. Retry after ${retryAfter}s.` }, 429);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Limiter global por classe de tráfego: 429 + Retry-After quando a classe
|
|
306
|
+
* estoura o próprio orçamento. Credenciais e probes ficam por conta de
|
|
307
|
+
* `loginRateLimitMiddleware` e das isenções acima.
|
|
25
308
|
*/
|
|
26
309
|
export function rateLimitMiddleware(options = {}) {
|
|
27
|
-
|
|
310
|
+
// Garante que o .env do projeto já tenha sido carregado antes do parse
|
|
311
|
+
// (loadConfig faz o load uma única vez e é idempotente).
|
|
312
|
+
loadConfig();
|
|
313
|
+
const settings = parseRateLimitSettings();
|
|
314
|
+
const { max, windowMs, authMax } = {
|
|
315
|
+
max: options.max ?? settings.max,
|
|
316
|
+
windowMs: options.windowMs ?? settings.windowMs,
|
|
317
|
+
authMax: options.authMax ?? settings.authMax,
|
|
318
|
+
};
|
|
28
319
|
return async (c, next) => {
|
|
29
320
|
const path = new URL(c.req.url).pathname;
|
|
30
|
-
if (
|
|
321
|
+
if (isExemptPath(c.req.method, path)) {
|
|
31
322
|
await next();
|
|
32
323
|
return;
|
|
33
324
|
}
|
|
34
325
|
const key = clientKey(c);
|
|
326
|
+
const limit = key.startsWith('u:') ? authMax : max;
|
|
35
327
|
const now = Date.now();
|
|
36
|
-
const
|
|
37
|
-
if (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
328
|
+
const result = consume(key, requestCost(c.req.method), windowMs, now);
|
|
329
|
+
if (result.count > limit) {
|
|
330
|
+
return rateLimitResponse(c, limit, result.resetAt);
|
|
331
|
+
}
|
|
332
|
+
c.header('X-RateLimit-Limit', String(limit));
|
|
333
|
+
c.header('X-RateLimit-Remaining', String(Math.max(0, limit - result.count)));
|
|
334
|
+
await next();
|
|
335
|
+
return;
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Limiter dedicado de credenciais (POST /auth/login).
|
|
340
|
+
*
|
|
341
|
+
* Duas chaves simultâneas: por IP (segura o ataque de um host rotando
|
|
342
|
+
* e-mails) e por e-mail (segura o ataque de muitos hosts mirando uma conta).
|
|
343
|
+
* Fica ANTES do limiter global para que o brute force receba 429 próprio em
|
|
344
|
+
* vez de esvaziar o orçamento dos demais clientes.
|
|
345
|
+
*/
|
|
346
|
+
export function loginRateLimitMiddleware(options = {}) {
|
|
347
|
+
loadConfig();
|
|
348
|
+
const settings = parseRateLimitSettings();
|
|
349
|
+
const loginMax = options.loginMax ?? settings.loginMax;
|
|
350
|
+
const loginMaxPerIp = options.loginMaxPerIp ?? settings.loginMaxPerIp;
|
|
351
|
+
const windowMs = options.loginWindowMs ?? settings.loginWindowMs;
|
|
352
|
+
return async (c, next) => {
|
|
353
|
+
if (c.req.method.toUpperCase() !== 'POST') {
|
|
41
354
|
await next();
|
|
42
355
|
return;
|
|
43
356
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
357
|
+
const ip = resolveClientIp(c);
|
|
358
|
+
const body = await c.req.json().catch(() => null);
|
|
359
|
+
const email = typeof body?.email === 'string' ? body.email.trim().toLowerCase().slice(0, 254) : '';
|
|
360
|
+
const now = Date.now();
|
|
361
|
+
const ipKey = `login:ip:${ip}`;
|
|
362
|
+
const ipResult = consume(ipKey, 1, windowMs, now);
|
|
363
|
+
if (ipResult.count > loginMaxPerIp) {
|
|
364
|
+
return rateLimitResponse(c, loginMaxPerIp, ipResult.resetAt);
|
|
365
|
+
}
|
|
366
|
+
if (email) {
|
|
367
|
+
const emailKey = `login:email:${email}`;
|
|
368
|
+
const emailResult = consume(emailKey, 1, windowMs, now);
|
|
369
|
+
if (emailResult.count > loginMax) {
|
|
370
|
+
return rateLimitResponse(c, loginMax, emailResult.resetAt);
|
|
371
|
+
}
|
|
51
372
|
}
|
|
52
|
-
c.header('X-RateLimit-Limit', String(max));
|
|
53
|
-
c.header('X-RateLimit-Remaining', String(Math.max(0, max - bucket.count)));
|
|
54
373
|
await next();
|
|
55
374
|
return;
|
|
56
375
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/auth/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAsD5B,QAAA,MAAM,UAAU,4EAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/auth/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAsD5B,QAAA,MAAM,UAAU,4EAAa,CAAC;AA0P9B,eAAe,UAAU,CAAC"}
|
|
@@ -67,14 +67,36 @@ const REFRESH_OPTS = {
|
|
|
67
67
|
path: '/',
|
|
68
68
|
maxAge: cookieCfg.refreshTokenMaxAge ?? 60 * 60 * 24 * 30, // 30d
|
|
69
69
|
};
|
|
70
|
+
/**
|
|
71
|
+
* Cookie legível pelo JS com o vencimento do access token.
|
|
72
|
+
*
|
|
73
|
+
* O access token é HttpOnly (inacessível ao JS), então o admin não tem como
|
|
74
|
+
* saber quando ele vence e só descobria no primeiro 401 — quando TODAS as
|
|
75
|
+
* requisições paralelas da página já tinham sido disparadas, gerando o burst
|
|
76
|
+
* de ~40 chamadas que esvaziava o rate limit. Este cookie permite o refresh
|
|
77
|
+
* PROATIVO (antes do 401). Não é sensível: só expõe um timestamp.
|
|
78
|
+
*/
|
|
79
|
+
function setSessionExpiryCookie(c) {
|
|
80
|
+
const maxAge = cookieCfg.accessTokenMaxAge ?? 60 * 15;
|
|
81
|
+
setCookie(c, 'session_expires_at', new Date(Date.now() + maxAge * 1000).toISOString(), {
|
|
82
|
+
httpOnly: false,
|
|
83
|
+
secure: cookieSecure,
|
|
84
|
+
sameSite: cookieCfg.sameSite,
|
|
85
|
+
...(cookieDomain ? { domain: cookieDomain } : {}),
|
|
86
|
+
path: '/',
|
|
87
|
+
maxAge,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
70
90
|
/** Set-Cookie múltiplo: hono/cookie setCookie appenda corretamente. */
|
|
71
91
|
function setAuthCookies(c, accessToken, refreshToken) {
|
|
72
92
|
setCookie(c, 'access_token', accessToken, ACCESS_OPTS);
|
|
73
93
|
setCookie(c, 'refresh_token', refreshToken, REFRESH_OPTS);
|
|
94
|
+
setSessionExpiryCookie(c);
|
|
74
95
|
}
|
|
75
96
|
function clearAuthCookies(c) {
|
|
76
97
|
deleteCookie(c, 'access_token', { path: '/', ...(cookieDomain ? { domain: cookieDomain } : {}) });
|
|
77
98
|
deleteCookie(c, 'refresh_token', { path: '/', ...(cookieDomain ? { domain: cookieDomain } : {}) });
|
|
99
|
+
deleteCookie(c, 'session_expires_at', { path: '/', ...(cookieDomain ? { domain: cookieDomain } : {}) });
|
|
78
100
|
}
|
|
79
101
|
function isBrowserRequest(c) {
|
|
80
102
|
return Boolean(c.req.header('Origin') || c.req.header('Sec-Fetch-Site'));
|
|
@@ -225,7 +247,10 @@ authRouter.get('/me', async (c) => {
|
|
|
225
247
|
return c.json({ error: 'Invalid or expired token' }, 401);
|
|
226
248
|
}
|
|
227
249
|
const sql = (await import('@oktis-works/database')).getConnection();
|
|
228
|
-
|
|
250
|
+
// `locale` vem junto para que o SSR do admin resolva idioma E sessão em
|
|
251
|
+
// UMA requisição server-side (antes eram /auth/me + /users/me/locale +
|
|
252
|
+
// /auth/me de novo no client).
|
|
253
|
+
const rows = await sql.unsafe('SELECT id, email, name, avatar, status, last_login_at, locale FROM users WHERE id = $1', [payload.sub]);
|
|
229
254
|
if (!rows.length) {
|
|
230
255
|
return c.json({ error: 'User not found' }, 404);
|
|
231
256
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/auth/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/auth/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/content/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,QAAA,MAAM,aAAa,4EAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/content/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,QAAA,MAAM,aAAa,4EAAa,CAAC;AA8MjC,eAAe,aAAa,CAAC"}
|
|
@@ -1,10 +1,32 @@
|
|
|
1
1
|
// @oktis-works/api - Content Routes
|
|
2
2
|
import { Hono } from 'hono';
|
|
3
3
|
import { contentService, contentPublisher, enqueueJob } from '@oktis-works/core';
|
|
4
|
-
import { resolveTenantId } from '@oktis-works/database';
|
|
4
|
+
import { getConnection, resolveTenantId } from '@oktis-works/database';
|
|
5
5
|
import { authMiddleware, requirePermission } from '../../middleware/auth.js';
|
|
6
6
|
const contentRouter = new Hono();
|
|
7
7
|
contentRouter.use('*', authMiddleware);
|
|
8
|
+
/**
|
|
9
|
+
* Expande o autor de um lote de conteúdo em UMA query (anti N+1).
|
|
10
|
+
* O widget de atividade do dashboard consumia 1 requisição por item para
|
|
11
|
+
* descobrir o autor — 10 itens = 10 chamadas a /content/:id por carregamento.
|
|
12
|
+
*/
|
|
13
|
+
async function attachAuthors(items) {
|
|
14
|
+
const ids = [...new Set(items
|
|
15
|
+
.map((item) => (item['author_id'] ?? item['authorId']))
|
|
16
|
+
.filter((id) => typeof id === 'string' && id.length > 0))];
|
|
17
|
+
if (ids.length === 0)
|
|
18
|
+
return;
|
|
19
|
+
const rows = await getConnection().unsafe('SELECT id, name, email, avatar FROM users WHERE id = ANY($1)', [ids]);
|
|
20
|
+
const byId = new Map(rows.map((row) => [String(row['id']), row]));
|
|
21
|
+
for (const item of items) {
|
|
22
|
+
const authorId = (item['author_id'] ?? item['authorId']);
|
|
23
|
+
const row = authorId ? byId.get(authorId) : undefined;
|
|
24
|
+
const record = row;
|
|
25
|
+
item['author'] = record
|
|
26
|
+
? { id: record['id'], name: record['name'], email: record['email'], avatar: record['avatar'] ?? null }
|
|
27
|
+
: null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
8
30
|
contentRouter.get('/singleton/:type', requirePermission('read', 'content'), async (c) => {
|
|
9
31
|
const type = c.req.param('type');
|
|
10
32
|
const tenantId = await resolveTenantId(String(c.get('tenantId') ?? 'default'));
|
|
@@ -17,7 +39,12 @@ contentRouter.get('/', requirePermission('read', 'content'), async (c) => {
|
|
|
17
39
|
const type = c.req.query('type') || undefined;
|
|
18
40
|
const status = (c.req.query('status') || undefined);
|
|
19
41
|
const search = c.req.query('search') || undefined;
|
|
42
|
+
// ?include=author → anexa {author} a cada item em uma única query de users.
|
|
43
|
+
const includeAuthor = c.req.query('include') === 'author';
|
|
20
44
|
const result = await contentService.list({ page, limit, type, status, search });
|
|
45
|
+
if (includeAuthor) {
|
|
46
|
+
await attachAuthors(result.data);
|
|
47
|
+
}
|
|
21
48
|
return c.json(result);
|
|
22
49
|
});
|
|
23
50
|
contentRouter.get('/slug/:slug', requirePermission('read', 'content'), async (c) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/content/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/content/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oktis-works/api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -18,10 +18,10 @@
|
|
|
18
18
|
"clean": "rm -rf dist tsconfig.tsbuildinfo"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@oktis-works/core": "^0.5.
|
|
22
|
-
"@oktis-works/auth": "^0.5.
|
|
23
|
-
"@oktis-works/config": "^0.
|
|
24
|
-
"@oktis-works/database": "^0.5.
|
|
21
|
+
"@oktis-works/core": "^0.5.13",
|
|
22
|
+
"@oktis-works/auth": "^0.5.6",
|
|
23
|
+
"@oktis-works/config": "^0.6.0",
|
|
24
|
+
"@oktis-works/database": "^0.5.8",
|
|
25
25
|
"@oktis-works/types": "^0.5.6",
|
|
26
26
|
"hono": "4.13.12",
|
|
27
27
|
"@hono/node-server": "1.8.0",
|