@oneuptime/common 12.0.21 → 12.0.23
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/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/NetworkDevice.ts +44 -0
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +564 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +38 -0
- package/Models/DatabaseModels/UserTwoFactorBackupCode.ts +262 -0
- package/Server/API/UserTwoFactorBackupCodeAPI.ts +258 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddNetworkDeviceAutoImportRule.ts +60 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddUserTwoFactorBackupCode.ts +63 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789200000000-AddSysObjectIdPatternToAutoImportRule.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789300000000-AddAutoApplyVendorHealthTemplate.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +917 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +181 -0
- package/Server/Services/UserService.ts +42 -0
- package/Server/Services/UserTwoFactorBackupCodeService.ts +355 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +39 -1
- package/Server/Utils/TwoFactorBackupCode.ts +266 -0
- package/Tests/Server/API/UserAuthenticationAPI.test.ts +16 -3
- package/Tests/Server/API/UserTwoFactorAuthAdminAPI.test.ts +18 -2
- package/Tests/Server/API/UserTwoFactorBackupCodeAPI.test.ts +1390 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +205 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +933 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +23 -1
- package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +21 -0
- package/Tests/Server/Services/UserTwoFactorBackupCodeAdminSurface.test.ts +919 -0
- package/Tests/Server/Services/UserTwoFactorBackupCodeService.test.ts +862 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +97 -1
- package/Tests/Server/Utils/TwoFactorBackupCode.test.ts +475 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +516 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +272 -0
- package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +164 -0
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/NetworkAutomation/RuleRunResult.ts +84 -0
- package/Types/Permission.ts +47 -0
- package/Types/UserAuthenticationStatus.ts +16 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +257 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +183 -0
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +95 -0
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +66 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +82 -0
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +45 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +589 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +28 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTwoFactorBackupCode.js +277 -0
- package/build/dist/Models/DatabaseModels/UserTwoFactorBackupCode.js.map +1 -0
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js +201 -0
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddNetworkDeviceAutoImportRule.js +35 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddNetworkDeviceAutoImportRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddUserTwoFactorBackupCode.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddUserTwoFactorBackupCode.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789200000000-AddSysObjectIdPatternToAutoImportRule.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789200000000-AddSysObjectIdPatternToAutoImportRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789300000000-AddAutoApplyVendorHealthTemplate.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789300000000-AddAutoApplyVendorHealthTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +711 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +155 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -0
- package/build/dist/Server/Services/UserService.js +39 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js +327 -0
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +26 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/TwoFactorBackupCode.js +269 -0
- package/build/dist/Server/Utils/TwoFactorBackupCode.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +24 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/Permission.js +41 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +149 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +121 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +75 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +59 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +60 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { EncryptionSecret } from "../EnvironmentConfig";
|
|
11
|
+
import CaptureSpan from "./Telemetry/CaptureSpan";
|
|
12
|
+
import crypto from "crypto";
|
|
13
|
+
/*
|
|
14
|
+
* Single-use recovery codes for an account whose second factor is gone --
|
|
15
|
+
* the phone that held the authenticator app, or the security key that is now
|
|
16
|
+
* in a taxi somewhere.
|
|
17
|
+
*
|
|
18
|
+
* WHY THIS IS SERVER-ONLY
|
|
19
|
+
*
|
|
20
|
+
* Nothing in this file falls back to Math.random. Common/Utils/UUID does, on
|
|
21
|
+
* purpose, because it is bundled into the dashboard and has to keep producing
|
|
22
|
+
* well-formed ids in a browser with no Web Crypto -- which is exactly why
|
|
23
|
+
* ObjectID.generate() must never mint a code here. A backup code is a
|
|
24
|
+
* password-equivalent credential; if the platform cannot produce secure
|
|
25
|
+
* randomness, generation must throw rather than quietly emit something
|
|
26
|
+
* predictable. Common/Server/Utils/VerificationCode.ts makes the same call for
|
|
27
|
+
* the same reason.
|
|
28
|
+
*
|
|
29
|
+
* THE CODE SPACE
|
|
30
|
+
*
|
|
31
|
+
* Ten characters drawn uniformly from a 32 symbol alphabet is 2^50 codes, and
|
|
32
|
+
* a user holds ten of them at once -- so a blind guess lands with probability
|
|
33
|
+
* ~10/2^50, about one in 10^14. That is far beyond anything the rate limiter
|
|
34
|
+
* needs to defend, which matters because it settles the design question a TOTP
|
|
35
|
+
* code cannot settle: the six digit space is small enough that the limiter IS
|
|
36
|
+
* the control, whereas here the code itself is.
|
|
37
|
+
*
|
|
38
|
+
* THE HASH
|
|
39
|
+
*
|
|
40
|
+
* Codes are stored as HMAC-SHA256 keyed by the instance's EncryptionSecret,
|
|
41
|
+
* never in the clear, and the fast keyed-digest lane is the RIGHT one here
|
|
42
|
+
* rather than scrypt. scrypt exists to make guessing a low-entropy,
|
|
43
|
+
* human-chosen secret expensive; a code minted above has no low-entropy
|
|
44
|
+
* structure to guess, so the cost would buy nothing and would be paid on every
|
|
45
|
+
* verification. Keying with the EncryptionSecret is what a bare SHA-256 would
|
|
46
|
+
* miss: it lives in configuration rather than in Postgres, so a database dump
|
|
47
|
+
* on its own cannot be run through a dictionary of every possible code.
|
|
48
|
+
*
|
|
49
|
+
* The digest is deterministic given (userId, code), which is deliberate and is
|
|
50
|
+
* what makes single-use consumption a single conditional UPDATE rather than a
|
|
51
|
+
* read of every one of the user's rows followed by a comparison of each. A
|
|
52
|
+
* per-row salt would forfeit that for no gain -- see the note on domain
|
|
53
|
+
* separation below for the property it would have been bought for, which the
|
|
54
|
+
* userId already provides.
|
|
55
|
+
*/
|
|
56
|
+
/**
|
|
57
|
+
* Crockford's Base32 alphabet: the digits and the uppercase letters, minus
|
|
58
|
+
* I, L, O and U.
|
|
59
|
+
*
|
|
60
|
+
* These codes get read off a screen and typed back in months later, possibly
|
|
61
|
+
* from a piece of paper in a drawer, so the alphabet is chosen for the eye
|
|
62
|
+
* rather than for density. I/1, L/1 and O/0 are the pairs people transcribe
|
|
63
|
+
* wrongly; U is dropped by Crockford so that no code can spell an obscenity
|
|
64
|
+
* at a user who did nothing to deserve one.
|
|
65
|
+
*
|
|
66
|
+
* Exactly 32 symbols, so each character carries a clean five bits and the
|
|
67
|
+
* entropy arithmetic in the header comment is exact rather than approximate.
|
|
68
|
+
*/
|
|
69
|
+
export const BackupCodeAlphabet = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
70
|
+
/** Characters per code. Ten symbols over a 32 symbol alphabet is 2^50. */
|
|
71
|
+
export const BackupCodeLength = 10;
|
|
72
|
+
/**
|
|
73
|
+
* How many codes a user is issued at once.
|
|
74
|
+
*
|
|
75
|
+
* Ten is enough that losing a phone does not become an emergency after the
|
|
76
|
+
* second sign-in, and small enough that the printed list is one short block a
|
|
77
|
+
* person will actually keep.
|
|
78
|
+
*/
|
|
79
|
+
export const BackupCodeSetSize = 10;
|
|
80
|
+
/** Characters per group in the displayed form, e.g. `AB3D5-9XZQ2`. */
|
|
81
|
+
const DISPLAY_GROUP_LENGTH = 5;
|
|
82
|
+
/*
|
|
83
|
+
* Prefixed into every digest so a stored hash is bound to the scheme that
|
|
84
|
+
* produced it. If the construction below ever has to change, old rows keep
|
|
85
|
+
* verifying under the version they were written with instead of silently
|
|
86
|
+
* failing to match and locking a user out of their own recovery codes.
|
|
87
|
+
*/
|
|
88
|
+
const HASH_SCHEME_VERSION = "v1";
|
|
89
|
+
/*
|
|
90
|
+
* Characters a person plausibly types in place of a symbol that is not in the
|
|
91
|
+
* alphabet. Applied before the strip below, so `O` becomes `0` rather than
|
|
92
|
+
* being deleted -- deleting it would shorten the code and guarantee a
|
|
93
|
+
* mismatch, which is the confusing failure this map exists to avoid.
|
|
94
|
+
*/
|
|
95
|
+
const AMBIGUOUS_CHARACTER_MAP = {
|
|
96
|
+
I: "1",
|
|
97
|
+
L: "1",
|
|
98
|
+
O: "0",
|
|
99
|
+
};
|
|
100
|
+
export default class TwoFactorBackupCode {
|
|
101
|
+
/**
|
|
102
|
+
* One code, drawn uniformly from the alphabet above.
|
|
103
|
+
*
|
|
104
|
+
* `crypto.randomInt` per character rather than `randomBytes(n) % 32`. The
|
|
105
|
+
* modulo version happens to be uniform for this alphabet only because 32
|
|
106
|
+
* divides 256, and it stops being uniform the moment somebody edits the
|
|
107
|
+
* alphabet -- silently, with no test that would notice. `randomInt` rejects
|
|
108
|
+
* out-of-range draws internally for whatever bound it is given, so the
|
|
109
|
+
* uniformity does not depend on a coincidence nobody wrote down.
|
|
110
|
+
*/
|
|
111
|
+
static generateCode() {
|
|
112
|
+
let code = "";
|
|
113
|
+
for (let index = 0; index < BackupCodeLength; index++) {
|
|
114
|
+
code += BackupCodeAlphabet.charAt(crypto.randomInt(0, BackupCodeAlphabet.length));
|
|
115
|
+
}
|
|
116
|
+
return code;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* A full set of distinct codes.
|
|
120
|
+
*
|
|
121
|
+
* Duplicates are not a security problem -- at 2^50 the birthday odds across
|
|
122
|
+
* ten draws are around 4e-14 -- but a duplicate WOULD be a correctness
|
|
123
|
+
* problem downstream: two rows sharing a digest means consuming one leaves a
|
|
124
|
+
* second, identical, still-valid code behind, so a "single-use" code would
|
|
125
|
+
* work twice. Cheaper to rule out here than to reason about there.
|
|
126
|
+
*/
|
|
127
|
+
static generateCodeSet(count = BackupCodeSetSize) {
|
|
128
|
+
const codes = new Set();
|
|
129
|
+
while (codes.size < count) {
|
|
130
|
+
codes.add(TwoFactorBackupCode.generateCode());
|
|
131
|
+
}
|
|
132
|
+
return Array.from(codes);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The form shown to the user: one hyphen in the middle, for the same reason
|
|
136
|
+
* the alphabet drops ambiguous letters -- a ten character run is hard to
|
|
137
|
+
* read back without losing your place.
|
|
138
|
+
*
|
|
139
|
+
* Purely cosmetic. `normalizeCode` strips the hyphen straight back out, so
|
|
140
|
+
* a user may type the code with it, without it, or with the spaces their
|
|
141
|
+
* password manager pasted in.
|
|
142
|
+
*/
|
|
143
|
+
static formatForDisplay(code) {
|
|
144
|
+
const groups = [];
|
|
145
|
+
for (let index = 0; index < code.length; index += DISPLAY_GROUP_LENGTH) {
|
|
146
|
+
groups.push(code.substring(index, index + DISPLAY_GROUP_LENGTH));
|
|
147
|
+
}
|
|
148
|
+
return groups.join("-");
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Reduce whatever the user typed to the canonical form the digest is
|
|
152
|
+
* computed over.
|
|
153
|
+
*
|
|
154
|
+
* Everything here is about not rejecting somebody who supplied exactly the
|
|
155
|
+
* right secret material: the display hyphen, the spaces a clipboard adds,
|
|
156
|
+
* lowercase from a phone keyboard, and the three transcription confusions
|
|
157
|
+
* the alphabet was chosen to make survivable. Anything still outside the
|
|
158
|
+
* alphabet after that is dropped rather than rejected -- this is a
|
|
159
|
+
* canonicaliser, not a validator; the digest comparison is what decides
|
|
160
|
+
* whether a code is real.
|
|
161
|
+
*
|
|
162
|
+
* @param rawCode - The code exactly as submitted.
|
|
163
|
+
* @returns The code reduced to alphabet symbols, uppercase.
|
|
164
|
+
*/
|
|
165
|
+
static normalizeCode(rawCode) {
|
|
166
|
+
/*
|
|
167
|
+
* The code arrives straight off a JSON body, so it is only a string
|
|
168
|
+
* because the client chose to send one. A number or an object here must
|
|
169
|
+
* fail verification, not throw out of `.toUpperCase` and surface as a 500.
|
|
170
|
+
*/
|
|
171
|
+
if (typeof rawCode !== "string" || !rawCode) {
|
|
172
|
+
return "";
|
|
173
|
+
}
|
|
174
|
+
let normalized = "";
|
|
175
|
+
for (const character of rawCode.toUpperCase()) {
|
|
176
|
+
const mapped = AMBIGUOUS_CHARACTER_MAP[character] || character;
|
|
177
|
+
if (BackupCodeAlphabet.includes(mapped)) {
|
|
178
|
+
normalized += mapped;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return normalized;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The digest stored for one of `userId`'s codes.
|
|
185
|
+
*
|
|
186
|
+
* Domain separated by the owning user, which is what stops one precomputed
|
|
187
|
+
* table from inverting every account's codes at once and stops two users who
|
|
188
|
+
* happen to be issued the same code from being visibly linked by a matching
|
|
189
|
+
* row. The user id is known at verification time -- the password has already
|
|
190
|
+
* been accepted by then -- so binding to it costs nothing.
|
|
191
|
+
*
|
|
192
|
+
* Both parts are LENGTH-PREFIXED into the message rather than merely
|
|
193
|
+
* concatenated, so no pair of (userId, code) values can be rearranged into
|
|
194
|
+
* the same byte string as another pair. Concatenation alone is a real
|
|
195
|
+
* ambiguity, not a theoretical one: without prefixes, ("ab", "cd") and
|
|
196
|
+
* ("abc", "d") hash identically.
|
|
197
|
+
*/
|
|
198
|
+
static hashCode(data) {
|
|
199
|
+
const message = [
|
|
200
|
+
HASH_SCHEME_VERSION,
|
|
201
|
+
data.userId.toString(),
|
|
202
|
+
TwoFactorBackupCode.normalizeCode(data.code),
|
|
203
|
+
]
|
|
204
|
+
.map((part) => {
|
|
205
|
+
return `${part.length}:${part}`;
|
|
206
|
+
})
|
|
207
|
+
.join("");
|
|
208
|
+
return crypto
|
|
209
|
+
.createHmac("sha256", EncryptionSecret.toString())
|
|
210
|
+
.update(message)
|
|
211
|
+
.digest("hex");
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Compare two digests without leaking, through timing, how many leading
|
|
215
|
+
* characters matched.
|
|
216
|
+
*
|
|
217
|
+
* The consume path compares digests in Postgres rather than here, so this is
|
|
218
|
+
* for callers that already hold both -- but it exists so that nobody writing
|
|
219
|
+
* one reaches for `===` and hands an attacker a way to recover a stored hash
|
|
220
|
+
* one character at a time.
|
|
221
|
+
*
|
|
222
|
+
* Lengths are compared first because `crypto.timingSafeEqual` THROWS on a
|
|
223
|
+
* length mismatch. Digests here are always 64 hex characters, so an early
|
|
224
|
+
* exit only happens on malformed input, where the length is not the secret.
|
|
225
|
+
*/
|
|
226
|
+
static isHashEqual(a, b) {
|
|
227
|
+
if (!a || !b || a.length !== b.length) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
return crypto.timingSafeEqual(Buffer.from(a, "utf8"), Buffer.from(b, "utf8"));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
__decorate([
|
|
234
|
+
CaptureSpan(),
|
|
235
|
+
__metadata("design:type", Function),
|
|
236
|
+
__metadata("design:paramtypes", []),
|
|
237
|
+
__metadata("design:returntype", String)
|
|
238
|
+
], TwoFactorBackupCode, "generateCode", null);
|
|
239
|
+
__decorate([
|
|
240
|
+
CaptureSpan(),
|
|
241
|
+
__metadata("design:type", Function),
|
|
242
|
+
__metadata("design:paramtypes", [Number]),
|
|
243
|
+
__metadata("design:returntype", Array)
|
|
244
|
+
], TwoFactorBackupCode, "generateCodeSet", null);
|
|
245
|
+
__decorate([
|
|
246
|
+
CaptureSpan(),
|
|
247
|
+
__metadata("design:type", Function),
|
|
248
|
+
__metadata("design:paramtypes", [String]),
|
|
249
|
+
__metadata("design:returntype", String)
|
|
250
|
+
], TwoFactorBackupCode, "formatForDisplay", null);
|
|
251
|
+
__decorate([
|
|
252
|
+
CaptureSpan(),
|
|
253
|
+
__metadata("design:type", Function),
|
|
254
|
+
__metadata("design:paramtypes", [String]),
|
|
255
|
+
__metadata("design:returntype", String)
|
|
256
|
+
], TwoFactorBackupCode, "normalizeCode", null);
|
|
257
|
+
__decorate([
|
|
258
|
+
CaptureSpan(),
|
|
259
|
+
__metadata("design:type", Function),
|
|
260
|
+
__metadata("design:paramtypes", [Object]),
|
|
261
|
+
__metadata("design:returntype", String)
|
|
262
|
+
], TwoFactorBackupCode, "hashCode", null);
|
|
263
|
+
__decorate([
|
|
264
|
+
CaptureSpan(),
|
|
265
|
+
__metadata("design:type", Function),
|
|
266
|
+
__metadata("design:paramtypes", [String, String]),
|
|
267
|
+
__metadata("design:returntype", Boolean)
|
|
268
|
+
], TwoFactorBackupCode, "isHashEqual", null);
|
|
269
|
+
//# sourceMappingURL=TwoFactorBackupCode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TwoFactorBackupCode.js","sourceRoot":"","sources":["../../../../Server/Utils/TwoFactorBackupCode.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,8 @@ var EmailTemplateType;
|
|
|
11
11
|
EmailTemplateType["ConfirmStatusPageSubscription"] = "ConfirmStatusPageSubscription.hbs";
|
|
12
12
|
EmailTemplateType["EmailVerified"] = "EmailVerified.hbs";
|
|
13
13
|
EmailTemplateType["PasswordChanged"] = "PasswordChanged.hbs";
|
|
14
|
+
EmailTemplateType["TwoFactorBackupCodeUsed"] = "TwoFactorBackupCodeUsed.hbs";
|
|
15
|
+
EmailTemplateType["TwoFactorBackupCodesRegenerated"] = "TwoFactorBackupCodesRegenerated.hbs";
|
|
14
16
|
EmailTemplateType["ProbeOwnerAdded"] = "ProbeOwnerAdded.hbs";
|
|
15
17
|
EmailTemplateType["InviteMember"] = "InviteMember.hbs";
|
|
16
18
|
EmailTemplateType["EmailChanged"] = "EmailChanged.hbs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailTemplateType.js","sourceRoot":"","sources":["../../../../Types/Email/EmailTemplateType.ts"],"names":[],"mappings":"AAAA,IAAK,
|
|
1
|
+
{"version":3,"file":"EmailTemplateType.js","sourceRoot":"","sources":["../../../../Types/Email/EmailTemplateType.ts"],"names":[],"mappings":"AAAA,IAAK,iBAkGJ;AAlGD,WAAK,iBAAiB;IACpB,wDAAmC,CAAA;IACnC,0DAAqC,CAAA;IACrC,sDAAiC,CAAA;IACjC,kEAA6C,CAAA;IAC7C,sEAAiD,CAAA;IACjD,oFAA+D,CAAA;IAC/D,wFAAmE,CAAA;IACnE,gEAA2C,CAAA;IAC3C,wFAAmE,CAAA;IACnE,wDAAmC,CAAA;IACnC,4DAAuC,CAAA;IACvC,4EAAuD,CAAA;IACvD,4FAAuE,CAAA;IACvE,4DAAuC,CAAA;IACvC,sDAAiC,CAAA;IACjC,sDAAiC,CAAA;IACjC,0EAAqD,CAAA;IACrD,wFAAmE,CAAA;IACnE,gFAA2D,CAAA;IAC3D,oGAA+E,CAAA;IAC/E,kFAA6D,CAAA;IAC7D,wFAAmE,CAAA;IACnE,0FAAqE,CAAA;IACrE,kHAA6F,CAAA;IAC7F,0HAAqG,CAAA;IACrG,4HAAuG,CAAA;IACvG,8EAAyD,CAAA;IACzD,gFAA2D,CAAA;IAC3D,0EAAqD,CAAA;IACrD,0HAAqG,CAAA;IACrG,8CAAyB,CAAA;IACzB,gEAA2C,CAAA;IAC3C,oFAA+D,CAAA;IAC/D,oEAA+C,CAAA;IAC/C,gFAA2D,CAAA;IAE3D,wEAAmD,CAAA;IAEnD,kEAA6C,CAAA;IAC7C,gFAA2D,CAAA;IAC3D,4EAAuD,CAAA;IACvD,sFAAiE,CAAA;IACjE,oEAA+C,CAAA;IAC/C,4FAAuE,CAAA;IAEvE,4DAAuC,CAAA;IACvC,0EAAqD,CAAA;IACrD,sEAAiD,CAAA;IACjD,gFAA2D,CAAA;IAC3D,sFAAiE,CAAA;IAEjE,0EAAqD,CAAA;IACrD,wFAAmE,CAAA;IACnE,oFAA+D,CAAA;IAC/D,8FAAyE,CAAA;IACzE,oFAA+D,CAAA;IAE/D,gFAA2D,CAAA;IAC3D,8FAAyE,CAAA;IACzE,0FAAqE,CAAA;IACrE,oGAA+E,CAAA;IAC/E,gGAA2E,CAAA;IAE3E,8EAAyD,CAAA;IACzD,wFAAmE,CAAA;IACnE,sFAAiE,CAAA;IAEjE,oGAA+E,CAAA;IAC/E,0FAAqE,CAAA;IACrE,wGAAmF,CAAA;IACnF,8GAAyF,CAAA;IACzF,oHAA+F,CAAA;IAC/F,0FAAqE,CAAA;IACrE,sEAAiD,CAAA;IACjD,gGAA2E,CAAA;IAC3E,wDAAmC,CAAA;IACnC,8DAAyC,CAAA;IACzC,oEAA+C,CAAA;IAC/C,8DAAyC,CAAA;IACzC,4EAAuD,CAAA;IACvD,kFAA6D,CAAA;IAE7D,4EAAuD,CAAA;IACvD,oFAA+D,CAAA;IAC/D,oFAA+D,CAAA;IAC/D,0EAAqD,CAAA;IACrD,8FAAyE,CAAA;IAEzE,kFAA6D,CAAA;IAC7D,4CAAuB,CAAA;IAEvB,gFAA2D,CAAA;IAC3D,kEAA6C,CAAA;IAC7C,wEAAmD,CAAA;IAEnD,8FAAyE,CAAA;IACzE,4FAAuE,CAAA;AACzE,CAAC,EAlGI,iBAAiB,KAAjB,iBAAiB,QAkGrB;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// How many addresses matchedIpAddressSample carries at most.
|
|
2
|
+
export const MAX_MATCHED_IP_SAMPLE = 50;
|
|
1
3
|
/*
|
|
2
4
|
* A count off the wire. An absent or non-numeric field reads as zero rather
|
|
3
5
|
* than as NaN: a summary line that says "NaN devices" is worse than one that
|
|
@@ -35,5 +37,27 @@ export class RuleRunResultUtil {
|
|
|
35
37
|
isTruncated: source["isTruncated"] === true,
|
|
36
38
|
};
|
|
37
39
|
}
|
|
40
|
+
static parseAutoImportRuleRunResult(json) {
|
|
41
|
+
const source = json || {};
|
|
42
|
+
const sample = Array.isArray(source["matchedIpAddressSample"])
|
|
43
|
+
? source["matchedIpAddressSample"]
|
|
44
|
+
.filter((value) => {
|
|
45
|
+
return typeof value === "string";
|
|
46
|
+
})
|
|
47
|
+
.slice(0, MAX_MATCHED_IP_SAMPLE)
|
|
48
|
+
: [];
|
|
49
|
+
return {
|
|
50
|
+
hostsEvaluated: readCount(source, "hostsEvaluated"),
|
|
51
|
+
hostsMatched: readCount(source, "hostsMatched"),
|
|
52
|
+
hostsExcluded: readCount(source, "hostsExcluded"),
|
|
53
|
+
hostsSkippedAlreadyRegistered: readCount(source, "hostsSkippedAlreadyRegistered"),
|
|
54
|
+
devicesCreated: readCount(source, "devicesCreated"),
|
|
55
|
+
devicesFailed: readCount(source, "devicesFailed"),
|
|
56
|
+
isTruncated: source["isTruncated"] === true,
|
|
57
|
+
hasMoreScans: source["hasMoreScans"] === true,
|
|
58
|
+
isDryRun: source["isDryRun"] === true,
|
|
59
|
+
matchedIpAddressSample: sample,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
38
62
|
}
|
|
39
63
|
//# sourceMappingURL=RuleRunResult.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuleRunResult.js","sourceRoot":"","sources":["../../../../Types/NetworkAutomation/RuleRunResult.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RuleRunResult.js","sourceRoot":"","sources":["../../../../Types/NetworkAutomation/RuleRunResult.ts"],"names":[],"mappings":"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"}
|
|
@@ -480,6 +480,10 @@ var Permission;
|
|
|
480
480
|
Permission["DeleteNetworkDeviceLabelRule"] = "DeleteNetworkDeviceLabelRule";
|
|
481
481
|
Permission["EditNetworkDeviceLabelRule"] = "EditNetworkDeviceLabelRule";
|
|
482
482
|
Permission["ReadNetworkDeviceLabelRule"] = "ReadNetworkDeviceLabelRule";
|
|
483
|
+
Permission["CreateNetworkDeviceAutoImportRule"] = "CreateNetworkDeviceAutoImportRule";
|
|
484
|
+
Permission["DeleteNetworkDeviceAutoImportRule"] = "DeleteNetworkDeviceAutoImportRule";
|
|
485
|
+
Permission["EditNetworkDeviceAutoImportRule"] = "EditNetworkDeviceAutoImportRule";
|
|
486
|
+
Permission["ReadNetworkDeviceAutoImportRule"] = "ReadNetworkDeviceAutoImportRule";
|
|
483
487
|
// Podman Host Label Rule Permissions
|
|
484
488
|
Permission["CreatePodmanHostLabelRule"] = "CreatePodmanHostLabelRule";
|
|
485
489
|
Permission["DeletePodmanHostLabelRule"] = "DeletePodmanHostLabelRule";
|
|
@@ -10484,6 +10488,43 @@ export class PermissionHelper {
|
|
|
10484
10488
|
isRolePermission: false,
|
|
10485
10489
|
group: PermissionGroup.Telemetry,
|
|
10486
10490
|
},
|
|
10491
|
+
// Network Device Auto Import Rule Permissions
|
|
10492
|
+
{
|
|
10493
|
+
permission: Permission.CreateNetworkDeviceAutoImportRule,
|
|
10494
|
+
title: "Create Network Device Auto Import Rule",
|
|
10495
|
+
description: "This permission can create Network Device Auto Import Rules in this project.",
|
|
10496
|
+
isAssignableToTenant: true,
|
|
10497
|
+
isAccessControlPermission: false,
|
|
10498
|
+
isRolePermission: false,
|
|
10499
|
+
group: PermissionGroup.Telemetry,
|
|
10500
|
+
},
|
|
10501
|
+
{
|
|
10502
|
+
permission: Permission.DeleteNetworkDeviceAutoImportRule,
|
|
10503
|
+
title: "Delete Network Device Auto Import Rule",
|
|
10504
|
+
description: "This permission can delete Network Device Auto Import Rules of this project.",
|
|
10505
|
+
isAssignableToTenant: true,
|
|
10506
|
+
isAccessControlPermission: false,
|
|
10507
|
+
isRolePermission: false,
|
|
10508
|
+
group: PermissionGroup.Telemetry,
|
|
10509
|
+
},
|
|
10510
|
+
{
|
|
10511
|
+
permission: Permission.EditNetworkDeviceAutoImportRule,
|
|
10512
|
+
title: "Edit Network Device Auto Import Rule",
|
|
10513
|
+
description: "This permission can edit Network Device Auto Import Rules of this project.",
|
|
10514
|
+
isAssignableToTenant: true,
|
|
10515
|
+
isAccessControlPermission: false,
|
|
10516
|
+
isRolePermission: false,
|
|
10517
|
+
group: PermissionGroup.Telemetry,
|
|
10518
|
+
},
|
|
10519
|
+
{
|
|
10520
|
+
permission: Permission.ReadNetworkDeviceAutoImportRule,
|
|
10521
|
+
title: "Read Network Device Auto Import Rule",
|
|
10522
|
+
description: "This permission can read Network Device Auto Import Rules of this project.",
|
|
10523
|
+
isAssignableToTenant: true,
|
|
10524
|
+
isAccessControlPermission: false,
|
|
10525
|
+
isRolePermission: false,
|
|
10526
|
+
group: PermissionGroup.Telemetry,
|
|
10527
|
+
},
|
|
10487
10528
|
// Podman Host Label Rule Permissions
|
|
10488
10529
|
{
|
|
10489
10530
|
permission: Permission.CreatePodmanHostLabelRule,
|