@oneuptime/common 12.0.14 → 12.0.16

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 (853) hide show
  1. package/Models/AnalyticsModels/Index.ts +10 -0
  2. package/Models/AnalyticsModels/LogCountBaseline.ts +174 -0
  3. package/Models/AnalyticsModels/SecurityEvent.ts +794 -0
  4. package/Models/AnalyticsModels/Span.ts +29 -1
  5. package/Models/AnalyticsModels/SpanCountBaseline.ts +198 -0
  6. package/Models/DatabaseModels/Alert.ts +42 -0
  7. package/Models/DatabaseModels/AlertMeasurement.ts +1114 -0
  8. package/Models/DatabaseModels/AlertMeasurementValue.ts +501 -0
  9. package/Models/DatabaseModels/AlertStateTimeline.ts +10 -2
  10. package/Models/DatabaseModels/BillingPaymentMethod.ts +8 -10
  11. package/Models/DatabaseModels/DetectionRule.ts +487 -0
  12. package/Models/DatabaseModels/GlobalOidc.ts +20 -0
  13. package/Models/DatabaseModels/GlobalSso.ts +20 -0
  14. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +382 -0
  15. package/Models/DatabaseModels/Incident.ts +42 -0
  16. package/Models/DatabaseModels/IncidentMeasurement.ts +1114 -0
  17. package/Models/DatabaseModels/IncidentMeasurementValue.ts +501 -0
  18. package/Models/DatabaseModels/IncidentStateTimeline.ts +10 -2
  19. package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +36 -0
  20. package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +42 -0
  21. package/Models/DatabaseModels/Index.ts +20 -0
  22. package/Models/DatabaseModels/Label.ts +11 -0
  23. package/Models/DatabaseModels/LlmCostBudget.ts +655 -0
  24. package/Models/DatabaseModels/LlmModelPrice.ts +481 -0
  25. package/Models/DatabaseModels/LogSavedView.ts +87 -0
  26. package/Models/DatabaseModels/MarketingConversion.ts +222 -10
  27. package/Models/DatabaseModels/MetricSavedView.ts +59 -0
  28. package/Models/DatabaseModels/NetworkDeviceLinkRule.ts +46 -0
  29. package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +36 -0
  30. package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +42 -0
  31. package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +36 -0
  32. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +42 -0
  33. package/Models/DatabaseModels/Probe.ts +21 -0
  34. package/Models/DatabaseModels/RunbookLabelRule.ts +36 -0
  35. package/Models/DatabaseModels/RunbookOwnerRule.ts +42 -0
  36. package/Models/DatabaseModels/ScheduledMaintenanceMeasurement.ts +1104 -0
  37. package/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.ts +491 -0
  38. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +10 -2
  39. package/Models/DatabaseModels/StatusPage.ts +7 -4
  40. package/Models/DatabaseModels/StatusPageLabelRule.ts +36 -0
  41. package/Models/DatabaseModels/StatusPageOwnerRule.ts +42 -0
  42. package/Models/DatabaseModels/TableView.ts +15 -0
  43. package/Models/DatabaseModels/Team.ts +13 -0
  44. package/Models/DatabaseModels/TeamMember.ts +8 -0
  45. package/Models/DatabaseModels/TraceSavedView.ts +52 -0
  46. package/Models/DatabaseModels/WorkflowLabelRule.ts +36 -0
  47. package/Models/DatabaseModels/WorkflowOwnerRule.ts +42 -0
  48. package/Server/API/StatusPageAPI.ts +29 -4
  49. package/Server/API/TelemetryAPI.ts +252 -6
  50. package/Server/API/UserAPI.ts +88 -0
  51. package/Server/EnvironmentConfig.ts +43 -1
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.ts +19 -0
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.ts +40 -0
  54. package/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.ts +88 -0
  55. package/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.ts +457 -0
  56. package/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.ts +97 -0
  57. package/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.ts +45 -0
  58. package/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.ts +105 -0
  59. package/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.ts +77 -0
  60. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +16 -0
  61. package/Server/Middleware/IdentityRateLimit.ts +672 -0
  62. package/Server/Middleware/SlackAuthorization.ts +43 -6
  63. package/Server/Middleware/UserAuthorization.ts +236 -26
  64. package/Server/Middleware/WhatsAppAuthorization.ts +43 -3
  65. package/Server/Services/AccessTokenService.ts +15 -2
  66. package/Server/Services/AlertMeasurementService.ts +302 -0
  67. package/Server/Services/AlertMeasurementValueService.ts +508 -0
  68. package/Server/Services/AlertService.ts +50 -0
  69. package/Server/Services/AlertStateTimelineService.ts +54 -0
  70. package/Server/Services/DetectionRuleService.ts +74 -0
  71. package/Server/Services/GlobalOidcProjectService.ts +126 -1
  72. package/Server/Services/GlobalOidcService.ts +132 -0
  73. package/Server/Services/GlobalSsoProjectService.ts +126 -1
  74. package/Server/Services/GlobalSsoService.ts +132 -0
  75. package/Server/Services/GoogleSecOpsConnectionService.ts +89 -0
  76. package/Server/Services/IncidentMeasurementService.ts +304 -0
  77. package/Server/Services/IncidentMeasurementValueService.ts +523 -0
  78. package/Server/Services/IncidentService.ts +51 -0
  79. package/Server/Services/IncidentStateTimelineService.ts +54 -0
  80. package/Server/Services/Index.ts +30 -0
  81. package/Server/Services/LlmCostBudgetService.ts +93 -0
  82. package/Server/Services/LlmModelPriceService.ts +202 -0
  83. package/Server/Services/LogAggregationService.ts +1106 -2
  84. package/Server/Services/LogCountBaselineService.ts +163 -0
  85. package/Server/Services/MutableMetricService.ts +30 -9
  86. package/Server/Services/ScheduledMaintenanceMeasurementService.ts +311 -0
  87. package/Server/Services/ScheduledMaintenanceMeasurementValueService.ts +546 -0
  88. package/Server/Services/ScheduledMaintenanceService.ts +53 -0
  89. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +188 -1
  90. package/Server/Services/SecurityEventService.ts +104 -0
  91. package/Server/Services/SpanCountBaselineService.ts +173 -0
  92. package/Server/Services/StatusPageService.ts +4 -3
  93. package/Server/Services/TelemetryUsageBillingService.ts +17 -2
  94. package/Server/Services/UserEmailService.ts +4 -4
  95. package/Server/Services/UserService.ts +284 -51
  96. package/Server/Services/UserTotpAuthService.ts +27 -86
  97. package/Server/Services/UserWebAuthnService.ts +26 -86
  98. package/Server/Types/Billing/MeteredPlan/AllMeteredPlans.ts +14 -0
  99. package/Server/Types/Database/Permissions/TenantPermission.ts +10 -0
  100. package/Server/Types/Database/QueryHelper.ts +1 -1
  101. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  102. package/Server/Utils/AI/Toolbox/Index.ts +6 -0
  103. package/Server/Utils/AI/Toolbox/SecurityEventTools.ts +349 -0
  104. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -4
  105. package/Server/Utils/Attribution.ts +130 -34
  106. package/Server/Utils/CronTab.ts +73 -0
  107. package/Server/Utils/GlobalSsoAuthorization.ts +175 -0
  108. package/Server/Utils/Marketing/ConversionUploadProvider.ts +123 -11
  109. package/Server/Utils/Marketing/Providers/GoogleAds.ts +71 -8
  110. package/Server/Utils/Marketing/Providers/LinkedIn.ts +55 -17
  111. package/Server/Utils/Marketing/Providers/Meta.ts +53 -19
  112. package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +38 -11
  113. package/Server/Utils/Marketing/Providers/Reddit.ts +46 -16
  114. package/Server/Utils/Measurement/MeasurementDefinitionValidator.ts +209 -0
  115. package/Server/Utils/Measurement/MeasurementMetricWriter.ts +189 -0
  116. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +48 -33
  117. package/Server/Utils/Monitor/Criteria/CountAnomaly.ts +182 -0
  118. package/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.ts +35 -30
  119. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +33 -28
  120. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +475 -47
  121. package/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.ts +35 -30
  122. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +34 -28
  123. package/Server/Utils/Monitor/Criteria/LogMonitorCriteria.ts +132 -0
  124. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +33 -28
  125. package/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.ts +35 -0
  126. package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +69 -40
  127. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +35 -29
  128. package/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.ts +132 -0
  129. package/Server/Utils/Monitor/DataToProcess.ts +2 -0
  130. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
  131. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +23 -0
  132. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +20 -0
  133. package/Server/Utils/Monitor/MonitorResource.ts +177 -21
  134. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +1 -0
  135. package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +1 -0
  136. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +548 -0
  137. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +262 -0
  138. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +212 -0
  139. package/Server/Utils/SecurityEvent/SecurityEventRow.ts +101 -0
  140. package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +635 -0
  141. package/Server/Utils/StatusPageContentSecurityPolicy.ts +56 -0
  142. package/Server/Utils/StatusPageCustomizationAccess.ts +117 -0
  143. package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +379 -0
  144. package/Server/Utils/Telemetry/LlmSpan.ts +83 -4
  145. package/Server/Utils/Telemetry/LogErrorPatternSql.ts +136 -0
  146. package/Server/Utils/UserPermission/UserPermission.ts +57 -1
  147. package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +4 -0
  148. package/Tests/App/Dashboard/CreatePageEntryPointPermissions.test.tsx +306 -0
  149. package/Tests/App/Dashboard/DangerZone.test.tsx +11 -0
  150. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +4 -0
  151. package/Tests/App/Dashboard/LogMonitorAttributeOperatorPreview.test.tsx +459 -0
  152. package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +24 -0
  153. package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +6 -0
  154. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +323 -0
  155. package/Tests/Models/DatabaseModels/ProjectSharedResources.test.ts +386 -0
  156. package/Tests/Server/API/LogErrorPatternAPI.test.ts +811 -0
  157. package/Tests/Server/API/StatusPageCustomizationOrigin.test.ts +348 -0
  158. package/Tests/Server/API/UserAuthenticationAPI.test.ts +11 -0
  159. package/Tests/Server/API/UserProjectsAPI.test.ts +11 -2
  160. package/Tests/Server/API/UserTwoFactorAuthAdminAPI.test.ts +918 -0
  161. package/Tests/Server/Infrastructure/LocalCache.test.ts +149 -0
  162. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +9 -59
  163. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +227 -0
  164. package/Tests/Server/Middleware/SlackAuthorization.test.ts +149 -0
  165. package/Tests/Server/Middleware/UserAuthorization.test.ts +27 -13
  166. package/Tests/Server/Middleware/UserAuthorizationGlobalSsoGovernance.test.ts +1455 -0
  167. package/Tests/Server/Middleware/UserAuthorizationSSOProvider.test.ts +91 -2
  168. package/Tests/Server/Middleware/WhatsAppAuthorization.test.ts +233 -0
  169. package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +249 -0
  170. package/Tests/Server/Services/AlertMeasurementService.test.ts +665 -0
  171. package/Tests/Server/Services/AlertMeasurementValueService.test.ts +389 -0
  172. package/Tests/Server/Services/DetectionRuleService.test.ts +254 -0
  173. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +21 -8
  174. package/Tests/Server/Services/GlobalSsoProviderAuthorization.test.ts +1242 -0
  175. package/Tests/Server/Services/IncidentMeasurementService.test.ts +394 -0
  176. package/Tests/Server/Services/IncidentMeasurementValueService.test.ts +816 -0
  177. package/Tests/Server/Services/LlmCostBudgetService.test.ts +104 -0
  178. package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +405 -0
  179. package/Tests/Server/Services/LogErrorPatternAggregation.test.ts +804 -0
  180. package/Tests/Server/Services/MonitorResourceProbeAgreementHydration.test.ts +459 -0
  181. package/Tests/Server/Services/MonitorResourceProbeAgreementReuse.test.ts +10 -0
  182. package/Tests/Server/Services/MutableMetricNameRouting.test.ts +83 -0
  183. package/Tests/Server/Services/ScheduledMaintenanceMeasurementService.test.ts +750 -0
  184. package/Tests/Server/Services/ScheduledMaintenanceMeasurementValueService.test.ts +478 -0
  185. package/Tests/Server/Services/UserAuthenticationService.test.ts +216 -4
  186. package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +1190 -0
  187. package/Tests/Server/Types/AnalyticsDatabase/AggregateUtilBucketTimestamp.test.ts +416 -0
  188. package/Tests/Server/Types/Database/Permissions/ScopedRoleSharedResourceAccess.test.ts +466 -0
  189. package/Tests/Server/Types/Database/QueryHelperManyToManyAndEmptyValues.test.ts +551 -0
  190. package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +265 -0
  191. package/Tests/Server/Types/Database/QueryHelperTextAndStructuralOperators.test.ts +206 -0
  192. package/Tests/Server/Types/Database/SelectUtil.test.ts +348 -0
  193. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +6 -0
  194. package/Tests/Server/Utils/AnalyticsDatabase/FractionalAttributeThreshold.test.ts +224 -0
  195. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +172 -2
  196. package/Tests/Server/Utils/Attribution.test.ts +228 -1
  197. package/Tests/Server/Utils/CronTab.test.ts +116 -0
  198. package/Tests/Server/Utils/GlobalSSOToken.test.ts +581 -0
  199. package/Tests/Server/Utils/GlobalSsoAuthorization.test.ts +1401 -0
  200. package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +315 -0
  201. package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +124 -7
  202. package/Tests/Server/Utils/Marketing/GoogleAds.test.ts +253 -1
  203. package/Tests/Server/Utils/Marketing/LinkedIn.test.ts +282 -0
  204. package/Tests/Server/Utils/Marketing/Meta.test.ts +304 -0
  205. package/Tests/Server/Utils/Marketing/MicrosoftAds.test.ts +263 -0
  206. package/Tests/Server/Utils/Marketing/Reddit.test.ts +259 -0
  207. package/Tests/Server/Utils/Measurement/MeasurementDefinitionValidator.test.ts +322 -0
  208. package/Tests/Server/Utils/Measurement/MeasurementMetricWriter.test.ts +373 -0
  209. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +508 -0
  210. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +30 -9
  211. package/Tests/Server/Utils/Monitor/Criteria/CountAnomaly.test.ts +221 -0
  212. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +987 -0
  213. package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +916 -0
  214. package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +236 -0
  215. package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +382 -0
  216. package/Tests/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.test.ts +147 -0
  217. package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +1219 -0
  218. package/Tests/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.test.ts +274 -0
  219. package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +86 -0
  220. package/Tests/Server/Utils/Monitor/SecurityEventsMonitorDataExtractor.test.ts +93 -0
  221. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +660 -0
  222. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +308 -0
  223. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +271 -0
  224. package/Tests/Server/Utils/SecurityEvent/SecurityEventRow.test.ts +272 -0
  225. package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +511 -0
  226. package/Tests/Server/Utils/StatusPageContentSecurityPolicy.test.ts +136 -0
  227. package/Tests/Server/Utils/StatusPageCustomizationAccess.test.ts +223 -0
  228. package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +497 -0
  229. package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +380 -0
  230. package/Tests/Server/Utils/Telemetry/LogErrorPatternSql.test.ts +207 -0
  231. package/Tests/Server/Utils/UserPermission/ProjectUserGrant.test.ts +293 -0
  232. package/Tests/Types/Monitor/MonitorStepConfigHelpers.test.ts +165 -0
  233. package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +194 -0
  234. package/Tests/Types/Monitor/MonitorStepSecurityEventsMonitor.test.ts +201 -0
  235. package/Tests/Types/NetworkDevice/NetworkDeviceLinkRuleScope.test.ts +215 -0
  236. package/Tests/Types/SecurityEvent/OcsfEventClass.test.ts +105 -0
  237. package/Tests/Types/SecurityEvent/OcsfSeverity.test.ts +111 -0
  238. package/Tests/Types/Telemetry/LlmCostCatalog.test.ts +516 -0
  239. package/Tests/UI/Components/ActiveFilterChipsOperatorValues.test.tsx +222 -0
  240. package/Tests/UI/Components/BulkActionPermissionGating.test.tsx +296 -0
  241. package/Tests/UI/Components/CardModelDetailPermissionGating.test.tsx +305 -0
  242. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +23 -0
  243. package/Tests/UI/Components/DictionaryFilterOperatorDisplay.test.ts +239 -0
  244. package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +267 -0
  245. package/Tests/UI/Components/DuplicateModel.test.tsx +37 -0
  246. package/Tests/UI/Components/Forms/FormSubmitAnalytics.test.tsx +206 -0
  247. package/Tests/UI/Components/ModelCardPermissionGating.test.tsx +348 -0
  248. package/Tests/UI/Components/ModelDelete.test.tsx +25 -1
  249. package/Tests/UI/Components/ModelFormCreatePermission.test.tsx +342 -0
  250. package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +680 -0
  251. package/Tests/UI/Components/OrderedStatesListCreateGate.test.tsx +174 -0
  252. package/Tests/UI/Components/SavedViewsDropdownSearch.test.tsx +1127 -0
  253. package/Tests/UI/Components/SavedViewsFacetSection.test.tsx +958 -0
  254. package/Tests/UI/Components/SavedViewsList.test.ts +699 -0
  255. package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +640 -0
  256. package/Tests/UI/Components/SavedViewsSurfaceParity.test.tsx +679 -0
  257. package/Tests/UI/Components/TableViewLoadFailure.test.tsx +248 -0
  258. package/Tests/UI/Types/UseComponentOutsideClick.test.tsx +226 -0
  259. package/Tests/UI/Utils/AIChatExport/ConversationMarkdown.test.ts +774 -0
  260. package/Tests/UI/Utils/AIChatExport/MarkdownBlocks.test.ts +791 -0
  261. package/Tests/UI/Utils/AIChatExport/MarkdownSafety.test.ts +544 -0
  262. package/Tests/UI/Utils/PermissionGate.test.ts +467 -0
  263. package/Tests/Utils/Analytics.test.ts +187 -0
  264. package/Tests/Utils/Measurement/MeasurementEvaluator.test.ts +639 -0
  265. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +80 -0
  266. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  267. package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +1576 -0
  268. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +433 -0
  269. package/Tests/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.test.ts +214 -0
  270. package/Tests/Utils/SecurityEvent/GenericNormalizer.test.ts +204 -0
  271. package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +252 -0
  272. package/Tests/Utils/SecurityEvent/NormalizerHelpers.test.ts +274 -0
  273. package/Tests/Utils/SecurityEvent/OcsfNormalizer.test.ts +208 -0
  274. package/Tests/Utils/SecurityEvent/SecurityEventNormalizer.test.ts +172 -0
  275. package/Tests/Utils/SecurityEvent/SigmaRuleParser.test.ts +471 -0
  276. package/Tests/Utils/SecurityEvent/UdmNormalizer.test.ts +361 -0
  277. package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +82 -0
  278. package/Tests/Utils/Telemetry/LogErrorPattern.test.ts +463 -0
  279. package/Types/AI/AIChatTypes.ts +1 -0
  280. package/Types/Alerts/AlertMeasurementAnchorType.ts +14 -0
  281. package/Types/Alerts/AlertStateRole.ts +11 -0
  282. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +16 -0
  283. package/Types/Dashboard/Chart/ChartType.ts +1 -0
  284. package/Types/Dashboard/DashboardComponentType.ts +2 -0
  285. package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.ts +18 -0
  286. package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.ts +16 -0
  287. package/Types/Incident/IncidentMeasurementAnchorType.ts +34 -0
  288. package/Types/Incident/IncidentStateRole.ts +14 -0
  289. package/Types/Marketing/Attribution.ts +75 -0
  290. package/Types/Marketing/MarketingConversion.ts +43 -1
  291. package/Types/Measurement/MeasurementAggregationType.ts +43 -0
  292. package/Types/Measurement/MeasurementAnchorKind.ts +23 -0
  293. package/Types/Measurement/MeasurementOccurrence.ts +14 -0
  294. package/Types/Measurement/MeasurementStatus.ts +34 -0
  295. package/Types/MeteredPlan/ProductType.ts +1 -0
  296. package/Types/Monitor/CriteriaFilter.ts +12 -0
  297. package/Types/Monitor/MonitorCriteriaInstance.ts +64 -0
  298. package/Types/Monitor/MonitorStep.ts +28 -0
  299. package/Types/Monitor/MonitorStepSecurityEventsMonitor.ts +100 -0
  300. package/Types/Monitor/MonitorType.ts +20 -0
  301. package/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.ts +17 -0
  302. package/Types/NetworkDevice/NetworkDeviceLinkRuleScope.ts +51 -0
  303. package/Types/Permission.ts +399 -2
  304. package/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.ts +20 -0
  305. package/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.ts +16 -0
  306. package/Types/SecurityEvent/NormalizedSecurityEvent.ts +92 -0
  307. package/Types/SecurityEvent/OcsfEventClass.ts +205 -0
  308. package/Types/SecurityEvent/OcsfSeverity.ts +88 -0
  309. package/Types/SecurityEvent/SecurityEventFormat.ts +23 -0
  310. package/Types/SecurityEvent/SigmaRule.ts +70 -0
  311. package/Types/Telemetry/LlmConventions.ts +20 -1
  312. package/Types/Telemetry/LlmCostCatalog.ts +557 -0
  313. package/Types/Telemetry/ServiceType.ts +1 -0
  314. package/Types/Telemetry/TelemetryRetentionConfig.ts +5 -1
  315. package/Types/Telemetry/TelemetryType.ts +1 -0
  316. package/Types/TwoFactorAuthStatus.ts +42 -0
  317. package/Types/UserAuthenticationStatus.ts +18 -0
  318. package/UI/Components/ActionButton/ActionButtonSchema.ts +7 -0
  319. package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +35 -2
  320. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +34 -1
  321. package/UI/Components/BulkUpdate/BulkOwnerActions.tsx +45 -1
  322. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +3 -0
  323. package/UI/Components/Button/Button.tsx +37 -2
  324. package/UI/Components/Card/Card.tsx +6 -0
  325. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +24 -1
  326. package/UI/Components/Dictionary/DictionaryFilterOperator.ts +57 -0
  327. package/UI/Components/DuplicateModel/DuplicateModel.tsx +16 -0
  328. package/UI/Components/FormModal/BasicFormModal.tsx +12 -0
  329. package/UI/Components/Forms/BasicForm.tsx +13 -1
  330. package/UI/Components/Forms/BasicModelForm.tsx +2 -1
  331. package/UI/Components/Forms/ModelForm.tsx +64 -3
  332. package/UI/Components/Forms/Utils/FormAnalyticsName.ts +39 -0
  333. package/UI/Components/List/ListRow.tsx +6 -0
  334. package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +34 -7
  335. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +7 -40
  336. package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +155 -3
  337. package/UI/Components/ModelDelete/ModelDelete.tsx +20 -0
  338. package/UI/Components/ModelDetail/CardModelDetail.tsx +36 -23
  339. package/UI/Components/ModelFormModal/ModelFormModal.tsx +6 -1
  340. package/UI/Components/ModelList/ModelList.tsx +21 -2
  341. package/UI/Components/ModelList/StaticModelList.tsx +11 -0
  342. package/UI/Components/ModelTable/BaseModelTable.tsx +168 -62
  343. package/UI/Components/ModelTable/ModelTable.tsx +16 -10
  344. package/UI/Components/ModelTable/TableView.tsx +36 -4
  345. package/UI/Components/MoreMenu/MoreMenuItem.tsx +36 -4
  346. package/UI/Components/OrderedStatesList/Item.tsx +6 -0
  347. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +81 -47
  348. package/UI/Components/ResetObjectID/ResetObjectID.tsx +16 -0
  349. package/UI/Components/SavedViews/SavedViewsFacetSection.tsx +242 -0
  350. package/UI/Components/SavedViews/SavedViewsList.ts +168 -0
  351. package/UI/Components/SavedViews/SavedViewsSearchInput.tsx +46 -0
  352. package/UI/Components/SavedViews/SavedViewsShowMoreButton.tsx +44 -0
  353. package/UI/Components/Table/TableRow.tsx +12 -0
  354. package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +152 -2
  355. package/UI/Types/UseComponentOutsideClick.ts +47 -0
  356. package/UI/Utils/PermissionGate.ts +277 -0
  357. package/Utils/Analytics.ts +55 -2
  358. package/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.ts +84 -0
  359. package/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.ts +110 -0
  360. package/Utils/Dashboard/Components/Index.ts +14 -0
  361. package/Utils/Measurement/MeasurementEvaluator.ts +359 -0
  362. package/Utils/Monitor/MonitorMetricType.ts +40 -0
  363. package/Utils/Monitor/MonitorSummarySnapshotUtil.ts +1 -0
  364. package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +669 -37
  365. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +231 -0
  366. package/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.ts +115 -0
  367. package/Utils/SecurityEvent/GenericNormalizer.ts +208 -0
  368. package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +206 -0
  369. package/Utils/SecurityEvent/NormalizerHelpers.ts +263 -0
  370. package/Utils/SecurityEvent/OcsfNormalizer.ts +194 -0
  371. package/Utils/SecurityEvent/SecurityEventNormalizer.ts +82 -0
  372. package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +579 -0
  373. package/Utils/SecurityEvent/UdmNormalizer.ts +442 -0
  374. package/Utils/Telemetry/CrossSignalScope.ts +46 -9
  375. package/Utils/Telemetry/LogErrorPattern.ts +350 -0
  376. package/build/dist/Models/AnalyticsModels/Index.js +10 -0
  377. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  378. package/build/dist/Models/AnalyticsModels/LogCountBaseline.js +159 -0
  379. package/build/dist/Models/AnalyticsModels/LogCountBaseline.js.map +1 -0
  380. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +596 -0
  381. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -0
  382. package/build/dist/Models/AnalyticsModels/Span.js +24 -1
  383. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  384. package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js +181 -0
  385. package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js.map +1 -0
  386. package/build/dist/Models/DatabaseModels/Alert.js +43 -0
  387. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  388. package/build/dist/Models/DatabaseModels/AlertMeasurement.js +1143 -0
  389. package/build/dist/Models/DatabaseModels/AlertMeasurement.js.map +1 -0
  390. package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js +523 -0
  391. package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js.map +1 -0
  392. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +9 -2
  393. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
  394. package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js +10 -11
  395. package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js.map +1 -1
  396. package/build/dist/Models/DatabaseModels/DetectionRule.js +517 -0
  397. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -0
  398. package/build/dist/Models/DatabaseModels/GlobalOidc.js +21 -0
  399. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  400. package/build/dist/Models/DatabaseModels/GlobalSso.js +21 -0
  401. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  402. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +410 -0
  403. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -0
  404. package/build/dist/Models/DatabaseModels/Incident.js +43 -0
  405. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  406. package/build/dist/Models/DatabaseModels/IncidentMeasurement.js +1143 -0
  407. package/build/dist/Models/DatabaseModels/IncidentMeasurement.js.map +1 -0
  408. package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js +523 -0
  409. package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js.map +1 -0
  410. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +9 -2
  411. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  412. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +36 -0
  413. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
  414. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +42 -0
  415. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
  416. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  417. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  418. package/build/dist/Models/DatabaseModels/Label.js +11 -0
  419. package/build/dist/Models/DatabaseModels/Label.js.map +1 -1
  420. package/build/dist/Models/DatabaseModels/LlmCostBudget.js +681 -0
  421. package/build/dist/Models/DatabaseModels/LlmCostBudget.js.map +1 -0
  422. package/build/dist/Models/DatabaseModels/LlmModelPrice.js +503 -0
  423. package/build/dist/Models/DatabaseModels/LlmModelPrice.js.map +1 -0
  424. package/build/dist/Models/DatabaseModels/LogSavedView.js +87 -0
  425. package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
  426. package/build/dist/Models/DatabaseModels/MarketingConversion.js +237 -11
  427. package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -1
  428. package/build/dist/Models/DatabaseModels/MetricSavedView.js +59 -0
  429. package/build/dist/Models/DatabaseModels/MetricSavedView.js.map +1 -1
  430. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js +47 -0
  431. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js.map +1 -1
  432. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +36 -0
  433. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
  434. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +42 -0
  435. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
  436. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +36 -0
  437. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
  438. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +42 -0
  439. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
  440. package/build/dist/Models/DatabaseModels/Probe.js +21 -0
  441. package/build/dist/Models/DatabaseModels/Probe.js.map +1 -1
  442. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +36 -0
  443. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
  444. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +42 -0
  445. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
  446. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js +1133 -0
  447. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js.map +1 -0
  448. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js +515 -0
  449. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js.map +1 -0
  450. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +9 -2
  451. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  452. package/build/dist/Models/DatabaseModels/StatusPage.js +4 -4
  453. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  454. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +36 -0
  455. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
  456. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +42 -0
  457. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
  458. package/build/dist/Models/DatabaseModels/TableView.js +15 -0
  459. package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
  460. package/build/dist/Models/DatabaseModels/Team.js +13 -0
  461. package/build/dist/Models/DatabaseModels/Team.js.map +1 -1
  462. package/build/dist/Models/DatabaseModels/TeamMember.js +8 -0
  463. package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
  464. package/build/dist/Models/DatabaseModels/TraceSavedView.js +52 -0
  465. package/build/dist/Models/DatabaseModels/TraceSavedView.js.map +1 -1
  466. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +36 -0
  467. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
  468. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +42 -0
  469. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
  470. package/build/dist/Server/API/StatusPageAPI.js +25 -4
  471. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  472. package/build/dist/Server/API/TelemetryAPI.js +136 -0
  473. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  474. package/build/dist/Server/API/UserAPI.js +75 -2
  475. package/build/dist/Server/API/UserAPI.js.map +1 -1
  476. package/build/dist/Server/EnvironmentConfig.js +35 -1
  477. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  478. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.js +12 -0
  479. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.js.map +1 -0
  480. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.js +29 -0
  481. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.js.map +1 -0
  482. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js +36 -0
  483. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js.map +1 -0
  484. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js +162 -0
  485. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js.map +1 -0
  486. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js +40 -0
  487. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js.map +1 -0
  488. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js +22 -0
  489. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js.map +1 -0
  490. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js +52 -0
  491. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js.map +1 -0
  492. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.js +38 -0
  493. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.js.map +1 -0
  494. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +16 -0
  495. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  496. package/build/dist/Server/Middleware/IdentityRateLimit.js +491 -0
  497. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -0
  498. package/build/dist/Server/Middleware/SlackAuthorization.js +28 -4
  499. package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
  500. package/build/dist/Server/Middleware/UserAuthorization.js +197 -22
  501. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  502. package/build/dist/Server/Middleware/WhatsAppAuthorization.js +32 -2
  503. package/build/dist/Server/Middleware/WhatsAppAuthorization.js.map +1 -1
  504. package/build/dist/Server/Services/AccessTokenService.js +13 -2
  505. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  506. package/build/dist/Server/Services/AlertMeasurementService.js +250 -0
  507. package/build/dist/Server/Services/AlertMeasurementService.js.map +1 -0
  508. package/build/dist/Server/Services/AlertMeasurementValueService.js +400 -0
  509. package/build/dist/Server/Services/AlertMeasurementValueService.js.map +1 -0
  510. package/build/dist/Server/Services/AlertService.js +37 -0
  511. package/build/dist/Server/Services/AlertService.js.map +1 -1
  512. package/build/dist/Server/Services/AlertStateTimelineService.js +48 -0
  513. package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
  514. package/build/dist/Server/Services/DetectionRuleService.js +50 -0
  515. package/build/dist/Server/Services/DetectionRuleService.js.map +1 -0
  516. package/build/dist/Server/Services/GlobalOidcProjectService.js +105 -0
  517. package/build/dist/Server/Services/GlobalOidcProjectService.js.map +1 -1
  518. package/build/dist/Server/Services/GlobalOidcService.js +127 -0
  519. package/build/dist/Server/Services/GlobalOidcService.js.map +1 -1
  520. package/build/dist/Server/Services/GlobalSsoProjectService.js +105 -0
  521. package/build/dist/Server/Services/GlobalSsoProjectService.js.map +1 -1
  522. package/build/dist/Server/Services/GlobalSsoService.js +127 -0
  523. package/build/dist/Server/Services/GlobalSsoService.js.map +1 -1
  524. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +55 -0
  525. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -0
  526. package/build/dist/Server/Services/IncidentMeasurementService.js +252 -0
  527. package/build/dist/Server/Services/IncidentMeasurementService.js.map +1 -0
  528. package/build/dist/Server/Services/IncidentMeasurementValueService.js +413 -0
  529. package/build/dist/Server/Services/IncidentMeasurementValueService.js.map +1 -0
  530. package/build/dist/Server/Services/IncidentService.js +41 -0
  531. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  532. package/build/dist/Server/Services/IncidentStateTimelineService.js +50 -0
  533. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  534. package/build/dist/Server/Services/Index.js +30 -0
  535. package/build/dist/Server/Services/Index.js.map +1 -1
  536. package/build/dist/Server/Services/LlmCostBudgetService.js +89 -0
  537. package/build/dist/Server/Services/LlmCostBudgetService.js.map +1 -0
  538. package/build/dist/Server/Services/LlmModelPriceService.js +163 -0
  539. package/build/dist/Server/Services/LlmModelPriceService.js.map +1 -0
  540. package/build/dist/Server/Services/LogAggregationService.js +709 -0
  541. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  542. package/build/dist/Server/Services/LogCountBaselineService.js +112 -0
  543. package/build/dist/Server/Services/LogCountBaselineService.js.map +1 -0
  544. package/build/dist/Server/Services/MutableMetricService.js +28 -9
  545. package/build/dist/Server/Services/MutableMetricService.js.map +1 -1
  546. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js +254 -0
  547. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js.map +1 -0
  548. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js +434 -0
  549. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js.map +1 -0
  550. package/build/dist/Server/Services/ScheduledMaintenanceService.js +37 -0
  551. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  552. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +134 -0
  553. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  554. package/build/dist/Server/Services/SecurityEventService.js +64 -0
  555. package/build/dist/Server/Services/SecurityEventService.js.map +1 -0
  556. package/build/dist/Server/Services/SpanCountBaselineService.js +122 -0
  557. package/build/dist/Server/Services/SpanCountBaselineService.js.map +1 -0
  558. package/build/dist/Server/Services/StatusPageService.js +4 -3
  559. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  560. package/build/dist/Server/Services/TelemetryUsageBillingService.js +15 -3
  561. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  562. package/build/dist/Server/Services/UserEmailService.js +4 -4
  563. package/build/dist/Server/Services/UserService.js +262 -42
  564. package/build/dist/Server/Services/UserService.js.map +1 -1
  565. package/build/dist/Server/Services/UserTotpAuthService.js +0 -73
  566. package/build/dist/Server/Services/UserTotpAuthService.js.map +1 -1
  567. package/build/dist/Server/Services/UserWebAuthnService.js +1 -73
  568. package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
  569. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js +13 -0
  570. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js.map +1 -1
  571. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +10 -0
  572. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
  573. package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
  574. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  575. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  576. package/build/dist/Server/Utils/AI/Toolbox/Index.js +3 -0
  577. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  578. package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js +257 -0
  579. package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js.map +1 -0
  580. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -4
  581. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  582. package/build/dist/Server/Utils/Attribution.js +77 -33
  583. package/build/dist/Server/Utils/Attribution.js.map +1 -1
  584. package/build/dist/Server/Utils/CronTab.js +66 -0
  585. package/build/dist/Server/Utils/CronTab.js.map +1 -1
  586. package/build/dist/Server/Utils/GlobalSsoAuthorization.js +112 -0
  587. package/build/dist/Server/Utils/GlobalSsoAuthorization.js.map +1 -0
  588. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +57 -4
  589. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -1
  590. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +53 -9
  591. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -1
  592. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +42 -18
  593. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -1
  594. package/build/dist/Server/Utils/Marketing/Providers/Meta.js +43 -19
  595. package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -1
  596. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +25 -12
  597. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -1
  598. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +35 -16
  599. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -1
  600. package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js +109 -0
  601. package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js.map +1 -0
  602. package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js +131 -0
  603. package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js.map +1 -0
  604. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +37 -35
  605. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  606. package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js +111 -0
  607. package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js.map +1 -0
  608. package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js +21 -25
  609. package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js.map +1 -1
  610. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +20 -22
  611. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  612. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +370 -42
  613. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  614. package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js +21 -25
  615. package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js.map +1 -1
  616. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +21 -25
  617. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  618. package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js +84 -1
  619. package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js.map +1 -1
  620. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +21 -25
  621. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
  622. package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js +35 -0
  623. package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js.map +1 -0
  624. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +64 -52
  625. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
  626. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +25 -29
  627. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  628. package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.js +84 -1
  629. package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.js.map +1 -1
  630. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
  631. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  632. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +20 -0
  633. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  634. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
  635. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  636. package/build/dist/Server/Utils/Monitor/MonitorResource.js +133 -23
  637. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  638. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +6 -5
  639. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  640. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +1 -0
  641. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -1
  642. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +404 -0
  643. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -0
  644. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +145 -0
  645. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
  646. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +176 -0
  647. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -0
  648. package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js +69 -0
  649. package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js.map +1 -0
  650. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +493 -0
  651. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -0
  652. package/build/dist/Server/Utils/StatusPageContentSecurityPolicy.js +39 -0
  653. package/build/dist/Server/Utils/StatusPageContentSecurityPolicy.js.map +1 -0
  654. package/build/dist/Server/Utils/StatusPageCustomizationAccess.js +85 -0
  655. package/build/dist/Server/Utils/StatusPageCustomizationAccess.js.map +1 -0
  656. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +317 -0
  657. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -0
  658. package/build/dist/Server/Utils/Telemetry/LlmSpan.js +56 -4
  659. package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
  660. package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js +112 -0
  661. package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js.map +1 -0
  662. package/build/dist/Server/Utils/UserPermission/UserPermission.js +46 -1
  663. package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
  664. package/build/dist/Types/AI/AIChatTypes.js +1 -0
  665. package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
  666. package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js +15 -0
  667. package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js.map +1 -0
  668. package/build/dist/Types/Alerts/AlertStateRole.js +12 -0
  669. package/build/dist/Types/Alerts/AlertStateRole.js.map +1 -0
  670. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +16 -0
  671. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  672. package/build/dist/Types/Dashboard/Chart/ChartType.js +1 -0
  673. package/build/dist/Types/Dashboard/Chart/ChartType.js.map +1 -1
  674. package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
  675. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  676. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js +2 -0
  677. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js.map +1 -0
  678. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js +2 -0
  679. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js.map +1 -0
  680. package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js +29 -0
  681. package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js.map +1 -0
  682. package/build/dist/Types/Incident/IncidentStateRole.js +15 -0
  683. package/build/dist/Types/Incident/IncidentStateRole.js.map +1 -0
  684. package/build/dist/Types/Marketing/Attribution.js +68 -0
  685. package/build/dist/Types/Marketing/Attribution.js.map +1 -0
  686. package/build/dist/Types/Marketing/MarketingConversion.js +40 -1
  687. package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -1
  688. package/build/dist/Types/Measurement/MeasurementAggregationType.js +40 -0
  689. package/build/dist/Types/Measurement/MeasurementAggregationType.js.map +1 -0
  690. package/build/dist/Types/Measurement/MeasurementAnchorKind.js +22 -0
  691. package/build/dist/Types/Measurement/MeasurementAnchorKind.js.map +1 -0
  692. package/build/dist/Types/Measurement/MeasurementOccurrence.js +15 -0
  693. package/build/dist/Types/Measurement/MeasurementOccurrence.js.map +1 -0
  694. package/build/dist/Types/Measurement/MeasurementStatus.js +32 -0
  695. package/build/dist/Types/Measurement/MeasurementStatus.js.map +1 -0
  696. package/build/dist/Types/MeteredPlan/ProductType.js +1 -0
  697. package/build/dist/Types/MeteredPlan/ProductType.js.map +1 -1
  698. package/build/dist/Types/Monitor/CriteriaFilter.js +3 -0
  699. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  700. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +59 -0
  701. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  702. package/build/dist/Types/Monitor/MonitorStep.js +17 -0
  703. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  704. package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js +64 -0
  705. package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js.map +1 -0
  706. package/build/dist/Types/Monitor/MonitorType.js +19 -0
  707. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  708. package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js +2 -0
  709. package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js.map +1 -0
  710. package/build/dist/Types/NetworkDevice/NetworkDeviceLinkRuleScope.js +46 -0
  711. package/build/dist/Types/NetworkDevice/NetworkDeviceLinkRuleScope.js.map +1 -0
  712. package/build/dist/Types/Permission.js +347 -2
  713. package/build/dist/Types/Permission.js.map +1 -1
  714. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js +19 -0
  715. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js.map +1 -0
  716. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js +17 -0
  717. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js.map +1 -0
  718. package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js +2 -0
  719. package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js.map +1 -0
  720. package/build/dist/Types/SecurityEvent/OcsfEventClass.js +181 -0
  721. package/build/dist/Types/SecurityEvent/OcsfEventClass.js.map +1 -0
  722. package/build/dist/Types/SecurityEvent/OcsfSeverity.js +81 -0
  723. package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -0
  724. package/build/dist/Types/SecurityEvent/SecurityEventFormat.js +21 -0
  725. package/build/dist/Types/SecurityEvent/SecurityEventFormat.js.map +1 -0
  726. package/build/dist/Types/SecurityEvent/SigmaRule.js +16 -0
  727. package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -0
  728. package/build/dist/Types/Telemetry/LlmConventions.js +19 -1
  729. package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
  730. package/build/dist/Types/Telemetry/LlmCostCatalog.js +484 -0
  731. package/build/dist/Types/Telemetry/LlmCostCatalog.js.map +1 -0
  732. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  733. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  734. package/build/dist/Types/Telemetry/TelemetryRetentionConfig.js.map +1 -1
  735. package/build/dist/Types/Telemetry/TelemetryType.js +1 -0
  736. package/build/dist/Types/Telemetry/TelemetryType.js.map +1 -1
  737. package/build/dist/Types/TwoFactorAuthStatus.js +41 -0
  738. package/build/dist/Types/TwoFactorAuthStatus.js.map +1 -0
  739. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +16 -2
  740. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
  741. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +15 -1
  742. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  743. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js +20 -1
  744. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js.map +1 -1
  745. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +1 -1
  746. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  747. package/build/dist/UI/Components/Button/Button.js +22 -1
  748. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  749. package/build/dist/UI/Components/Card/Card.js +1 -1
  750. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  751. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +14 -1
  752. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  753. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +47 -0
  754. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
  755. package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js +8 -0
  756. package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js.map +1 -1
  757. package/build/dist/UI/Components/FormModal/BasicFormModal.js +2 -1
  758. package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
  759. package/build/dist/UI/Components/Forms/BasicForm.js +10 -1
  760. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  761. package/build/dist/UI/Components/Forms/BasicModelForm.js +2 -1
  762. package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
  763. package/build/dist/UI/Components/Forms/ModelForm.js +44 -2
  764. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  765. package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js +33 -0
  766. package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js.map +1 -0
  767. package/build/dist/UI/Components/List/ListRow.js +4 -1
  768. package/build/dist/UI/Components/List/ListRow.js.map +1 -1
  769. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +32 -7
  770. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
  771. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +2 -17
  772. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  773. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +93 -4
  774. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
  775. package/build/dist/UI/Components/ModelDelete/ModelDelete.js +13 -0
  776. package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
  777. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +27 -11
  778. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  779. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +2 -1
  780. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  781. package/build/dist/UI/Components/ModelList/ModelList.js +13 -2
  782. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  783. package/build/dist/UI/Components/ModelList/StaticModelList.js +4 -1
  784. package/build/dist/UI/Components/ModelList/StaticModelList.js.map +1 -1
  785. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +101 -40
  786. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  787. package/build/dist/UI/Components/ModelTable/ModelTable.js +9 -7
  788. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  789. package/build/dist/UI/Components/ModelTable/TableView.js +32 -4
  790. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  791. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +19 -2
  792. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  793. package/build/dist/UI/Components/OrderedStatesList/Item.js +4 -1
  794. package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
  795. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +33 -32
  796. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  797. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +8 -0
  798. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  799. package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js +98 -0
  800. package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js.map +1 -0
  801. package/build/dist/UI/Components/SavedViews/SavedViewsList.js +99 -0
  802. package/build/dist/UI/Components/SavedViews/SavedViewsList.js.map +1 -0
  803. package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js +17 -0
  804. package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js.map +1 -0
  805. package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js +15 -0
  806. package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js.map +1 -0
  807. package/build/dist/UI/Components/Table/TableRow.js +8 -2
  808. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  809. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +93 -4
  810. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
  811. package/build/dist/UI/Types/UseComponentOutsideClick.js +39 -0
  812. package/build/dist/UI/Types/UseComponentOutsideClick.js.map +1 -1
  813. package/build/dist/UI/Utils/PermissionGate.js +164 -0
  814. package/build/dist/UI/Utils/PermissionGate.js.map +1 -0
  815. package/build/dist/Utils/Analytics.js +50 -2
  816. package/build/dist/Utils/Analytics.js.map +1 -1
  817. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js +70 -0
  818. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js.map +1 -0
  819. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js +92 -0
  820. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js.map +1 -0
  821. package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
  822. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  823. package/build/dist/Utils/Measurement/MeasurementEvaluator.js +210 -0
  824. package/build/dist/Utils/Measurement/MeasurementEvaluator.js.map +1 -0
  825. package/build/dist/Utils/Monitor/MonitorMetricType.js +37 -0
  826. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  827. package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js +1 -0
  828. package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js.map +1 -1
  829. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +359 -37
  830. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -1
  831. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +108 -0
  832. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -0
  833. package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js +87 -0
  834. package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js.map +1 -0
  835. package/build/dist/Utils/SecurityEvent/GenericNormalizer.js +176 -0
  836. package/build/dist/Utils/SecurityEvent/GenericNormalizer.js.map +1 -0
  837. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +146 -0
  838. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -0
  839. package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js +196 -0
  840. package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js.map +1 -0
  841. package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js +136 -0
  842. package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js.map +1 -0
  843. package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js +64 -0
  844. package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js.map +1 -0
  845. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +388 -0
  846. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -0
  847. package/build/dist/Utils/SecurityEvent/UdmNormalizer.js +328 -0
  848. package/build/dist/Utils/SecurityEvent/UdmNormalizer.js.map +1 -0
  849. package/build/dist/Utils/Telemetry/CrossSignalScope.js +29 -7
  850. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  851. package/build/dist/Utils/Telemetry/LogErrorPattern.js +284 -0
  852. package/build/dist/Utils/Telemetry/LogErrorPattern.js.map +1 -0
  853. package/package.json +3 -1
