vona-module-test-captcha 5.1.13 → 5.1.15
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/.metadata/index.d.ts +36 -0
- package/dist/.metadata/index.d.ts.map +1 -1
- package/dist/bean/captchaProvider.bound.d.ts +14 -0
- package/dist/bean/captchaProvider.bound.d.ts.map +1 -0
- package/dist/bean/captchaScene.bound.d.ts +4 -0
- package/dist/bean/captchaScene.bound.d.ts.map +1 -0
- package/dist/index.js +66 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/.metadata/index.ts +52 -0
- package/src/bean/captchaProvider.bound.ts +56 -0
- package/src/bean/captchaScene.bound.ts +9 -0
|
@@ -52,6 +52,42 @@ declare module 'vona-module-a-web' {
|
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
/** controller: end */
|
|
55
|
+
/** captchaProvider: begin */
|
|
56
|
+
export * from '../bean/captchaProvider.bound.ts';
|
|
57
|
+
import { type IDecoratorCaptchaProviderOptions } from 'vona-module-a-captcha';
|
|
58
|
+
declare module 'vona-module-a-captcha' {
|
|
59
|
+
interface ICaptchaProviderRecord {
|
|
60
|
+
'test-captcha:bound': IDecoratorCaptchaProviderOptions;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
declare module 'vona-module-test-captcha' {
|
|
64
|
+
interface CaptchaProviderBound {
|
|
65
|
+
}
|
|
66
|
+
interface CaptchaProviderBound {
|
|
67
|
+
get $beanFullName(): 'test-captcha.captchaProvider.bound';
|
|
68
|
+
get $onionName(): 'test-captcha:bound';
|
|
69
|
+
get $onionOptions(): IDecoratorCaptchaProviderOptions;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** captchaProvider: end */
|
|
73
|
+
/** captchaScene: begin */
|
|
74
|
+
export * from '../bean/captchaScene.bound.ts';
|
|
75
|
+
import { type IDecoratorCaptchaSceneOptions } from 'vona-module-a-captcha';
|
|
76
|
+
declare module 'vona-module-a-captcha' {
|
|
77
|
+
interface ICaptchaSceneRecord {
|
|
78
|
+
'test-captcha:bound': IDecoratorCaptchaSceneOptions;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
declare module 'vona-module-test-captcha' {
|
|
82
|
+
interface CaptchaSceneBound {
|
|
83
|
+
}
|
|
84
|
+
interface CaptchaSceneBound {
|
|
85
|
+
get $beanFullName(): 'test-captcha.captchaScene.bound';
|
|
86
|
+
get $onionName(): 'test-captcha:bound';
|
|
87
|
+
get $onionOptions(): IDecoratorCaptchaSceneOptions;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** captchaScene: end */
|
|
55
91
|
/** scope: begin */
|
|
56
92
|
import { BeanScopeBase, type BeanScopeUtil } from 'vona';
|
|
57
93
|
export declare class ScopeModuleTestCaptcha extends BeanScopeBase {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/.metadata/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,uBAAuB,EAAC,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAClG,iBAAiB;AACjB,cAAc,kBAAkB,CAAC;AACjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,mBAAmB,CAAC;AAC3B,OAAO,QAAQ,mBAAmB,CAAC;IAE/B,UAAiB,UAAU;QACzB,qBAAqB,EAAE,iBAAiB,CAAC;KAC1C;CAGJ;AACD,OAAO,QAAQ,0BAA0B,CAAC;CAEzC;AACD,eAAe;AACf,iBAAiB;AACjB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,QAAQ,0BAA0B,CAAC;IAEtC,UAAiB,iBAAiB;QAChC,MAAM,CAAC,EAAE,uBAAuB,CAAC,SAAS,EAAE,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,CAAC;KACzF;CACJ;AACD,eAAe;AACf,wBAAwB;AACxB,cAAc,0BAA0B,CAAC;AACzC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,mBAAmB,CAAC;AAC3B,OAAO,QAAQ,mBAAmB,CAAC;IAE/B,UAAiB,iBAAiB;QAChC,sBAAsB,EAAE,yBAAyB,CAAC;KACnD;CAGJ;AACD,OAAO,QAAQ,0BAA0B,CAAC;IAElC,UAAiB,iBAAiB;KAGjC;IAEC,UAAiB,iBAAiB;QAChC,IAAI,aAAa,IAAI,iCAAiC,CAAC;QACvD,IAAI,UAAU,IAAI,sBAAsB,CAAC;QACzC,IAAI,aAAa,IAAI,yBAAyB,CAAC;KAChD;CACV;AACD,sBAAsB;AACtB,wBAAwB;AAExB,OAAuC,0BAA0B,CAAC;AAClE,OAAO,QAAQ,0BAA0B,CAAC;IAEtC,UAAiB,yBAAyB;QACxC,OAAO,CAAC,EAAE,4BAA4B,CAAC,iBAAiB,CAAC,CAAC;KAC3D;CACJ;AACD,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAiB,kBAAkB;QAC7B,sBAAsB,EAAE,SAAS,CAAC;KACrC;CAEJ;AAED,sBAAsB;AACtB,mBAAmB;AACnB,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,MAAM,CAAC;AAGzD,qBACa,sBAAuB,SAAQ,aAAa;CAAG;AAE5D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,OAAO,MAAM,CAAC;AACd,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAiB,gBAAgB;QAC/B,cAAc,EAAE,sBAAsB,CAAC;KACxC;IAED,UAAiB,mBAAmB;QAClC,WAAW,EAAE,sBAAsB,CAAC;KACrC;CAOF;AACD,iBAAiB"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/.metadata/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ICaptchaAuthorization, ICaptchaBinding, ICaptchaProviderData, ICaptchaProviderExecute } from 'vona-module-a-captcha';
|
|
2
|
+
import { BeanBase } from 'vona';
|
|
3
|
+
export declare class CaptchaBoundContext {
|
|
4
|
+
readonly token: string;
|
|
5
|
+
readonly authorization: ICaptchaAuthorization;
|
|
6
|
+
constructor(binding?: ICaptchaBinding);
|
|
7
|
+
}
|
|
8
|
+
export declare class CaptchaProviderBound extends BeanBase implements ICaptchaProviderExecute<string> {
|
|
9
|
+
readonly bound = true;
|
|
10
|
+
authorize(context: unknown): ICaptchaAuthorization | undefined;
|
|
11
|
+
create(_options: unknown, context?: unknown): Promise<ICaptchaProviderData<string>>;
|
|
12
|
+
verify(token: string, tokenInput: string): Promise<boolean>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=captchaProvider.bound.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captchaProvider.bound.d.ts","sourceRoot":"","sources":["../../src/bean/captchaProvider.bound.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACxB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,QAAQ,EAAU,MAAM,MAAM,CAAC;AAGxC,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,KAAK,SAAY;IAC1B,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC;gBAG5C,OAAO,GAAE,eAIR;CAaJ;AAED,qBACa,oBAAqB,SAAQ,QAAS,YAAW,uBAAuB,CAAC,MAAM,CAAC;IAC3F,QAAQ,CAAC,KAAK,QAAQ;IAEtB,SAAS,CAAC,OAAO,EAAE,OAAO;IAMpB,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAOnF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGlE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captchaScene.bound.d.ts","sourceRoot":"","sources":["../../src/bean/captchaScene.bound.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGhC,qBAKa,iBAAkB,SAAQ,QAAQ;CAAG"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { BeanInfo, BeanBase, BeanScopeBase } from 'vona';
|
|
1
|
+
import { BeanInfo, BeanBase, uuidv4, BeanScopeBase } from 'vona';
|
|
2
2
|
import { __decorate, __metadata, __param } from 'tslib';
|
|
3
3
|
import { Api, v } from 'vona-module-a-openapiutils';
|
|
4
4
|
import { Dto, Web, Arg, Controller } from 'vona-module-a-web';
|
|
5
5
|
import { ZovaRender } from 'zova-rest-cabloy-basic-admin';
|
|
6
6
|
import { Core } from 'vona-module-a-core';
|
|
7
7
|
import { Passport } from 'vona-module-a-user';
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { CaptchaProvider, CaptchaScene } from 'vona-module-a-captcha';
|
|
8
10
|
import { Scope } from 'vona-module-a-bean';
|
|
9
11
|
|
|
10
12
|
let DtoSignin = class DtoSignin {
|
|
@@ -36,11 +38,73 @@ ControllerCaptcha = __decorate([Controller({
|
|
|
36
38
|
module: "test-captcha"
|
|
37
39
|
})], ControllerCaptcha);
|
|
38
40
|
|
|
41
|
+
class CaptchaBoundContext {
|
|
42
|
+
constructor(binding = {
|
|
43
|
+
recipient: `${uuidv4()}@example.test`,
|
|
44
|
+
purpose: 'captcha-regression',
|
|
45
|
+
subject: uuidv4()
|
|
46
|
+
}) {
|
|
47
|
+
this.token = uuidv4();
|
|
48
|
+
this.authorization = void 0;
|
|
49
|
+
this.authorization = {
|
|
50
|
+
binding,
|
|
51
|
+
scope: createHash('sha256').update(JSON.stringify(binding)).digest('hex'),
|
|
52
|
+
ip: createHash('sha256').update(uuidv4()).digest('hex'),
|
|
53
|
+
ttl: 60_000,
|
|
54
|
+
cooldown: 0,
|
|
55
|
+
maxAttempts: 5,
|
|
56
|
+
recipientLimits: [{
|
|
57
|
+
limit: 10,
|
|
58
|
+
windowMs: 60_000
|
|
59
|
+
}],
|
|
60
|
+
ipLimits: [{
|
|
61
|
+
limit: 10,
|
|
62
|
+
windowMs: 60_000
|
|
63
|
+
}]
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
let CaptchaProviderBound = class CaptchaProviderBound extends BeanBase {
|
|
68
|
+
constructor(...args) {
|
|
69
|
+
super(...args);
|
|
70
|
+
this.bound = true;
|
|
71
|
+
}
|
|
72
|
+
authorize(context) {
|
|
73
|
+
if (this.app.meta.isTest && context instanceof CaptchaBoundContext) {
|
|
74
|
+
return context.authorization;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async create(_options, context) {
|
|
78
|
+
if (!this.app.meta.isTest || !(context instanceof CaptchaBoundContext)) {
|
|
79
|
+
return this.app.throw(403);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
token: context.token,
|
|
83
|
+
payload: undefined
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async verify(token, tokenInput) {
|
|
87
|
+
return token === tokenInput;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
CaptchaProviderBound = __decorate([CaptchaProvider(), BeanInfo({
|
|
91
|
+
module: "test-captcha"
|
|
92
|
+
})], CaptchaProviderBound);
|
|
93
|
+
|
|
94
|
+
let CaptchaSceneBound = class CaptchaSceneBound extends BeanBase {};
|
|
95
|
+
CaptchaSceneBound = __decorate([CaptchaScene({
|
|
96
|
+
providers: {
|
|
97
|
+
'test-captcha:bound': true
|
|
98
|
+
}
|
|
99
|
+
}), BeanInfo({
|
|
100
|
+
module: "test-captcha"
|
|
101
|
+
})], CaptchaSceneBound);
|
|
102
|
+
|
|
39
103
|
let ScopeModuleTestCaptcha = class ScopeModuleTestCaptcha extends BeanScopeBase {};
|
|
40
104
|
ScopeModuleTestCaptcha = __decorate([Scope(), BeanInfo({
|
|
41
105
|
module: "test-captcha"
|
|
42
106
|
})], ScopeModuleTestCaptcha);
|
|
43
107
|
/** scope: end */
|
|
44
108
|
|
|
45
|
-
export { ControllerCaptcha, DtoSignin, ScopeModuleTestCaptcha };
|
|
109
|
+
export { CaptchaBoundContext, CaptchaProviderBound, CaptchaSceneBound, ControllerCaptcha, DtoSignin, ScopeModuleTestCaptcha };
|
|
46
110
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/dto/signin.ts","../src/controller/captcha.ts","../src/.metadata/index.ts"],"sourcesContent":[null,null,null],"names":["DtoSignin","constructor","username","password","captcha","__decorate","Api","field","prototype","v","min","ZovaRender","Dto","__z_BeanInfo","module","ControllerCaptcha","BeanBase","signin","_user","Web","post","Passport","public","Core","captchaVerify","scene","__param","Arg","body","Controller","path","meta","mode","ScopeModuleTestCaptcha","BeanScopeBase","Scope"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/dto/signin.ts","../src/controller/captcha.ts","../src/bean/captchaProvider.bound.ts","../src/bean/captchaScene.bound.ts","../src/.metadata/index.ts"],"sourcesContent":[null,null,null,null,null],"names":["DtoSignin","constructor","username","password","captcha","__decorate","Api","field","prototype","v","min","ZovaRender","Dto","__z_BeanInfo","module","ControllerCaptcha","BeanBase","signin","_user","Web","post","Passport","public","Core","captchaVerify","scene","__param","Arg","body","Controller","path","meta","mode","CaptchaBoundContext","binding","recipient","uuidv4","purpose","subject","token","authorization","scope","createHash","update","JSON","stringify","digest","ip","ttl","cooldown","maxAttempts","recipientLimits","limit","windowMs","ipLimits","CaptchaProviderBound","args","bound","authorize","context","app","isTest","create","_options","throw","payload","undefined","verify","tokenInput","CaptchaProvider","CaptchaSceneBound","CaptchaScene","providers","ScopeModuleTestCaptcha","BeanScopeBase","Scope"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/.metadata/index.ts
CHANGED
|
@@ -69,6 +69,58 @@ declare module 'vona-module-a-web' {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
/** controller: end */
|
|
72
|
+
/** captchaProvider: begin */
|
|
73
|
+
export * from '../bean/captchaProvider.bound.ts';
|
|
74
|
+
|
|
75
|
+
import { type IDecoratorCaptchaProviderOptions } from 'vona-module-a-captcha';
|
|
76
|
+
declare module 'vona-module-a-captcha' {
|
|
77
|
+
|
|
78
|
+
export interface ICaptchaProviderRecord {
|
|
79
|
+
'test-captcha:bound': IDecoratorCaptchaProviderOptions;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
}
|
|
84
|
+
declare module 'vona-module-test-captcha' {
|
|
85
|
+
|
|
86
|
+
export interface CaptchaProviderBound {
|
|
87
|
+
/** @internal */
|
|
88
|
+
get scope(): ScopeModuleTestCaptcha;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface CaptchaProviderBound {
|
|
92
|
+
get $beanFullName(): 'test-captcha.captchaProvider.bound';
|
|
93
|
+
get $onionName(): 'test-captcha:bound';
|
|
94
|
+
get $onionOptions(): IDecoratorCaptchaProviderOptions;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** captchaProvider: end */
|
|
98
|
+
/** captchaScene: begin */
|
|
99
|
+
export * from '../bean/captchaScene.bound.ts';
|
|
100
|
+
|
|
101
|
+
import { type IDecoratorCaptchaSceneOptions } from 'vona-module-a-captcha';
|
|
102
|
+
declare module 'vona-module-a-captcha' {
|
|
103
|
+
|
|
104
|
+
export interface ICaptchaSceneRecord {
|
|
105
|
+
'test-captcha:bound': IDecoratorCaptchaSceneOptions;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
declare module 'vona-module-test-captcha' {
|
|
111
|
+
|
|
112
|
+
export interface CaptchaSceneBound {
|
|
113
|
+
/** @internal */
|
|
114
|
+
get scope(): ScopeModuleTestCaptcha;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface CaptchaSceneBound {
|
|
118
|
+
get $beanFullName(): 'test-captcha.captchaScene.bound';
|
|
119
|
+
get $onionName(): 'test-captcha:bound';
|
|
120
|
+
get $onionOptions(): IDecoratorCaptchaSceneOptions;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/** captchaScene: end */
|
|
72
124
|
/** scope: begin */
|
|
73
125
|
import { BeanScopeBase, type BeanScopeUtil } from 'vona';
|
|
74
126
|
import { Scope } from 'vona-module-a-bean';
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ICaptchaAuthorization,
|
|
3
|
+
ICaptchaBinding,
|
|
4
|
+
ICaptchaProviderData,
|
|
5
|
+
ICaptchaProviderExecute,
|
|
6
|
+
} from 'vona-module-a-captcha';
|
|
7
|
+
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { BeanBase, uuidv4 } from 'vona';
|
|
10
|
+
import { CaptchaProvider } from 'vona-module-a-captcha';
|
|
11
|
+
|
|
12
|
+
export class CaptchaBoundContext {
|
|
13
|
+
readonly token = uuidv4();
|
|
14
|
+
readonly authorization: ICaptchaAuthorization;
|
|
15
|
+
|
|
16
|
+
constructor(
|
|
17
|
+
binding: ICaptchaBinding = {
|
|
18
|
+
recipient: `${uuidv4()}@example.test`,
|
|
19
|
+
purpose: 'captcha-regression',
|
|
20
|
+
subject: uuidv4(),
|
|
21
|
+
},
|
|
22
|
+
) {
|
|
23
|
+
this.authorization = {
|
|
24
|
+
binding,
|
|
25
|
+
scope: createHash('sha256').update(JSON.stringify(binding)).digest('hex'),
|
|
26
|
+
ip: createHash('sha256').update(uuidv4()).digest('hex'),
|
|
27
|
+
ttl: 60_000,
|
|
28
|
+
cooldown: 0,
|
|
29
|
+
maxAttempts: 5,
|
|
30
|
+
recipientLimits: [{ limit: 10, windowMs: 60_000 }],
|
|
31
|
+
ipLimits: [{ limit: 10, windowMs: 60_000 }],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@CaptchaProvider()
|
|
37
|
+
export class CaptchaProviderBound extends BeanBase implements ICaptchaProviderExecute<string> {
|
|
38
|
+
readonly bound = true;
|
|
39
|
+
|
|
40
|
+
authorize(context: unknown) {
|
|
41
|
+
if (this.app.meta.isTest && context instanceof CaptchaBoundContext) {
|
|
42
|
+
return context.authorization;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async create(_options: unknown, context?: unknown): Promise<ICaptchaProviderData<string>> {
|
|
47
|
+
if (!this.app.meta.isTest || !(context instanceof CaptchaBoundContext)) {
|
|
48
|
+
return this.app.throw(403);
|
|
49
|
+
}
|
|
50
|
+
return { token: context.token, payload: undefined };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async verify(token: string, tokenInput: string): Promise<boolean> {
|
|
54
|
+
return token === tokenInput;
|
|
55
|
+
}
|
|
56
|
+
}
|