react-native-mfa-trustbuilder 0.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.
Files changed (38) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +202 -0
  3. package/Trustbuilder.podspec +29 -0
  4. package/android/build.gradle +74 -0
  5. package/android/libs/iwlib-mac-0.2.17.jar +0 -0
  6. package/android/proguard-rules.pro +2 -0
  7. package/android/src/main/AndroidManifest.xml +2 -0
  8. package/android/src/main/java/com/trustbuilder/SimpleWebServiceCall.kt +40 -0
  9. package/android/src/main/java/com/trustbuilder/TrustbuilderModule.kt +590 -0
  10. package/android/src/main/java/com/trustbuilder/TrustbuilderPackage.kt +32 -0
  11. package/ios/RNTrustbuilder.h +5 -0
  12. package/ios/RNTrustbuilder.mm +433 -0
  13. package/ios/iw.h +785 -0
  14. package/ios/libs/libmaccess-0.2.19-ios-arm64_armv7.a +0 -0
  15. package/ios/libs/libmaccess-0.2.19-ios-arm64_i386_x86_64-simulator.a +0 -0
  16. package/lib/module/NativeRNTrustbuilder.js +5 -0
  17. package/lib/module/NativeRNTrustbuilder.js.map +1 -0
  18. package/lib/module/errors.js +64 -0
  19. package/lib/module/errors.js.map +1 -0
  20. package/lib/module/index.js +309 -0
  21. package/lib/module/index.js.map +1 -0
  22. package/lib/module/package.json +1 -0
  23. package/lib/module/types.js +2 -0
  24. package/lib/module/types.js.map +1 -0
  25. package/lib/typescript/package.json +1 -0
  26. package/lib/typescript/src/NativeRNTrustbuilder.d.ts +89 -0
  27. package/lib/typescript/src/NativeRNTrustbuilder.d.ts.map +1 -0
  28. package/lib/typescript/src/errors.d.ts +29 -0
  29. package/lib/typescript/src/errors.d.ts.map +1 -0
  30. package/lib/typescript/src/index.d.ts +68 -0
  31. package/lib/typescript/src/index.d.ts.map +1 -0
  32. package/lib/typescript/src/types.d.ts +45 -0
  33. package/lib/typescript/src/types.d.ts.map +1 -0
  34. package/package.json +184 -0
  35. package/src/NativeRNTrustbuilder.ts +117 -0
  36. package/src/errors.ts +72 -0
  37. package/src/index.ts +461 -0
  38. package/src/types.ts +54 -0