@@ -0,0 +1,491 @@
1
+ import Redis from "../Infrastructure/Redis";
2
+ import logger from "../Utils/Logger";
3
+ import resolveTrustedClientIp from "../Utils/ClientIp";
4
+ import Response from "../Utils/Response";
5
+ import ServiceUnavailableException from "../../Types/Exception/ServiceUnavailableException";
6
+ import TooManyRequestsException from "../../Types/Exception/TooManyRequestsException";
7
+ /*
8
+ * Attempt limiting for the anonymous identity routes that accept a
9
+ * credential: POST /login, POST /verify-totp-auth, POST /verify-webauthn-auth
10
+ * and POST /verify-totp-enrolment
11
+ * (App/FeatureSet/Identity/API/Authentication.ts).
12
+ *
13
+ * WHY THESE ROUTES NEED IT
14
+ *
15
+ * All three are unauthenticated by definition -- they are how a session is
16
+ * obtained -- so nothing upstream of them counts anything. Until this
17
+ * middleware existed a caller could submit credentials to them as fast as the
18
+ * process would answer.
19
+ *
20
+ * /verify-totp-auth is the sharpest case. It is reached with a valid password
21
+ * already in hand, and the only thing left to produce is a six digit code, so
22
+ * unthrottled it is an online guessing oracle against a 10^6 space. The space
23
+ * is not even 10^6 wide at any given instant: Common/Server/Utils/TotpAuth.ts
24
+ * accepts TotpValidationWindow = 3 steps either side of now (seven 30 second
25
+ * steps, +/- 90 seconds) across both entries in SupportedTotpAlgorithms, so
26
+ * fourteen distinct six digit strings are live at once and a single guess
27
+ * lands with probability ~1.4e-5. At a few thousand requests a second that is
28
+ * a bypassed second factor in minutes. Bounded to the budgets below it is
29
+ * years, and the account owner sees the failures.
30
+ *
31
+ * /login is the same shape one step earlier, against a password rather than a
32
+ * code.
33
+ *
34
+ * /verify-webauthn-auth and /verify-totp-enrolment are covered for a reason
35
+ * that holds whatever their own factor is worth. All four routes share one
36
+ * `login()` function and all of them run the same `verifyHashedColumnValue`
37
+ * before they reach their factor, so each is a password oracle in its own
38
+ * right. Leaving any one of them unlimited would not be an unguarded route so
39
+ * much as a hole in the fence: an attacker refused at /login points the same
40
+ * guesses at whichever sibling still answers. The enrolment route makes that
41
+ * concrete -- guessing its CODE is pointless, because /login hands the user
42
+ * the secret it is derived from, but guessing the PASSWORD it demands first is
43
+ * exactly as useful there as anywhere else.
44
+ *
45
+ * CAPTCHA IS NOT THIS
46
+ *
47
+ * /login already calls CaptchaUtil.verifyCaptcha, but that is not a
48
+ * substitute on either axis. CAPTCHA_ENABLED is off by default, so a
49
+ * self-hosted instance has nothing there at all; and an hCaptcha token is
50
+ * single use, which is exactly why the second step of a login cannot demand
51
+ * one -- /verify-totp-auth deliberately does not, and could not.
52
+ *
53
+ * THIS FAILS CLOSED
54
+ *
55
+ * With Redis unreachable these routes answer 503 rather than running
56
+ * unthrottled. That is the choice PublicDashboardRateLimit makes for
57
+ * /master-password and the opposite of the one VerificationCodeRateLimit
58
+ * makes, and the deciding question is the same in all three: is there another
59
+ * control still standing? Here there is not. Nothing in Postgres counts login
60
+ * attempts, so serving the route without the counter means serving the
61
+ * unlimited guessing oracle this middleware exists to close.
62
+ *
63
+ * It also costs nothing in availability that was not already lost. A
64
+ * successful login goes through AccessTokenService.refreshUserAllPermissions,
65
+ * which writes the user's permissions to GlobalCache, which throws
66
+ * DatabaseNotConnectedException when Redis is down. Logging in is already
67
+ * impossible in that state; the difference this makes is a 503 that says to
68
+ * come back shortly instead of a 500.
69
+ */
70
+ /*
71
+ * Every request consumes TWO counters, and either one can reject it:
72
+ *
73
+ * - the account counter, keyed on the submitted email address AND the client
74
+ * address. This is the budget one person gets for one account.
75
+ *
76
+ * - the address counter, keyed on the client address alone. Without it the
77
+ * account counter is trivially bypassed: the email address is a field in
78
+ * the request body, so a caller who changes it on every request lands in a
79
+ * fresh bucket every time. Against /verify-totp-auth that matters
80
+ * enormously -- a code guessed against ANY account is a bypassed second
81
+ * factor, the attacker does not care whose. The address counter is the
82
+ * ceiling that survives email rotation.
83
+ *
84
+ * Deliberately NOT keyed on the email address alone. A bare per-account
85
+ * counter is a lockout weapon: anyone who knows a victim's email address
86
+ * could burn that account's whole budget from anywhere and keep the real
87
+ * owner out for as long as they cared to keep sending. Pairing the address
88
+ * in means an attacker can only spend their own bucket.
89
+ *
90
+ * The cost of that pairing, stated plainly: an attacker with many source
91
+ * addresses gets a fresh per-account budget from each one, so a distributed
92
+ * attack on a single account is bounded only by how many addresses they have.
93
+ * That is the standard trade and it is the right way round -- the alternative
94
+ * hands every user a remote lockout button, and the distributed case is what
95
+ * the account owner's own failed-login visibility and the network layer are
96
+ * for.
97
+ *
98
+ * Both counters are incremented on every request including a rejected one.
99
+ * That is standard fixed-window behaviour and it is deliberate: a caller who
100
+ * keeps hammering keeps their window pinned rather than being handed a fresh
101
+ * allowance for free.
102
+ */
103
+ export var IdentityRateLimitBucket;
104
+ (function (IdentityRateLimitBucket) {
105
+ /* POST /login. Password guessing. */
106
+ IdentityRateLimitBucket["Login"] = "login";
107
+ /*
108
+ * POST /verify-totp-auth, POST /verify-webauthn-auth and
109
+ * POST /verify-totp-enrolment -- the second step, reached with a valid
110
+ * password already accepted.
111
+ */
112
+ IdentityRateLimitBucket["TwoFactor"] = "two-factor";
113
+ })(IdentityRateLimitBucket || (IdentityRateLimitBucket = {}));
114
+ export var IdentityRateLimitScope;
115
+ (function (IdentityRateLimitScope) {
116
+ /* One email address, from one client address. */
117
+ IdentityRateLimitScope["Account"] = "account";
118
+ /* One client address, across every account. Survives email rotation. */
119
+ IdentityRateLimitScope["Ip"] = "ip";
120
+ })(IdentityRateLimitScope || (IdentityRateLimitScope = {}));
121
+ export var IdentityRateLimitOutcome;
122
+ (function (IdentityRateLimitOutcome) {
123
+ IdentityRateLimitOutcome["Allowed"] = "allowed";
124
+ IdentityRateLimitOutcome["RateLimited"] = "rate-limited";
125
+ /* Redis is unreachable, so no limit can be honoured either way. */
126
+ IdentityRateLimitOutcome["CounterUnavailable"] = "counter-unavailable";
127
+ })(IdentityRateLimitOutcome || (IdentityRateLimitOutcome = {}));
128
+ const parsePositiveIntFromEnv = (envKey, fallback) => {
129
+ const rawValue = process.env[envKey];
130
+ if (!rawValue) {
131
+ return fallback;
132
+ }
133
+ const parsedValue = parseInt(rawValue, 10);
134
+ if (!Number.isFinite(parsedValue) || parsedValue <= 0) {
135
+ return fallback;
136
+ }
137
+ return parsedValue;
138
+ };
139
+ /*
140
+ * Password budget.
141
+ *
142
+ * Ten attempts per quarter hour for one account from one address. A person
143
+ * who has forgotten which of their passwords this is tries three or four and
144
+ * then uses the reset link; ten is comfortably past that and still turns
145
+ * "as fast as the process answers" into forty an hour.
146
+ *
147
+ * The per-address ceiling is set for the honest worst case rather than the
148
+ * typical one, because a corporate NAT puts a whole office behind a single
149
+ * address and a morning sign-in surge must not be refused. 150 a quarter hour
150
+ * covers that while still bounding a caller who rotates email addresses to
151
+ * fifteen accounts' worth of attempts -- and it is the number an operator
152
+ * most likely wants to lower, which is what the environment variable is for.
153
+ * A limiter that fires on real users gets switched off, and a switched-off
154
+ * limiter bounds nothing.
155
+ */
156
+ const LOGIN_BUCKET = {
157
+ windowSeconds: parsePositiveIntFromEnv("IDENTITY_LOGIN_RATE_LIMIT_WINDOW_SECONDS", 15 * 60),
158
+ perAccountLimit: parsePositiveIntFromEnv("IDENTITY_LOGIN_RATE_LIMIT_PER_ACCOUNT_PER_WINDOW", 10),
159
+ perIpLimit: parsePositiveIntFromEnv("IDENTITY_LOGIN_RATE_LIMIT_PER_IP_PER_WINDOW", 150),
160
+ };
161
+ /*
162
+ * Second step budget.
163
+ *
164
+ * Same shape as the password bucket, and the same numbers, for a different
165
+ * reason: the code is read off a screen rather than recalled, so ten wrong
166
+ * ones in a quarter hour is already well past anything a real user does --
167
+ * a phone whose clock has drifted past the +/- 90 second window fails every
168
+ * time, and no number of retries fixes that.
169
+ *
170
+ * Kept as a SEPARATE bucket from the password one rather than a shared pool,
171
+ * which does mean a caller gets both budgets in a window. That is the price of
172
+ * the property that matters more: a burst of /login noise must not be able to
173
+ * refuse a user who is midway through finishing a two factor login, and a user
174
+ * being marched through a mandated enrolment must not be locked out of it by
175
+ * the /login attempt that sent them there.
176
+ *
177
+ * What ten buys against guessing: fourteen of the 10^6 codes are live at any
178
+ * instant, so forty guesses an hour is a ~0.06% chance of landing one in a
179
+ * day and about a year to reach even odds -- against an attacker who holds
180
+ * the account's password for that entire year and generates a visible failed
181
+ * attempt every ninety seconds throughout.
182
+ */
183
+ const TWO_FACTOR_BUCKET = {
184
+ windowSeconds: parsePositiveIntFromEnv("IDENTITY_TWO_FACTOR_RATE_LIMIT_WINDOW_SECONDS", 15 * 60),
185
+ perAccountLimit: parsePositiveIntFromEnv("IDENTITY_TWO_FACTOR_RATE_LIMIT_PER_ACCOUNT_PER_WINDOW", 10),
186
+ perIpLimit: parsePositiveIntFromEnv("IDENTITY_TWO_FACTOR_RATE_LIMIT_PER_IP_PER_WINDOW", 150),
187
+ };
188
+ const KEY_PREFIX = "identity:rl:";
189
+ /*
190
+ * Counter keys outlive their window by one full window, so a request landing
191
+ * on a boundary cannot read a key that was reclaimed mid-window.
192
+ */
193
+ const TTL_MULTIPLIER = 2;
194
+ /* Bounds a Redis key built from caller-supplied values. */
195
+ const MAX_KEY_SEGMENT_LENGTH = 64;
196
+ /* How often the "counter unavailable" condition may be logged, per bucket. */
197
+ const COUNTER_UNAVAILABLE_LOG_INTERVAL_MS = 60 * 1000;
198
+ class IdentityRateLimit {
199
+ /*
200
+ * The client address to bill this request to.
201
+ *
202
+ * Delegates to the shared ClientIp helper, which reads X-Forwarded-For from
203
+ * the trusted (right-hand) end under the instance-wide TRUSTED_PROXY_HOPS
204
+ * setting. Deliberately NOT Express.getClientIp: that one takes the LEFTMOST
205
+ * entry, which any caller can set by sending its own X-Forwarded-For header,
206
+ * and for a rate limiter that is fatal -- a fresh spoofed value per request
207
+ * is a fresh bucket per request and therefore no limit at all.
208
+ *
209
+ * The helper also normalizes ports, brackets and IPv4-mapped IPv6, so one
210
+ * caller cannot land in two different buckets depending on the form their
211
+ * address arrives in.
212
+ */
213
+ static resolveClientIp(req) {
214
+ const clientIp = resolveTrustedClientIp(req);
215
+ if (clientIp) {
216
+ return IdentityRateLimit.sanitizeKeySegment(clientIp);
217
+ }
218
+ /*
219
+ * Everything with no resolvable address shares one bucket. That is the
220
+ * conservative direction: an unidentifiable caller should not be handed a
221
+ * private allowance.
222
+ */
223
+ return "unknown";
224
+ }
225
+ /*
226
+ * The account this request is trying to authenticate as, as a key segment.
227
+ *
228
+ * The login page posts everything nested under `data` (see
229
+ * App/FeatureSet/Accounts/src/Pages/Login.tsx), which is where all four
230
+ * routes read the credentials from; the top level is checked too so that a
231
+ * caller posting the flatter shape is still counted rather than silently
232
+ * sharing the "none" bucket with everybody else.
233
+ *
234
+ * `email` ARRIVES IN TWO SHAPES, AND BOTH ARE FIRST-PARTY
235
+ *
236
+ * A bare string, and the serialized SerializableObject envelope
237
+ * `{ _type: "Email", value: "..." }` that Email.toJSON produces. Which one
238
+ * turns up depends on how the caller was written, and the shipped clients
239
+ * disagree with each other on the very routes limited here:
240
+ *
241
+ * - POST /login from the dashboard goes through ModelForm, which hands the
242
+ * model to ModelAPI.createOrUpdate, which sends
243
+ * JSONFunctions.serialize(BaseModel.toJSON(...)) -- the ENVELOPE.
244
+ * - POST /login from the mobile app hand-builds the same envelope
245
+ * (MobileApp/src/api/auth.ts).
246
+ * - POST /verify-totp-auth, /verify-totp-enrolment and
247
+ * /verify-webauthn-auth from the dashboard spread the raw form values
248
+ * (`...initialValues`), so there `email` is a bare STRING.
249
+ *
250
+ * The handler does not care, because BaseModel.fromJSON resolves both to the
251
+ * same address -- so this must not care either. Reading only the string form
252
+ * would put every /login from every shipped client into the shared "none"
253
+ * bucket, which is not a small mistake in either direction: the per-account
254
+ * counter would degenerate into a SECOND per-address counter at the much
255
+ * tighter per-account limit, refusing a whole office (or a carrier NAT) after
256
+ * ten sign-ins rather than the hundred and fifty the per-address ceiling is
257
+ * deliberately sized for; and, because the two shapes would key differently,
258
+ * an attacker could take the per-account budget twice by alternating them.
259
+ *
260
+ * The unwrap is deliberately not gated on `_type` being exactly Email. Any
261
+ * object carrying a string `value` is keyed by that value, which is the safe
262
+ * direction: the worst case is counting a request the handler will reject
263
+ * anyway against the bucket it names, whereas gating narrowly leaves another
264
+ * shape sitting in "none" for someone to spend.
265
+ *
266
+ * Lower-cased, because otherwise Bob@example.com and bob@example.com are
267
+ * two buckets for one account and case alone buys a fresh allowance. No
268
+ * attempt is made to validate the address: a well-formed one that belongs
269
+ * to nobody is worth exactly as much to an attacker as a malformed one, so
270
+ * there is nothing for a format check to separate. Normalizing is the part
271
+ * that matters.
272
+ */
273
+ static resolveAccountKey(req) {
274
+ var _a;
275
+ const body = req.body;
276
+ const data = body && typeof body["data"] === "object" && body["data"] !== null
277
+ ? body["data"]
278
+ : undefined;
279
+ const field = (_a = data === null || data === void 0 ? void 0 : data["email"]) !== null && _a !== void 0 ? _a : body === null || body === void 0 ? void 0 : body["email"];
280
+ /*
281
+ * Arrays are typeof "object" too, and indexing one by "value" is
282
+ * undefined rather than a throw -- but excluding them keeps the intent
283
+ * legible and stops a caller smuggling anything odd through.
284
+ */
285
+ const raw = field && typeof field === "object" && !Array.isArray(field)
286
+ ? field["value"]
287
+ : field;
288
+ /*
289
+ * `email` is whatever JSON the caller sent, so it is only a string
290
+ * because they chose to make it one. A number, a nested object or a
291
+ * missing field must land in a bucket rather than throw.
292
+ */
293
+ if (typeof raw !== "string" || raw.trim().length === 0) {
294
+ return "none";
295
+ }
296
+ return IdentityRateLimit.sanitizeKeySegment(raw.trim().toLowerCase());
297
+ }
298
+ static sanitizeKeySegment(value) {
299
+ return (value
300
+ .slice(0, MAX_KEY_SEGMENT_LENGTH)
301
+ /*
302
+ * Redis keys are binary safe, but a predictable charset keeps
303
+ * operational tooling (SCAN patterns, dashboards) sane.
304
+ */
305
+ .replace(/[^a-zA-Z0-9._:%\-[\]@]/g, "_"));
306
+ }
307
+ static getBucketConfig(bucket) {
308
+ return bucket === IdentityRateLimitBucket.TwoFactor
309
+ ? TWO_FACTOR_BUCKET
310
+ : LOGIN_BUCKET;
311
+ }
312
+ /*
313
+ * Increment both counters for this request and decide.
314
+ *
315
+ * Both INCRs go out in one pipeline so the common path costs a single round
316
+ * trip; the EXPIRE follow-ups only happen on the request that created a key.
317
+ */
318
+ static async consume(data) {
319
+ const client = Redis.getClient();
320
+ if (!client || !Redis.isConnected()) {
321
+ return { outcome: IdentityRateLimitOutcome.CounterUnavailable };
322
+ }
323
+ const config = IdentityRateLimit.getBucketConfig(data.bucket);
324
+ const windowMs = config.windowSeconds * 1000;
325
+ const windowIndex = Math.floor(Date.now() / windowMs);
326
+ const accountCounterKey = `${KEY_PREFIX}${data.bucket}:a:${data.accountKey}:${data.clientIp}:${windowIndex}`;
327
+ const ipCounterKey = `${KEY_PREFIX}${data.bucket}:i:${data.clientIp}:${windowIndex}`;
328
+ try {
329
+ const pipelineResults = (await client
330
+ .pipeline()
331
+ .incr(accountCounterKey)
332
+ .incr(ipCounterKey)
333
+ .exec());
334
+ if (!pipelineResults || pipelineResults.length < 2) {
335
+ throw new Error("Rate limit pipeline returned no result");
336
+ }
337
+ const accountCount = IdentityRateLimit.readCounterResult(pipelineResults[0]);
338
+ const ipCount = IdentityRateLimit.readCounterResult(pipelineResults[1]);
339
+ /*
340
+ * Set the expiry only on the write that created the key. Re-issuing
341
+ * EXPIRE on every increment would slide the window forward for as long
342
+ * as the attempts continue, so the counter would never reset and a
343
+ * caller who tripped the limit once could never recover -- which on a
344
+ * login route is a permanent lockout, not a slowdown.
345
+ */
346
+ const ttlSeconds = config.windowSeconds * TTL_MULTIPLIER;
347
+ const keysToExpire = [];
348
+ if (accountCount === 1) {
349
+ keysToExpire.push(accountCounterKey);
350
+ }
351
+ if (ipCount === 1) {
352
+ keysToExpire.push(ipCounterKey);
353
+ }
354
+ if (keysToExpire.length > 0) {
355
+ const expirePipeline = client.pipeline();
356
+ for (const key of keysToExpire) {
357
+ expirePipeline.expire(key, ttlSeconds);
358
+ }
359
+ await expirePipeline.exec();
360
+ }
361
+ const retryAfterSeconds = IdentityRateLimit.getSecondsUntilWindowEnd(config.windowSeconds);
362
+ /*
363
+ * The account counter is reported first when both are over, because it
364
+ * is the more specific of the two and the more useful thing to see in a
365
+ * log line.
366
+ */
367
+ if (accountCount > config.perAccountLimit) {
368
+ return {
369
+ outcome: IdentityRateLimitOutcome.RateLimited,
370
+ retryAfterSeconds,
371
+ scope: IdentityRateLimitScope.Account,
372
+ isFirstRejectionInWindow: accountCount === config.perAccountLimit + 1,
373
+ };
374
+ }
375
+ if (ipCount > config.perIpLimit) {
376
+ return {
377
+ outcome: IdentityRateLimitOutcome.RateLimited,
378
+ retryAfterSeconds,
379
+ scope: IdentityRateLimitScope.Ip,
380
+ isFirstRejectionInWindow: ipCount === config.perIpLimit + 1,
381
+ };
382
+ }
383
+ return { outcome: IdentityRateLimitOutcome.Allowed };
384
+ }
385
+ catch (err) {
386
+ /*
387
+ * Throttled: whatever broke Redis is unlikely to have broken it for one
388
+ * request only, and a per-request log line buries the incident it is
389
+ * reporting.
390
+ */
391
+ if (IdentityRateLimit.shouldLogCounterUnavailable(data.bucket)) {
392
+ logger.warn(`IdentityRateLimit: counter failed for ${data.bucket} request from ${data.clientIp}`);
393
+ logger.warn(err);
394
+ }
395
+ return { outcome: IdentityRateLimitOutcome.CounterUnavailable };
396
+ }
397
+ }
398
+ static readCounterResult(result) {
399
+ if (!result) {
400
+ throw new Error("Rate limit counter returned no result");
401
+ }
402
+ const [error, value] = result;
403
+ if (error) {
404
+ throw error;
405
+ }
406
+ if (typeof value !== "number") {
407
+ throw new Error("Rate limit counter returned a non-numeric value");
408
+ }
409
+ return value;
410
+ }
411
+ /*
412
+ * Remaining seconds in the current fixed window, so every rejected caller
413
+ * is told to come back when the window actually rolls rather than all
414
+ * backing off by the same constant and re-colliding.
415
+ */
416
+ static getSecondsUntilWindowEnd(windowSeconds) {
417
+ const windowMs = windowSeconds * 1000;
418
+ const msIntoWindow = Date.now() % windowMs;
419
+ return Math.max(1, Math.ceil((windowMs - msIntoWindow) / 1000));
420
+ }
421
+ /*
422
+ * Express middleware. Registered as the first handler on each credential
423
+ * route, so a flood is refused before it costs a user lookup -- and, on the
424
+ * password routes, before it costs the bcrypt verify that makes each guess
425
+ * expensive for us as well as for the attacker.
426
+ */
427
+ static getMiddleware(bucket) {
428
+ return async (req, res, next) => {
429
+ const accountKey = IdentityRateLimit.resolveAccountKey(req);
430
+ const clientIp = IdentityRateLimit.resolveClientIp(req);
431
+ const decision = await IdentityRateLimit.consume({
432
+ accountKey,
433
+ clientIp,
434
+ bucket,
435
+ });
436
+ if (decision.outcome === IdentityRateLimitOutcome.RateLimited) {
437
+ if (decision.retryAfterSeconds) {
438
+ IdentityRateLimit.setRetryAfterHeader(res, decision.retryAfterSeconds);
439
+ }
440
+ if (decision.isFirstRejectionInWindow) {
441
+ logger.warn(`IdentityRateLimit: rejected ${bucket} attempt for ${accountKey} from ${clientIp} (${decision.scope} limit)`);
442
+ }
443
+ /*
444
+ * The same message whichever counter fired, and whether or not the
445
+ * account exists. These routes are careful not to say which half of a
446
+ * credential was wrong; a limiter that answered differently for a real
447
+ * address than for an invented one would hand back the account
448
+ * enumeration the handlers withhold.
449
+ */
450
+ return Response.sendErrorResponse(req, res, new TooManyRequestsException("Too many sign-in attempts. Please try again later."));
451
+ }
452
+ if (decision.outcome === IdentityRateLimitOutcome.CounterUnavailable) {
453
+ /*
454
+ * Fails closed. See the note at the top of this file: the counter is
455
+ * the only thing bounding guesses on these routes, and a login cannot
456
+ * complete without Redis anyway.
457
+ */
458
+ if (IdentityRateLimit.shouldLogCounterUnavailable(bucket)) {
459
+ logger.error(`IdentityRateLimit: rate limit counter unavailable, refusing ${bucket} attempts`);
460
+ }
461
+ return Response.sendErrorResponse(req, res, new ServiceUnavailableException("Unable to sign you in right now. Please try again shortly."));
462
+ }
463
+ return next();
464
+ };
465
+ }
466
+ /*
467
+ * A Redis outage means EVERY request takes the unavailable path, so an
468
+ * unguarded log line there is one per request for as long as the outage
469
+ * lasts -- the same log-flooding problem the crossing-only rejection log
470
+ * avoids, but continuous. One line per bucket per interval is enough to
471
+ * make the condition visible without burying everything else.
472
+ */
473
+ static shouldLogCounterUnavailable(bucket) {
474
+ const now = Date.now();
475
+ const lastLoggedAt = IdentityRateLimit.counterUnavailableLastLoggedAt.get(bucket) || 0;
476
+ if (now - lastLoggedAt < COUNTER_UNAVAILABLE_LOG_INTERVAL_MS) {
477
+ return false;
478
+ }
479
+ IdentityRateLimit.counterUnavailableLastLoggedAt.set(bucket, now);
480
+ return true;
481
+ }
482
+ static setRetryAfterHeader(res, retryAfterSeconds) {
483
+ const setHeader = res["setHeader"];
484
+ if (typeof setHeader === "function") {
485
+ setHeader.call(res, "Retry-After", String(retryAfterSeconds));
486
+ }
487
+ }
488
+ }
489
+ IdentityRateLimit.counterUnavailableLastLoggedAt = new Map();
490
+ export default IdentityRateLimit;
491
+ //# sourceMappingURL=IdentityRateLimit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityRateLimit.js","sourceRoot":"","sources":["../../../../Server/Middleware/IdentityRateLimit.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,17 @@ import { SlackAppSigningSecret } from "../EnvironmentConfig";
13
13
  import crypto from "crypto";
14
14
  import logger, { getLogAttributesFromRequest } from "../Utils/Logger";
15
15
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
16
+ /*
17
+ * Slack sends the digest as "v0=" followed by the 64 hex characters of a
18
+ * SHA-256 HMAC. Same reasoning as WhatsAppAuthorization: the header is
19
+ * attacker-controlled on an endpoint whose only authentication IS the
20
+ * signature, and crypto.timingSafeEqual throws RangeError on a length
21
+ * mismatch instead of returning false, so the shape is validated before the
22
+ * comparison. A missing header is covered by the same check - it used to
23
+ * reach Buffer.from(undefined) and throw a TypeError.
24
+ */
25
+ const SIGNATURE_PREFIX = "v0=";
26
+ const HEX_DIGEST_REGEX = /^[a-f0-9]{64}$/i;
16
27
  export default class SlackAuthorization {
17
28
  static async isAuthorizedSlackRequest(req, res, next) {
18
29
  logger.debug("Starting Slack request authorization", getLogAttributesFromRequest(req));
@@ -32,11 +43,24 @@ export default class SlackAuthorization {
32
43
  logger.debug(`timestamp: ${timestamp}`, getLogAttributesFromRequest(req));
33
44
  logger.debug(`requestBody: `, getLogAttributesFromRequest(req));
34
45
  logger.debug(requestBody, getLogAttributesFromRequest(req));
46
+ const providedDigest = slackSignature && slackSignature.startsWith(SIGNATURE_PREFIX)
47
+ ? slackSignature.slice(SIGNATURE_PREFIX.length)
48
+ : "";
49
+ if (!HEX_DIGEST_REGEX.test(providedDigest)) {
50
+ logger.error("Slack request has a missing or malformed X-Slack-Signature header.", getLogAttributesFromRequest(req));
51
+ return Response.sendErrorResponse(req, res, new BadDataException("Slack Signature Verification Failed."));
52
+ }
35
53
  const baseString = `v0:${timestamp}:${requestBody}`;
36
- const signature = `v0=${crypto.createHmac("sha256", slackSigningSecret).update(baseString).digest("hex")}`;
37
- logger.debug(`Generated signature: ${signature}`, getLogAttributesFromRequest(req));
38
- // check if the signature is valid
39
- if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(slackSignature))) {
54
+ const expectedDigest = crypto
55
+ .createHmac("sha256", slackSigningSecret)
56
+ .update(baseString)
57
+ .digest("hex");
58
+ logger.debug(`Generated signature: ${SIGNATURE_PREFIX}${expectedDigest}`, getLogAttributesFromRequest(req));
59
+ /*
60
+ * Both sides are decoded from 64 validated hex characters, so both
61
+ * buffers are 32 bytes and timingSafeEqual cannot throw here.
62
+ */
63
+ if (!crypto.timingSafeEqual(Buffer.from(expectedDigest, "hex"), Buffer.from(providedDigest, "hex"))) {
40
64
  logger.error("Slack Signature Verification Failed.", getLogAttributesFromRequest(req));
41
65
  return Response.sendErrorResponse(req, res, new BadDataException("Slack Signature Verification Failed."));
42
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SlackAuthorization.js","sourceRoot":"","sources":["../../../../Server/Middleware/SlackAuthorization.ts"],"names":[],"mappings":";;;;;;;;;AAKA,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,gBAAgB,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,MAAM,EAAE,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,WAAW,MAAM,gCAAgC,CAAC;AAEzD,MAAM,CAAC,OAAO,OAAO,kBAAkB;IAEjB,AAAb,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAC1C,GAAqB,EACrB,GAAoB,EACpB,IAAkB;QAElB,MAAM,CAAC,KAAK,CACV,sCAAsC,EACtC,2BAA2B,CAAC,GAAG,CAAC,CACjC,CAAC;QAEF,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CACV,kDAAkD,EAClD,2BAA2B,CAAC,GAAG,CAAC,CACjC,CAAC;YACF,OAAO,QAAQ,CAAC,iBAAiB,CAC/B,GAAG,EACH,GAAG,EACH,IAAI,gBAAgB,CAClB,kDAAkD,CACnD,CACF,CAAC;QACJ,CAAC;QAED,gCAAgC;QAChC,MAAM,kBAAkB,GAAW,qBAAqB,CAAC,QAAQ,EAAE,CAAC;QAEpE,MAAM,cAAc,GAAW,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAW,CAAC;QAC1E,MAAM,SAAS,GAAW,GAAG,CAAC,OAAO,CACnC,2BAA2B,CAClB,CAAC;QACZ,mHAAmH;QACnH,MAAM,WAAW,GACd,GAAwB,CAAC,OAAO;YAChC,GAAwB,CAAC,qBAAqB;YAC/C,EAAE,CAAC;QAEL,MAAM,CAAC,KAAK,CACV,mBAAmB,cAAc,EAAE,EACnC,2BAA2B,CAAC,GAAG,CAAC,CACjC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,cAAc,SAAS,EAAE,EAAE,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC;QAE5D,MAAM,UAAU,GAAW,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAW,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAEnH,MAAM,CAAC,KAAK,CACV,wBAAwB,SAAS,EAAE,EACnC,2BAA2B,CAAC,GAAG,CAAC,CACjC,CAAC;QAEF,kCAAkC;QAClC,IACE,CAAC,MAAM,CAAC,eAAe,CACrB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAe,EACpC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAe,CAC1C,EACD,CAAC;YACD,MAAM,CAAC,KAAK,CACV,sCAAsC,EACtC,2BAA2B,CAAC,GAAG,CAAC,CACjC,CAAC;YACF,OAAO,QAAQ,CAAC,iBAAiB,CAC/B,GAAG,EACH,GAAG,EACH,IAAI,gBAAgB,CAAC,sCAAsC,CAAC,CAC7D,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,KAAK,CACV,uCAAuC,EACvC,2BAA2B,CAAC,GAAG,CAAC,CACjC,CAAC;QACF,IAAI,EAAE,CAAC;IACT,CAAC;CACF;AA7EqB;IADnB,WAAW,EAAE;;;;wDA6Eb"}
1
+ {"version":3,"file":"SlackAuthorization.js","sourceRoot":"","sources":["../../../../Server/Middleware/SlackAuthorization.ts"],"names":[],"mappings":"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"}