@@ -0,0 +1,45 @@
1
+ export type PinMode = 'none' | 'current' | 'new' | 'bio' | 'currentOrBio';
2
+ export type PushAction = 'authenticate' | 'activate';
3
+ export type KeyType = 'pin' | 'biokey';
4
+ export interface InitConfig {
5
+ macId: string;
6
+ server?: string;
7
+ hostVersion?: string;
8
+ timeout?: number;
9
+ lang?: 'en' | 'fr';
10
+ }
11
+ export interface InitResult {
12
+ isActivated: boolean;
13
+ isBlocked: boolean;
14
+ error?: string;
15
+ }
16
+ export interface ServiceInfo {
17
+ name: string;
18
+ logoUrl: string;
19
+ isDisabled: boolean;
20
+ }
21
+ export interface PushInfo {
22
+ alias: string;
23
+ action: PushAction;
24
+ context: string;
25
+ }
26
+ export interface OtpResult {
27
+ otp: string;
28
+ remainingTime: number;
29
+ }
30
+ export interface SealResult {
31
+ seal: string;
32
+ }
33
+ export interface VersionInfo {
34
+ libraryVersion: string;
35
+ newVersionAvailable: string;
36
+ newVersionUrl: string;
37
+ majorVersionRequired: boolean;
38
+ shouldAskForMinorUpdate: boolean;
39
+ }
40
+ export interface PinModeResult {
41
+ pinMode: PinMode;
42
+ requiresPin: boolean;
43
+ requiresBio: boolean;
44
+ }
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,cAAc,CAAC;AAE1E,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,UAAU,CAAC;AAErD,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEvC,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB"}
package/package.json ADDED
@@ -0,0 +1,184 @@
1
+ {
2
+ "name": "react-native-mfa-trustbuilder",
3
+ "version": "0.1.0",
4
+ "description": "Trustbuilder MFA SDK for React Native",
5
+ "main": "./lib/module/index.js",
6
+ "types": "./lib/typescript/src/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "source": "./src/index.ts",
10
+ "types": "./lib/typescript/src/index.d.ts",
11
+ "default": "./lib/module/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": [
16
+ "src",
17
+ "lib",
18
+ "android",
19
+ "ios",
20
+ "cpp",
21
+ "*.podspec",
22
+ "react-native.config.js",
23
+ "!ios/build",
24
+ "!android/build",
25
+ "!android/gradle",
26
+ "!android/gradlew",
27
+ "!android/gradlew.bat",
28
+ "!android/local.properties",
29
+ "!**/__tests__",
30
+ "!**/__fixtures__",
31
+ "!**/__mocks__",
32
+ "!**/.*"
33
+ ],
34
+ "scripts": {
35
+ "example": "yarn workspace react-native-mfa-trustbuilder-example",
36
+ "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
37
+ "prepare": "bob build",
38
+ "typecheck": "tsc",
39
+ "lint": "eslint \"**/*.{js,ts,tsx}\"",
40
+ "test": "jest",
41
+ "release": "release-it --only-version",
42
+ "web": "vite",
43
+ "build:web": "vite build"
44
+ },
45
+ "keywords": [
46
+ "react-native",
47
+ "ios",
48
+ "android",
49
+ "trustbuilder",
50
+ "mfa",
51
+ "inwebo",
52
+ "authentication",
53
+ "otp"
54
+ ],
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/skanderhk/react-native-mfa-trustbuilder.git"
58
+ },
59
+ "author": "skanderhk <skander.hkacem@gmail.com> (https://github.com/skanderhk)",
60
+ "license": "MIT",
61
+ "bugs": {
62
+ "url": "https://github.com/skanderhk/react-native-mfa-trustbuilder/issues"
63
+ },
64
+ "homepage": "https://github.com/skanderhk/react-native-mfa-trustbuilder#readme",
65
+ "publishConfig": {
66
+ "registry": "https://registry.npmjs.org/"
67
+ },
68
+ "devDependencies": {
69
+ "@commitlint/config-conventional": "^20.5.0",
70
+ "@eslint/compat": "^2.0.3",
71
+ "@eslint/eslintrc": "^3.3.5",
72
+ "@eslint/js": "^10.0.1",
73
+ "@react-native/babel-preset": "0.73.21",
74
+ "@react-native/eslint-config": "0.85.0",
75
+ "@react-native/jest-preset": "0.85.0",
76
+ "@release-it/conventional-changelog": "^10.0.6",
77
+ "@types/jest": "^29.5.0",
78
+ "@types/react": "^18.2.6",
79
+ "commitlint": "^20.5.0",
80
+ "del-cli": "^7.0.0",
81
+ "eslint": "^9.39.4",
82
+ "eslint-config-prettier": "^10.1.8",
83
+ "eslint-plugin-ft-flow": "^3.0.11",
84
+ "eslint-plugin-prettier": "^5.5.5",
85
+ "jest": "^29.7.0",
86
+ "lefthook": "^2.1.4",
87
+ "prettier": "^3.8.1",
88
+ "react": "18.2.0",
89
+ "react-native": "0.73.11",
90
+ "react-native-builder-bob": "^0.41.0",
91
+ "react-native-web": "~0.21.1",
92
+ "release-it": "^19.2.4",
93
+ "ts-jest": "^29.1.0",
94
+ "turbo": "^2.8.21",
95
+ "typescript": "^6.0.2"
96
+ },
97
+ "peerDependencies": {
98
+ "@react-native-firebase/app": ">=18.0.0",
99
+ "@react-native-firebase/messaging": ">=18.0.0",
100
+ "react": "*",
101
+ "react-native": "*"
102
+ },
103
+ "peerDependenciesMeta": {
104
+ "@react-native-firebase/app": {
105
+ "optional": true
106
+ },
107
+ "@react-native-firebase/messaging": {
108
+ "optional": true
109
+ }
110
+ },
111
+ "workspaces": [
112
+ "example"
113
+ ],
114
+ "packageManager": "yarn@4.11.0",
115
+ "react-native-builder-bob": {
116
+ "source": "src",
117
+ "output": "lib",
118
+ "targets": [
119
+ [
120
+ "module",
121
+ {
122
+ "esm": true
123
+ }
124
+ ],
125
+ [
126
+ "typescript",
127
+ {
128
+ "project": "tsconfig.build.json"
129
+ }
130
+ ]
131
+ ]
132
+ },
133
+ "codegenConfig": {
134
+ "name": "RNTrustbuilderSpec",
135
+ "type": "modules",
136
+ "jsSrcsDir": "src",
137
+ "android": {
138
+ "javaPackageName": "com.trustbuilder"
139
+ }
140
+ },
141
+ "prettier": {
142
+ "quoteProps": "consistent",
143
+ "singleQuote": true,
144
+ "tabWidth": 2,
145
+ "trailingComma": "es5",
146
+ "useTabs": false
147
+ },
148
+ "commitlint": {
149
+ "extends": [
150
+ "@commitlint/config-conventional"
151
+ ]
152
+ },
153
+ "release-it": {
154
+ "git": {
155
+ "commitMessage": "chore: release ${version}",
156
+ "tagName": "v${version}"
157
+ },
158
+ "npm": {
159
+ "publish": true
160
+ },
161
+ "github": {
162
+ "release": true
163
+ },
164
+ "plugins": {
165
+ "@release-it/conventional-changelog": {
166
+ "preset": {
167
+ "name": "angular"
168
+ }
169
+ }
170
+ }
171
+ },
172
+ "create-react-native-library": {
173
+ "type": "turbo-module",
174
+ "languages": "kotlin-objc",
175
+ "tools": [
176
+ "eslint",
177
+ "jest",
178
+ "lefthook",
179
+ "release-it",
180
+ "vite"
181
+ ],
182
+ "version": "0.62.0"
183
+ }
184
+ }
@@ -0,0 +1,117 @@
1
+ import { TurboModuleRegistry, type TurboModule } from 'react-native';
2
+
3
+ export type PinMode = 'none' | 'current' | 'new' | 'bio' | 'currentOrBio';
4
+
5
+ export type PushAction = 'authenticate' | 'activate';
6
+
7
+ export interface InitConfig {
8
+ macId: string;
9
+ server?: string;
10
+ hostVersion?: string;
11
+ timeout?: number;
12
+ lang?: 'en' | 'fr';
13
+ }
14
+
15
+ export interface InitResult {
16
+ isActivated: boolean;
17
+ isBlocked: boolean;
18
+ }
19
+
20
+ export interface ServiceInfo {
21
+ name: string;
22
+ logoUrl: string;
23
+ isDisabled: boolean;
24
+ }
25
+
26
+ export interface PushInfo {
27
+ alias: string;
28
+ action: PushAction;
29
+ context: string;
30
+ }
31
+
32
+ export interface OtpResult {
33
+ otp: string;
34
+ remainingTime: number;
35
+ }
36
+
37
+ export interface SealResult {
38
+ seal: string;
39
+ }
40
+
41
+ export interface VersionInfo {
42
+ libraryVersion: string;
43
+ newVersionAvailable: string;
44
+ newVersionUrl: string;
45
+ majorVersionRequired: boolean;
46
+ shouldAskForMinorUpdate: boolean;
47
+ }
48
+
49
+ export interface Spec extends TurboModule {
50
+ addListener(eventName: string): void;
51
+ removeListeners(count: number): void;
52
+
53
+ initialize(config: string): string;
54
+ setStorageData(data: string): boolean;
55
+ getStorageData(): string;
56
+ storageDataChanged(): boolean;
57
+
58
+ isActivated(): boolean;
59
+ isBlocked(): boolean;
60
+ mustUpgrade(): boolean;
61
+
62
+ activationStart(code: string): string;
63
+ activationFinalize(code: string, pin: string, name: string): string;
64
+
65
+ resetStart(code: string): string;
66
+ resetFinalize(code: string, pin: string): string;
67
+
68
+ synchronizeStart(): string;
69
+ synchronizeFinalize(pin: string): string;
70
+
71
+ pwdUpdateStart(): string;
72
+ pwdUpdateFinalize(newPin: string, currentPin: string): string;
73
+
74
+ setBiokeyStart(): string;
75
+ setBiokeyFinalize(biokey: string, pin: string): string;
76
+
77
+ unsetBiokeysStart(): string;
78
+ unsetBiokeysFinalize(pin: string): string;
79
+
80
+ onlineOtpStart(serviceIndex: number): string;
81
+ onlineOtpFinalize(serviceIndex: number, pin: string, keyType: number): string;
82
+ otpAnswerOtp(): string;
83
+
84
+ otpShouldSynchronize(serviceId: number): boolean;
85
+ otpModeQuery(serviceId: number): boolean;
86
+ otpGenerate(pin: string): string;
87
+ displayTime(): number;
88
+
89
+ setDeviceOS(deviceOS: string): void;
90
+ pushRegistrationStart(): string;
91
+ pushRegistrationFinalize(pushId: string): string;
92
+ checkPush(): string;
93
+ pushAlias(): string;
94
+ pushAction(): string;
95
+ pushContext(): string;
96
+
97
+ onlineSealStart(serviceIndex: number): string;
98
+ onlineSealFinalize(
99
+ serviceIndex: number,
100
+ pin: string,
101
+ keyType: number,
102
+ sealData: string
103
+ ): string;
104
+ sealAnswerOtp(): string;
105
+ sealShouldSynchronize(serviceId: number): boolean;
106
+ sealModeQuery(serviceId: number): boolean;
107
+ sealGenerate(pin: string, sealData: string): string;
108
+
109
+ serviceNb(): number;
110
+ serviceName(index: number): string;
111
+ serviceLogo(index: number): string;
112
+ serviceDisabled(index: number): boolean;
113
+
114
+ getVersionInfo(): string;
115
+ }
116
+
117
+ export default TurboModuleRegistry.getEnforcing<Spec>('RNTrustbuilder');
package/src/errors.ts ADDED
@@ -0,0 +1,72 @@
1
+ export enum TrustbuilderErrorCode {
2
+ OK = 0,
3
+ NETWORK = 1,
4
+ CODE = 2,
5
+ SN = 3,
6
+ ACCESS = 4,
7
+ VERSION = 5,
8
+ BLOCKED = 7,
9
+ STATE = 8,
10
+ NODEVICE = 9,
11
+ NOCA = 10,
12
+ NOSRV = 11,
13
+ PINREUSED = 12,
14
+ SYNCHROFAILED = 13,
15
+ FORBIDDEN = 14,
16
+ PINREFUSED = 15,
17
+ TIMEOUT = 16,
18
+ BIOKEY = 26,
19
+ DESYNCHRONIZED = 27,
20
+ OTHER = 999,
21
+ }
22
+
23
+ const ERROR_MESSAGES: Record<number, string> = {
24
+ [TrustbuilderErrorCode.OK]: 'No error',
25
+ [TrustbuilderErrorCode.NETWORK]: 'Network or server unreachable',
26
+ [TrustbuilderErrorCode.CODE]: 'The activation code is incorrect',
27
+ [TrustbuilderErrorCode.SN]: 'One argument does not have the right syntax',
28
+ [TrustbuilderErrorCode.ACCESS]: 'Access refused',
29
+ [TrustbuilderErrorCode.VERSION]:
30
+ 'Version error, user must upgrade the device',
31
+ [TrustbuilderErrorCode.BLOCKED]: 'Account is blocked',
32
+ [TrustbuilderErrorCode.STATE]: 'Internal state not correct',
33
+ [TrustbuilderErrorCode.NODEVICE]: 'Device is disabled or unknown',
34
+ [TrustbuilderErrorCode.NOCA]:
35
+ 'User must activate helium or Desktop Token before achieving this operation',
36
+ [TrustbuilderErrorCode.NOSRV]: 'No service is available',
37
+ [TrustbuilderErrorCode.PINREUSED]: 'The new password equals the previous one',
38
+ [TrustbuilderErrorCode.SYNCHROFAILED]:
39
+ 'The operation succeeded but synchronization failed',
40
+ [TrustbuilderErrorCode.FORBIDDEN]:
41
+ 'Forbidden operation (due to activated/blocked/upgradable state)',
42
+ [TrustbuilderErrorCode.PINREFUSED]: 'The password is refused (bad format)',
43
+ [TrustbuilderErrorCode.TIMEOUT]: 'Timeout expired',
44
+ [TrustbuilderErrorCode.BIOKEY]: 'Device is locked due to biokey errors',
45
+ [TrustbuilderErrorCode.DESYNCHRONIZED]: 'Device desynchronized',
46
+ [TrustbuilderErrorCode.OTHER]: 'Unknown error',
47
+ };
48
+
49
+ export class TrustbuilderError extends Error {
50
+ public readonly code: TrustbuilderErrorCode;
51
+ public readonly codeName: string;
52
+
53
+ constructor(code: number, message?: string) {
54
+ const errorCode = code as TrustbuilderErrorCode;
55
+ const defaultMessage =
56
+ ERROR_MESSAGES[errorCode] || `Unknown error code: ${code}`;
57
+ super(message || defaultMessage);
58
+ this.name = 'TrustbuilderError';
59
+ this.code = errorCode;
60
+ this.codeName = TrustbuilderErrorCode[errorCode] || 'UNKNOWN';
61
+ }
62
+ }
63
+
64
+ export function assertOk(resultCode: number): void {
65
+ if (resultCode !== TrustbuilderErrorCode.OK) {
66
+ throw new TrustbuilderError(resultCode);
67
+ }
68
+ }
69
+
70
+ export function parseResult(resultCode: number): void {
71
+ assertOk(resultCode);
72
+ }