opal-security 3.1.1-beta.65d1a96 → 3.1.1-beta.e5e99da

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,7 +22,7 @@ $ npm install -g opal-security
22
22
  $ opal COMMAND
23
23
  running command...
24
24
  $ opal (--version)
25
- opal-security/3.1.1-beta.65d1a96 linux-x64 node-v20.19.1
25
+ opal-security/3.1.1-beta.e5e99da linux-x64 node-v20.19.1
26
26
  $ opal --help [COMMAND]
27
27
  USAGE
28
28
  $ opal COMMAND
@@ -101,7 +101,7 @@ EXAMPLES
101
101
  $ opal aws:identity
102
102
  ```
103
103
 
104
- _See code: [src/commands/aws/identity.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/aws/identity.ts)_
104
+ _See code: [src/commands/aws/identity.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/aws/identity.ts)_
105
105
 
106
106
  ## `opal clear-auth-provider`
107
107
 
@@ -121,7 +121,7 @@ EXAMPLES
121
121
  $ opal clear-auth-provider
122
122
  ```
123
123
 
124
- _See code: [src/commands/clear-auth-provider.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/clear-auth-provider.ts)_
124
+ _See code: [src/commands/clear-auth-provider.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/clear-auth-provider.ts)_
125
125
 
126
126
  ## `opal curl-example`
127
127
 
@@ -138,7 +138,7 @@ DESCRIPTION
138
138
  Prints out an example cURL command containing the parameters the CLI uses to query the Opal server.
139
139
  ```
140
140
 
141
- _See code: [src/commands/curl-example.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/curl-example.ts)_
141
+ _See code: [src/commands/curl-example.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/curl-example.ts)_
142
142
 
143
143
  ## `opal groups get`
144
144
 
@@ -159,7 +159,7 @@ EXAMPLES
159
159
  $ opal groups:get --id 54052a3e-5375-4392-aeaf-0c6c44c131d4
160
160
  ```
161
161
 
162
- _See code: [src/commands/groups/get.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/groups/get.ts)_
162
+ _See code: [src/commands/groups/get.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/groups/get.ts)_
163
163
 
164
164
  ## `opal help [COMMANDS]`
165
165
 
@@ -209,7 +209,7 @@ EXAMPLES
209
209
  $ opal iam-roles:start --id 51f7176b-0464-4a6f-8369-e951e187b398 --profileName "custom-profile"
210
210
  ```
211
211
 
212
- _See code: [src/commands/iam-roles/start.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/iam-roles/start.ts)_
212
+ _See code: [src/commands/iam-roles/start.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/iam-roles/start.ts)_
213
213
 
214
214
  ## `opal kube-roles start`
215
215
 
@@ -240,7 +240,7 @@ EXAMPLES
240
240
  $ opal kube-roles:start --id 51f7176b-0464-4a6f-8369-e951e187b398 --accessLevelRemoteId "arn:aws:iam::712234975475:role/acme-eks-cluster-admin-role"
241
241
  ```
242
242
 
243
- _See code: [src/commands/kube-roles/start.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/kube-roles/start.ts)_
243
+ _See code: [src/commands/kube-roles/start.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/kube-roles/start.ts)_
244
244
 
245
245
  ## `opal login`
246
246
 
@@ -261,7 +261,7 @@ EXAMPLES
261
261
  $ opal login
262
262
  ```
263
263
 
264
- _See code: [src/commands/login.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/login.ts)_
264
+ _See code: [src/commands/login.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/login.ts)_
265
265
 
266
266
  ## `opal logout`
267
267
 
@@ -281,7 +281,7 @@ EXAMPLES
281
281
  $ opal logout
282
282
  ```
283
283
 
284
- _See code: [src/commands/logout.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/logout.ts)_
284
+ _See code: [src/commands/logout.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/logout.ts)_
285
285
 
286
286
  ## `opal postgres-instances start`
287
287
 
@@ -318,7 +318,7 @@ EXAMPLES
318
318
  $ opal postgres-instances:start --id 51f7176b-0464-4a6f-8369-e951e187b398 --accessLevelRemoteId fullaccess --action view
319
319
  ```
320
320
 
321
- _See code: [src/commands/postgres-instances/start.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/postgres-instances/start.ts)_
321
+ _See code: [src/commands/postgres-instances/start.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/postgres-instances/start.ts)_
322
322
 
323
323
  ## `opal resources get`
324
324
 
@@ -339,7 +339,7 @@ EXAMPLES
339
339
  $ opal resources:get --id 54052a3e-5375-4392-aeaf-0c6c44c131d4
340
340
  ```
341
341
 
342
- _See code: [src/commands/resources/get.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/resources/get.ts)_
342
+ _See code: [src/commands/resources/get.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/resources/get.ts)_
343
343
 
344
344
  ## `opal set-auth-provider`
345
345
 
@@ -365,7 +365,7 @@ EXAMPLES
365
365
  $ opal set-auth-provider --clientID 1234asdf --issuerUrl https://auth.example.com
366
366
  ```
367
367
 
368
- _See code: [src/commands/set-auth-provider.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/set-auth-provider.ts)_
368
+ _See code: [src/commands/set-auth-provider.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/set-auth-provider.ts)_
369
369
 
370
370
  ## `opal set-custom-header`
371
371
 
@@ -386,7 +386,7 @@ EXAMPLES
386
386
  $ opal set-custom-header --header 'cf-access-token: $TOKEN'
387
387
  ```
388
388
 
389
- _See code: [src/commands/set-custom-header.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/set-custom-header.ts)_
389
+ _See code: [src/commands/set-custom-header.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/set-custom-header.ts)_
390
390
 
391
391
  ## `opal set-token`
392
392
 
@@ -406,7 +406,7 @@ EXAMPLES
406
406
  $ opal set-token
407
407
  ```
408
408
 
409
- _See code: [src/commands/set-token.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/set-token.ts)_
409
+ _See code: [src/commands/set-token.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/set-token.ts)_
410
410
 
411
411
  ## `opal set-url [URL]`
412
412
 
@@ -430,7 +430,7 @@ EXAMPLES
430
430
  $ opal set-url
431
431
  ```
432
432
 
433
- _See code: [src/commands/set-url.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/set-url.ts)_
433
+ _See code: [src/commands/set-url.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/set-url.ts)_
434
434
 
435
435
  ## `opal ssh copyFrom`
436
436
 
@@ -461,7 +461,7 @@ EXAMPLES
461
461
  $ opal ssh:copyFrom --src instance/dir --dest my/dir --id 51f7176b-0464-4a6f-8369-e951e187b398
462
462
  ```
463
463
 
464
- _See code: [src/commands/ssh/copyFrom.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/ssh/copyFrom.ts)_
464
+ _See code: [src/commands/ssh/copyFrom.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/ssh/copyFrom.ts)_
465
465
 
466
466
  ## `opal ssh copyTo`
467
467
 
@@ -492,7 +492,7 @@ EXAMPLES
492
492
  $ opal ssh:copyTo --src my/dir --dest instance/dir --id 51f7176b-0464-4a6f-8369-e951e187b398
493
493
  ```
494
494
 
495
- _See code: [src/commands/ssh/copyTo.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/ssh/copyTo.ts)_
495
+ _See code: [src/commands/ssh/copyTo.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/ssh/copyTo.ts)_
496
496
 
497
497
  ## `opal ssh start`
498
498
 
@@ -519,7 +519,7 @@ EXAMPLES
519
519
  $ opal ssh:start --id 51f7176b-0464-4a6f-8369-e951e187b398
520
520
  ```
521
521
 
522
- _See code: [src/commands/ssh/start.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.65d1a96/src/commands/ssh/start.ts)_
522
+ _See code: [src/commands/ssh/start.ts](https://github.com/opalsecurity/opal-cli/blob/v3.1.1-beta.e5e99da/src/commands/ssh/start.ts)_
523
523
 
524
524
  ## `opal version`
525
525
 
@@ -10,24 +10,26 @@ class RequestCreate extends core_1.Command {
10
10
  await (0, apollo_1.initClient)(this, true);
11
11
  const client = await (0, apollo_1.getClient)(this, true);
12
12
  (0, utils_1.restrictToDev)(); //TODO: Remove after development is complete
13
- const requestMap = new Map();
13
+ const metadata = (0, requests_1.createEmptyRequestMetadata)();
14
14
  (0, displays_1.headerMessage)(this);
15
15
  let shouldProceed = false;
16
16
  while (!shouldProceed) {
17
17
  // Step 1: Select first round of assets from an app
18
- await (0, requests_1.selectRequestableItems)(this, client, requestMap);
18
+ await (0, requests_1.selectRequestableItems)(this, client, metadata.requestMap);
19
19
  // Step 2: Display the selected items in a tree format
20
20
  (0, displays_1.headerMessage)(this);
21
- this.log((0, displays_1.treeifyRequestMap)(requestMap), "\n");
21
+ this.log((0, displays_1.treeifyRequestMap)(metadata.requestMap), "\n");
22
22
  // Step 3: Prompt to add more items, repeat 1-3 if needed
23
23
  shouldProceed = await (0, requests_1.doneSelectingAssets)();
24
24
  }
25
+ // Step 4: Set Request Defaults
26
+ await (0, requests_1.setRequestDefaults)(this, client, metadata);
25
27
  // Step 4: Prompt for request reason
26
- const { reason } = await (0, requests_1.promptForReason)();
28
+ const { reason } = await (0, requests_1.promptForReason)(metadata);
27
29
  // Step 5: Prompt for expiration
28
- const { expiration } = await (0, requests_1.promptForExpiration)();
30
+ const { expiration } = await (0, requests_1.promptForExpiration)(metadata);
29
31
  // Step 6: Display final summary of request
30
- (0, displays_1.displayFinalRequestSummary)(this, requestMap, reason, expiration);
32
+ (0, displays_1.displayFinalRequestSummary)(this, metadata.requestMap, reason, expiration.label);
31
33
  // Step 7: Prompt for final submition
32
34
  await (0, requests_1.submitFinalRequest)(this);
33
35
  }
@@ -18,6 +18,7 @@ type Documents = {
18
18
  '\n query GetRequestableAppsQuery($searchQuery: String) {\n appsV2(\n filters: {\n access: REQUESTABLE\n searchQuery: $searchQuery\n }\n ) @connection(key: "paginated-app-dropdown") {\n edges {\n node {\n id\n displayName\n ... on Connection {\n connectionType\n }\n ... on Resource {\n resourceType\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n ': typeof types.GetRequestableAppsQueryDocument;
19
19
  "\n query PaginatedEntityDropdown(\n $id: UUID!\n $searchQuery: String\n) {\n app(id: $id) {\n __typename\n ... on App {\n id\n items(\n input: {\n access: REQUESTABLE\n searchQuery: $searchQuery\n includeOnlyRequestable: true\n }\n ) {\n items {\n key\n resource {\n id\n name\n }\n group {\n id\n name\n }\n }\n cursor\n }\n }\n ... on AppNotFoundError {\n message\n }\n }\n}\n": typeof types.PaginatedEntityDropdownDocument;
20
20
  "\n query ResourceAccessLevels($resourceId: ResourceId!) {\n accessLevels(input: {\n resourceId: $resourceId,\n onlyMine: false,\n }) {\n __typename\n ... on ResourceAccessLevelsResult {\n accessLevels {\n __typename\n ... on ResourceAccessLevel {\n accessLevelName\n accessLevelRemoteId\n }\n }\n }\n ... on ResourceNotFoundError {\n message\n }\n }\n }\n": typeof types.ResourceAccessLevelsDocument;
21
+ "\n query RequestDefaults(\n $requestedResources: [RequestConfigurationResourceInput!]!\n $requestedGroups: [RequestConfigurationGroupInput!]!\n ) {\n requestDefaults(input: {\n requestedResources: $requestedResources,\n requestedGroups: $requestedGroups,\n }\n ) {\n durationOptions {\n durationInMinutes\n label\n }\n recommendedDurationInMinutes\n defaultDurationInMinutes\n maxDurationInMinutes\n requireSupportTicket\n reasonOptional\n requesterIsAdmin\n }\n }": typeof types.RequestDefaultsDocument;
21
22
  };
22
23
  declare const documents: Documents;
23
24
  /**
@@ -57,5 +58,9 @@ export declare function graphql(source: "\n query PaginatedEntityDropdown(\n $
57
58
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
58
59
  */
59
60
  export declare function graphql(source: "\n query ResourceAccessLevels($resourceId: ResourceId!) {\n accessLevels(input: {\n resourceId: $resourceId,\n onlyMine: false,\n }) {\n __typename\n ... on ResourceAccessLevelsResult {\n accessLevels {\n __typename\n ... on ResourceAccessLevel {\n accessLevelName\n accessLevelRemoteId\n }\n }\n }\n ... on ResourceNotFoundError {\n message\n }\n }\n }\n"): (typeof documents)["\n query ResourceAccessLevels($resourceId: ResourceId!) {\n accessLevels(input: {\n resourceId: $resourceId,\n onlyMine: false,\n }) {\n __typename\n ... on ResourceAccessLevelsResult {\n accessLevels {\n __typename\n ... on ResourceAccessLevel {\n accessLevelName\n accessLevelRemoteId\n }\n }\n }\n ... on ResourceNotFoundError {\n message\n }\n }\n }\n"];
61
+ /**
62
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
63
+ */
64
+ export declare function graphql(source: "\n query RequestDefaults(\n $requestedResources: [RequestConfigurationResourceInput!]!\n $requestedGroups: [RequestConfigurationGroupInput!]!\n ) {\n requestDefaults(input: {\n requestedResources: $requestedResources,\n requestedGroups: $requestedGroups,\n }\n ) {\n durationOptions {\n durationInMinutes\n label\n }\n recommendedDurationInMinutes\n defaultDurationInMinutes\n maxDurationInMinutes\n requireSupportTicket\n reasonOptional\n requesterIsAdmin\n }\n }"): (typeof documents)["\n query RequestDefaults(\n $requestedResources: [RequestConfigurationResourceInput!]!\n $requestedGroups: [RequestConfigurationGroupInput!]!\n ) {\n requestDefaults(input: {\n requestedResources: $requestedResources,\n requestedGroups: $requestedGroups,\n }\n ) {\n durationOptions {\n durationInMinutes\n label\n }\n recommendedDurationInMinutes\n defaultDurationInMinutes\n maxDurationInMinutes\n requireSupportTicket\n reasonOptional\n requesterIsAdmin\n }\n }"];
60
65
  export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<infer TType, any> ? TType : never;
61
66
  export {};
@@ -10,6 +10,7 @@ const documents = {
10
10
  '\n query GetRequestableAppsQuery($searchQuery: String) {\n appsV2(\n filters: {\n access: REQUESTABLE\n searchQuery: $searchQuery\n }\n ) @connection(key: "paginated-app-dropdown") {\n edges {\n node {\n id\n displayName\n ... on Connection {\n connectionType\n }\n ... on Resource {\n resourceType\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n ': types.GetRequestableAppsQueryDocument,
11
11
  "\n query PaginatedEntityDropdown(\n $id: UUID!\n $searchQuery: String\n) {\n app(id: $id) {\n __typename\n ... on App {\n id\n items(\n input: {\n access: REQUESTABLE\n searchQuery: $searchQuery\n includeOnlyRequestable: true\n }\n ) {\n items {\n key\n resource {\n id\n name\n }\n group {\n id\n name\n }\n }\n cursor\n }\n }\n ... on AppNotFoundError {\n message\n }\n }\n}\n": types.PaginatedEntityDropdownDocument,
12
12
  "\n query ResourceAccessLevels($resourceId: ResourceId!) {\n accessLevels(input: {\n resourceId: $resourceId,\n onlyMine: false,\n }) {\n __typename\n ... on ResourceAccessLevelsResult {\n accessLevels {\n __typename\n ... on ResourceAccessLevel {\n accessLevelName\n accessLevelRemoteId\n }\n }\n }\n ... on ResourceNotFoundError {\n message\n }\n }\n }\n": types.ResourceAccessLevelsDocument,
13
+ "\n query RequestDefaults(\n $requestedResources: [RequestConfigurationResourceInput!]!\n $requestedGroups: [RequestConfigurationGroupInput!]!\n ) {\n requestDefaults(input: {\n requestedResources: $requestedResources,\n requestedGroups: $requestedGroups,\n }\n ) {\n durationOptions {\n durationInMinutes\n label\n }\n recommendedDurationInMinutes\n defaultDurationInMinutes\n maxDurationInMinutes\n requireSupportTicket\n reasonOptional\n requesterIsAdmin\n }\n }": types.RequestDefaultsDocument,
13
14
  };
14
15
  function graphql(source) {
15
16
  var _a;
@@ -571,6 +571,7 @@ export type AccessLevelsFiltersInput = {
571
571
  };
572
572
  export declare enum AccessOption {
573
573
  All = "ALL",
574
+ Manageable = "MANAGEABLE",
574
575
  Mine = "MINE",
575
576
  Requestable = "REQUESTABLE",
576
577
  /** @deprecated no longer supported */
@@ -626,6 +627,7 @@ export type AccessReview = Node & RolePermissionTargetEntity & {
626
627
  stoppedByUserId?: Maybe<Scalars["UserId"]["output"]>;
627
628
  stoppedDate?: Maybe<Scalars["Time"]["output"]>;
628
629
  timeZone: Scalars["String"]["output"];
630
+ updatedAt: Scalars["Time"]["output"];
629
631
  usersToReview: UserConnection;
630
632
  };
631
633
  export type AccessReviewUsersToReviewArgs = {
@@ -1477,7 +1479,11 @@ export type AccessReviewUsersResult = {
1477
1479
  accessReviewUsers: Array<AccessReviewUser>;
1478
1480
  };
1479
1481
  export type AccessReviewsInput = {
1480
- ongoingOnly?: InputMaybe<Scalars["Boolean"]["input"]>;
1482
+ /**
1483
+ * status filter: by default, accessReviews will return ALL access reviews for
1484
+ * the org, otherwise it will only return access reviews with the given status
1485
+ */
1486
+ status?: InputMaybe<AccessReviewStatus>;
1481
1487
  };
1482
1488
  export type AccessReviewsOutput = AccessReviewsResult;
1483
1489
  export type AccessReviewsResult = {
@@ -1499,6 +1505,11 @@ export declare enum AccessRuleStatus {
1499
1505
  Paused = "PAUSED",
1500
1506
  PausedByFailsafe = "PAUSED_BY_FAILSAFE"
1501
1507
  }
1508
+ export type AccessScope = {
1509
+ createdAfter?: InputMaybe<Scalars["Time"]["input"]>;
1510
+ expiresAfter?: InputMaybe<Scalars["Time"]["input"]>;
1511
+ vulnerabilities?: InputMaybe<Array<RecommendationsSubscoreType>>;
1512
+ };
1502
1513
  export type AccessStats = {
1503
1514
  managerAccessCount?: Maybe<Scalars["Int"]["output"]>;
1504
1515
  teamAccessCount?: Maybe<Scalars["Int"]["output"]>;
@@ -3749,6 +3760,13 @@ export type DenyRequestResult = {
3749
3760
  __typename?: "DenyRequestResult";
3750
3761
  request: Request;
3751
3762
  };
3763
+ export type DirectRoleAssignmentsInput = {
3764
+ after?: InputMaybe<Scalars["String"]["input"]>;
3765
+ first?: InputMaybe<Scalars["Int"]["input"]>;
3766
+ scope: RoleAssignmentScope;
3767
+ sortBy?: InputMaybe<RoleAssignmentsSortBy>;
3768
+ source?: UiSource;
3769
+ };
3752
3770
  export type DismissGroupBindingSuggestionsInput = {
3753
3771
  ids: Array<Scalars["GroupBindingSuggestionId"]["input"]>;
3754
3772
  };
@@ -3833,6 +3851,15 @@ export type EntityIdTupleInput = {
3833
3851
  entityId: Scalars["UUID"]["input"];
3834
3852
  entityType: EntityType;
3835
3853
  };
3854
+ export type EntityScope = {
3855
+ entityIDs?: InputMaybe<Array<Scalars["EntityId"]["input"]>>;
3856
+ entitySubtypes?: InputMaybe<EntitySubtypes>;
3857
+ entityTypes?: InputMaybe<Array<EntityType>>;
3858
+ };
3859
+ export type EntitySubtypes = {
3860
+ groupTypes?: InputMaybe<Array<GroupType>>;
3861
+ resourceTypes?: InputMaybe<Array<ResourceType>>;
3862
+ };
3836
3863
  export declare enum EntityType {
3837
3864
  AccessLevel = "ACCESS_LEVEL",
3838
3865
  AccessReview = "ACCESS_REVIEW",
@@ -4295,6 +4322,7 @@ export declare enum EventType {
4295
4322
  RoleAssignmentsDeleted = "ROLE_ASSIGNMENTS_DELETED",
4296
4323
  RoleAssignmentsUpdated = "ROLE_ASSIGNMENTS_UPDATED",
4297
4324
  SessionsCreatedForResources = "SESSIONS_CREATED_FOR_RESOURCES",
4325
+ SoonToExpireNotification = "SOON_TO_EXPIRE_NOTIFICATION",
4298
4326
  ThirdPartyIntegrationCreated = "THIRD_PARTY_INTEGRATION_CREATED",
4299
4327
  ThirdPartyIntegrationDeleted = "THIRD_PARTY_INTEGRATION_DELETED",
4300
4328
  ToxicSetViolationsCreated = "TOXIC_SET_VIOLATIONS_CREATED",
@@ -4488,7 +4516,6 @@ export declare enum GeneralSettingType {
4488
4516
  AutoMergeUsersByEmail = "AUTO_MERGE_USERS_BY_EMAIL",
4489
4517
  DisableNonAdminLogins = "DISABLE_NON_ADMIN_LOGINS",
4490
4518
  GlobalRequesterRole = "GLOBAL_REQUESTER_ROLE",
4491
- LogRocketDisabled = "LOG_ROCKET_DISABLED",
4492
4519
  NestedGroups = "NESTED_GROUPS",
4493
4520
  RequireManagerCc = "REQUIRE_MANAGER_CC",
4494
4521
  RequireOpalMfaForLogins = "REQUIRE_OPAL_MFA_FOR_LOGINS",
@@ -5108,6 +5135,7 @@ export type GroupUser = {
5108
5135
  __typename?: "GroupUser";
5109
5136
  access?: Maybe<GroupUserAccess>;
5110
5137
  accessLevel?: Maybe<GroupAccessLevel>;
5138
+ accessStats?: Maybe<AccessStats>;
5111
5139
  group?: Maybe<Group>;
5112
5140
  groupId: Scalars["GroupId"]["output"];
5113
5141
  lastUsedAt?: Maybe<Scalars["Time"]["output"]>;
@@ -5923,6 +5951,7 @@ export type Mutation = {
5923
5951
  createEventFilter: CreateEventFilterOutput;
5924
5952
  createEventStream: CreateEventStreamOutput;
5925
5953
  createFirstPartyToken: CreateFirstPartyTokenOutput;
5954
+ /** @deprecated Use createItems instead. */
5926
5955
  createGroup: CreateGroupOutput;
5927
5956
  createGroupBindings: CreateGroupBindingsOutput;
5928
5957
  createIdpConnection: CreateIdpConnectionOutput;
@@ -6069,7 +6098,6 @@ export type Mutation = {
6069
6098
  updateResourceCustomAccessLevel: UpdateResourceCustomAccessLevelOutput;
6070
6099
  updateResourceUserReviewers: UpdateResourceUserReviewersOutput;
6071
6100
  updateResourceUsers: UpdateResourceUsersOutput;
6072
- updateResourceVisibilityGroups: UpdateResourceVisibilityGroupsOutput;
6073
6101
  /** @deprecated Use bulkUpdateItems instead. */
6074
6102
  updateResources: UpdateResourcesOutput;
6075
6103
  updateRoleAssignments: UpdateRoleAssignmentsOutput;
@@ -6566,9 +6594,6 @@ export type MutationUpdateResourceUserReviewersArgs = {
6566
6594
  export type MutationUpdateResourceUsersArgs = {
6567
6595
  input: UpdateResourceUsersInput;
6568
6596
  };
6569
- export type MutationUpdateResourceVisibilityGroupsArgs = {
6570
- input: UpdateResourceVisibilityGroupsInput;
6571
- };
6572
6597
  export type MutationUpdateResourcesArgs = {
6573
6598
  input: UpdateResourcesInput;
6574
6599
  };
@@ -7194,6 +7219,10 @@ export type PrincipalEdge = Edge & {
7194
7219
  cursor: Scalars["String"]["output"];
7195
7220
  node: Principal;
7196
7221
  };
7222
+ export type PrincipalScope = {
7223
+ principalIDs?: InputMaybe<Array<Scalars["PrincipalId"]["input"]>>;
7224
+ principalTypes?: InputMaybe<Array<EntityType>>;
7225
+ };
7197
7226
  export type PrincipalSearchOptions = {
7198
7227
  excludeUsersWithoutPosition: Scalars["Boolean"]["input"];
7199
7228
  };
@@ -7213,9 +7242,11 @@ export type PrincipalsResult = {
7213
7242
  };
7214
7243
  export type PropagationStatus = {
7215
7244
  __typename?: "PropagationStatus";
7245
+ accessLevelRemoteId: Scalars["AccessLevelRemoteId"]["output"];
7246
+ entityId: Scalars["EntityId"]["output"];
7216
7247
  errorMessage?: Maybe<Scalars["String"]["output"]>;
7217
7248
  lastSynced: Scalars["Time"]["output"];
7218
- roleAssignmentId: Scalars["RoleAssignmentId"]["output"];
7249
+ principalId: Scalars["EntityId"]["output"];
7219
7250
  statusCode: PropagationStatusCode;
7220
7251
  taskType: PropagationTaskType;
7221
7252
  };
@@ -7410,6 +7441,7 @@ export type Query = {
7410
7441
  countFilteredGroups: CountFilteredGroupsOutput;
7411
7442
  countFilteredResources: CountFilteredResourcesOutput;
7412
7443
  currentUserStats: CurrentUserStatsOutput;
7444
+ directRoleAssignments: RoleAssignmentConnection;
7413
7445
  entitiesForRiskScoreRange: EntitiesForRiskScoreRangeResult;
7414
7446
  entityForRemediation: RecommendationsEntity;
7415
7447
  event: EventOutput;
@@ -7682,6 +7714,9 @@ export type QueryCountFilteredGroupsArgs = {
7682
7714
  export type QueryCountFilteredResourcesArgs = {
7683
7715
  input: CountFilteredResourcesInput;
7684
7716
  };
7717
+ export type QueryDirectRoleAssignmentsArgs = {
7718
+ input?: InputMaybe<DirectRoleAssignmentsInput>;
7719
+ };
7685
7720
  export type QueryEntitiesForRiskScoreRangeArgs = {
7686
7721
  maxRiskScore: Scalars["Int"]["input"];
7687
7722
  minRiskScore: Scalars["Int"]["input"];
@@ -8450,7 +8485,7 @@ export type RequestDefaults = {
8450
8485
  export type RequestDefaultsInput = {
8451
8486
  requestedGroups: Array<RequestConfigurationGroupInput>;
8452
8487
  requestedResources: Array<RequestConfigurationResourceInput>;
8453
- targetUserId: Scalars["UserId"]["input"];
8488
+ targetUserId?: InputMaybe<Scalars["UserId"]["input"]>;
8454
8489
  };
8455
8490
  export type RequestDurationTooLargeError = Error & {
8456
8491
  __typename?: "RequestDurationTooLargeError";
@@ -8464,6 +8499,12 @@ export type RequestFieldValueMissingError = Error & {
8464
8499
  requestTemplateID: Scalars["RequestTemplateId"]["output"];
8465
8500
  resourceIds?: Maybe<Array<Scalars["ResourceId"]["output"]>>;
8466
8501
  };
8502
+ export type RequestFilters = {
8503
+ endDate?: InputMaybe<EndDateFilter>;
8504
+ searchQuery?: InputMaybe<Scalars["String"]["input"]>;
8505
+ showPendingOnly?: Scalars["Boolean"]["input"];
8506
+ startDate?: InputMaybe<StartDateFilter>;
8507
+ };
8467
8508
  export type RequestInput = {
8468
8509
  id: Scalars["RequestId"]["input"];
8469
8510
  };
@@ -8655,11 +8696,10 @@ export type RequestedResourceInput = {
8655
8696
  };
8656
8697
  export type RequestsInput = {
8657
8698
  cursor?: InputMaybe<Scalars["String"]["input"]>;
8699
+ filters?: RequestFilters;
8658
8700
  maxNumEntries?: InputMaybe<Scalars["Int"]["input"]>;
8659
8701
  requestType?: InputMaybe<RequestType>;
8660
- searchQuery?: InputMaybe<Scalars["String"]["input"]>;
8661
- showPendingOnly?: InputMaybe<Scalars["Boolean"]["input"]>;
8662
- sortBy?: InputMaybe<RequestsSortBy>;
8702
+ sortBy?: RequestsSortBy;
8663
8703
  };
8664
8704
  export type RequestsOutput = RequestsResult;
8665
8705
  export type RequestsResult = {
@@ -9397,6 +9437,12 @@ export type RoleAssignmentRiskFactor = {
9397
9437
  reason?: Maybe<Scalars["String"]["output"]>;
9398
9438
  riskFactor: RecommendationsSubscoreType;
9399
9439
  };
9440
+ export type RoleAssignmentScope = {
9441
+ accessScope: AccessScope;
9442
+ entityScope: EntityScope;
9443
+ principalScope: PrincipalScope;
9444
+ searchQuery?: InputMaybe<Scalars["String"]["input"]>;
9445
+ };
9400
9446
  export type RoleAssignmentSearchScope = {
9401
9447
  entityScope?: InputMaybe<RoleAssignmentEntityScope>;
9402
9448
  entityTypeScope?: InputMaybe<RoleAssignmentEntityTypeScope>;
@@ -9440,7 +9486,8 @@ export declare enum RoleAssignmentsSortByField {
9440
9486
  FirstGrantedAt = "FIRST_GRANTED_AT",
9441
9487
  LastUsedAt = "LAST_USED_AT",
9442
9488
  PrincipalName = "PRINCIPAL_NAME",
9443
- Role = "ROLE"
9489
+ Role = "ROLE",
9490
+ VulnerabilityCount = "VULNERABILITY_COUNT"
9444
9491
  }
9445
9492
  export declare enum RolePermission {
9446
9493
  AssignReviewers = "ASSIGN_REVIEWERS",
@@ -9453,6 +9500,7 @@ export declare enum RolePermission {
9453
9500
  EditSyncSettings = "EDIT_SYNC_SETTINGS",
9454
9501
  EditTags = "EDIT_TAGS",
9455
9502
  Export = "EXPORT",
9503
+ Import = "IMPORT",
9456
9504
  Read = "READ",
9457
9505
  ReadAssignments = "READ_ASSIGNMENTS",
9458
9506
  SendReminders = "SEND_REMINDERS",
@@ -9830,6 +9878,9 @@ export type StartAccessReviewStatsResult = {
9830
9878
  __typename?: "StartAccessReviewStatsResult";
9831
9879
  startAccessReviewStats?: Maybe<StartAccessReviewStats>;
9832
9880
  };
9881
+ export type StartDateFilter = {
9882
+ date: Scalars["String"]["input"];
9883
+ };
9833
9884
  export type StartSyncInput = {
9834
9885
  accessReviewId?: InputMaybe<Scalars["AccessReviewId"]["input"]>;
9835
9886
  connectionId?: InputMaybe<Scalars["ConnectionId"]["input"]>;
@@ -10803,16 +10854,7 @@ export type UpdateResourceUsersOutput = ResourceNotFoundError | UpdateResourceUs
10803
10854
  export type UpdateResourceUsersResult = {
10804
10855
  __typename?: "UpdateResourceUsersResult";
10805
10856
  resourceUsers?: Maybe<Array<ResourceUser>>;
10806
- };
10807
- export type UpdateResourceVisibilityGroupsInput = {
10808
- resourceId: Scalars["ResourceId"]["input"];
10809
- visibility: Visibility;
10810
- visibilityGroupsIds: Array<Scalars["GroupId"]["input"]>;
10811
- };
10812
- export type UpdateResourceVisibilityGroupsOutput = ConfigurationVisibilityGroupNotFoundError | GroupNotFoundError | InvalidUpdateResourceVisibilityGroupError | ResourceNotFoundError | UpdateResourceVisibilityGroupsResult;
10813
- export type UpdateResourceVisibilityGroupsResult = {
10814
- __typename?: "UpdateResourceVisibilityGroupsResult";
10815
- resource: Resource;
10857
+ taskId?: Maybe<Scalars["PushTaskId"]["output"]>;
10816
10858
  };
10817
10859
  export type UpdateResourcesInput = {
10818
10860
  commonMetadata?: InputMaybe<CommonMetadataInput>;
@@ -11387,9 +11429,6 @@ export declare enum RequestDecisionLevel {
11387
11429
  Admin = "ADMIN",
11388
11430
  Regular = "REGULAR"
11389
11431
  }
11390
- export type StartDateFilter = {
11391
- date: Scalars["String"]["input"];
11392
- };
11393
11432
  export type UpdateScopedRoleAssignmentsInput = {
11394
11433
  newDurationInMinutes?: InputMaybe<NullableInt>;
11395
11434
  scope?: InputMaybe<RoleAssignmentSearchScope>;
@@ -11579,9 +11618,31 @@ export type ResourceAccessLevelsQuery = {
11579
11618
  message: string;
11580
11619
  };
11581
11620
  };
11621
+ export type RequestDefaultsQueryVariables = Exact<{
11622
+ requestedResources: Array<RequestConfigurationResourceInput> | RequestConfigurationResourceInput;
11623
+ requestedGroups: Array<RequestConfigurationGroupInput> | RequestConfigurationGroupInput;
11624
+ }>;
11625
+ export type RequestDefaultsQuery = {
11626
+ __typename?: "Query";
11627
+ requestDefaults: {
11628
+ __typename?: "RequestDefaults";
11629
+ recommendedDurationInMinutes?: number | null;
11630
+ defaultDurationInMinutes: number;
11631
+ maxDurationInMinutes?: number | null;
11632
+ requireSupportTicket: boolean;
11633
+ reasonOptional: boolean;
11634
+ requesterIsAdmin: boolean;
11635
+ durationOptions: Array<{
11636
+ __typename?: "DurationOption";
11637
+ durationInMinutes: number;
11638
+ label: string;
11639
+ }>;
11640
+ };
11641
+ };
11582
11642
  export declare const GetGroupDocument: DocumentNode<GetGroupQuery, GetGroupQueryVariables>;
11583
11643
  export declare const GetRequestDocument: DocumentNode<GetRequestQuery, GetRequestQueryVariables>;
11584
11644
  export declare const CheckAuthSessionQueryDocument: DocumentNode<CheckAuthSessionQueryQuery, CheckAuthSessionQueryQueryVariables>;
11585
11645
  export declare const GetRequestableAppsQueryDocument: DocumentNode<GetRequestableAppsQueryQuery, GetRequestableAppsQueryQueryVariables>;
11586
11646
  export declare const PaginatedEntityDropdownDocument: DocumentNode<PaginatedEntityDropdownQuery, PaginatedEntityDropdownQueryVariables>;
11587
11647
  export declare const ResourceAccessLevelsDocument: DocumentNode<ResourceAccessLevelsQuery, ResourceAccessLevelsQueryVariables>;
11648
+ export declare const RequestDefaultsDocument: DocumentNode<RequestDefaultsQuery, RequestDefaultsQueryVariables>;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HealthStatus = exports.GroupUserSource = exports.GroupUserSortByField = exports.GroupType = exports.GroupResourceSource = exports.GroupBindingsSortByField = exports.GroupBindingSuggestionsSortByField = exports.GeneralSettingType = exports.FiltersMatchMode = exports.FactorType = exports.EventType = exports.EventSeverity = exports.ErrorNotificationSettingType = exports.EntityType = exports.ConnectionValidationStatus = exports.ConnectionValidationSeverity = exports.ConnectionType = exports.BundlesSortByField = exports.BundleItemsSortByField = exports.AuthType = exports.AuthSessionStatus = exports.AuthFlowType = exports.AssociatedItemsSortByField = exports.AssignmentsSortByField = exports.AppsSortByField = exports.AppType = exports.AppItemsSortByField = exports.AppCategory = exports.ApiAuthType = exports.ApiAccessLevel = exports.AldwinRole = exports.AccessType = exports.AccessRuleStatus = exports.AccessReviewUserWarningType = exports.AccessReviewType = exports.AccessReviewTab = exports.AccessReviewSummaryStatus = exports.AccessReviewStatus = exports.AccessReviewReviewerAssignmentPolicy = exports.AccessReviewItemsSortByField = exports.AccessReviewItemStatus = exports.AccessReviewItemOutcome = exports.AccessReviewGroupResourceVisibilityPolicy = exports.AccessReviewGroupItemKind = exports.AccessReviewEndUserView = exports.AccessReviewAssignedStatus = exports.AccessReviewAction = exports.AccessOption = exports.AccessChangeType = exports.AwsIdentityCenterImportSetting = void 0;
4
4
  exports.TaskTrigger = exports.TagsSortByField = exports.TagFilterMatchMode = exports.SyncType = exports.SyncTaskStatus = exports.SubEventsSortByField = exports.StringFormatType = exports.SortDirection = exports.ServiceType = exports.SearchType = exports.RolePermissionTargetType = exports.RolePermission = exports.RoleAssignmentsSortByField = exports.RoleAssignmentSource = exports.RiskLevel = exports.ReviewerUserStatus = exports.ReviewerAction = exports.ReviewStageOperator = exports.ResourceUserSource = exports.ResourceUserSortByField = exports.ResourceType = exports.RequestsSortByField = exports.RequestType = exports.RequestTemplateCustomFieldType = exports.RequestStatus = exports.RequestMessageLevel = exports.RequestMessageCode = exports.RequestApprovalType = exports.RecommendationsSubscoreType = exports.RecommendationsMetricType = exports.RecommendationsFeedbackType = exports.RecommendationsEntityType = exports.PubsubPublishMessageType = exports.PubsubPublishMessageStatusCode = exports.PubsubPublishConnectionType = exports.ProvisionSource = exports.PropagationTaskType = exports.PropagationStatusCode = exports.OwnersSortByField = exports.OrganizationType = exports.OidcProviderType = exports.NotificationType = exports.MessageChannelType = exports.MfaProvider = exports.IntegrationType = exports.ImportSetting = exports.IdpConnectionUserAttributeUseAs = exports.IdpConnectionType = exports.IdentityCategory = exports.HrIdpStatus = void 0;
5
- exports.ResourceAccessLevelsDocument = exports.PaginatedEntityDropdownDocument = exports.GetRequestableAppsQueryDocument = exports.CheckAuthSessionQueryDocument = exports.GetRequestDocument = exports.GetGroupDocument = exports.RequestDecisionLevel = exports.WebhookPubsubPublishConnectionAuthType = exports.WebhookPubsubPublishConnectionApiKeyLocation = exports.Visibility = exports.VerifyFactorStatus = exports.UsersSortByField = exports.UserProductRole = exports.UserErrorType = exports.UsageAttributionType = exports.UiSource = exports.TimePeriod = exports.TimeBucket = exports.ThirdPartyProvider = void 0;
5
+ exports.RequestDefaultsDocument = exports.ResourceAccessLevelsDocument = exports.PaginatedEntityDropdownDocument = exports.GetRequestableAppsQueryDocument = exports.CheckAuthSessionQueryDocument = exports.GetRequestDocument = exports.GetGroupDocument = exports.RequestDecisionLevel = exports.WebhookPubsubPublishConnectionAuthType = exports.WebhookPubsubPublishConnectionApiKeyLocation = exports.Visibility = exports.VerifyFactorStatus = exports.UsersSortByField = exports.UserProductRole = exports.UserErrorType = exports.UsageAttributionType = exports.UiSource = exports.TimePeriod = exports.TimeBucket = exports.ThirdPartyProvider = void 0;
6
6
  var AwsIdentityCenterImportSetting;
7
7
  (function (AwsIdentityCenterImportSetting) {
8
8
  AwsIdentityCenterImportSetting["All"] = "ALL";
@@ -18,6 +18,7 @@ var AccessChangeType;
18
18
  var AccessOption;
19
19
  (function (AccessOption) {
20
20
  AccessOption["All"] = "ALL";
21
+ AccessOption["Manageable"] = "MANAGEABLE";
21
22
  AccessOption["Mine"] = "MINE";
22
23
  AccessOption["Requestable"] = "REQUESTABLE";
23
24
  /** @deprecated no longer supported */
@@ -653,6 +654,7 @@ var EventType;
653
654
  EventType["RoleAssignmentsDeleted"] = "ROLE_ASSIGNMENTS_DELETED";
654
655
  EventType["RoleAssignmentsUpdated"] = "ROLE_ASSIGNMENTS_UPDATED";
655
656
  EventType["SessionsCreatedForResources"] = "SESSIONS_CREATED_FOR_RESOURCES";
657
+ EventType["SoonToExpireNotification"] = "SOON_TO_EXPIRE_NOTIFICATION";
656
658
  EventType["ThirdPartyIntegrationCreated"] = "THIRD_PARTY_INTEGRATION_CREATED";
657
659
  EventType["ThirdPartyIntegrationDeleted"] = "THIRD_PARTY_INTEGRATION_DELETED";
658
660
  EventType["ToxicSetViolationsCreated"] = "TOXIC_SET_VIOLATIONS_CREATED";
@@ -700,7 +702,6 @@ var GeneralSettingType;
700
702
  GeneralSettingType["AutoMergeUsersByEmail"] = "AUTO_MERGE_USERS_BY_EMAIL";
701
703
  GeneralSettingType["DisableNonAdminLogins"] = "DISABLE_NON_ADMIN_LOGINS";
702
704
  GeneralSettingType["GlobalRequesterRole"] = "GLOBAL_REQUESTER_ROLE";
703
- GeneralSettingType["LogRocketDisabled"] = "LOG_ROCKET_DISABLED";
704
705
  GeneralSettingType["NestedGroups"] = "NESTED_GROUPS";
705
706
  GeneralSettingType["RequireManagerCc"] = "REQUIRE_MANAGER_CC";
706
707
  GeneralSettingType["RequireOpalMfaForLogins"] = "REQUIRE_OPAL_MFA_FOR_LOGINS";
@@ -1184,6 +1185,7 @@ var RoleAssignmentsSortByField;
1184
1185
  RoleAssignmentsSortByField["LastUsedAt"] = "LAST_USED_AT";
1185
1186
  RoleAssignmentsSortByField["PrincipalName"] = "PRINCIPAL_NAME";
1186
1187
  RoleAssignmentsSortByField["Role"] = "ROLE";
1188
+ RoleAssignmentsSortByField["VulnerabilityCount"] = "VULNERABILITY_COUNT";
1187
1189
  })(RoleAssignmentsSortByField || (exports.RoleAssignmentsSortByField = RoleAssignmentsSortByField = {}));
1188
1190
  var RolePermission;
1189
1191
  (function (RolePermission) {
@@ -1197,6 +1199,7 @@ var RolePermission;
1197
1199
  RolePermission["EditSyncSettings"] = "EDIT_SYNC_SETTINGS";
1198
1200
  RolePermission["EditTags"] = "EDIT_TAGS";
1199
1201
  RolePermission["Export"] = "EXPORT";
1202
+ RolePermission["Import"] = "IMPORT";
1200
1203
  RolePermission["Read"] = "READ";
1201
1204
  RolePermission["ReadAssignments"] = "READ_ASSIGNMENTS";
1202
1205
  RolePermission["SendReminders"] = "SEND_REMINDERS";
@@ -2408,3 +2411,140 @@ exports.ResourceAccessLevelsDocument = {
2408
2411
  },
2409
2412
  ],
2410
2413
  };
2414
+ exports.RequestDefaultsDocument = {
2415
+ kind: "Document",
2416
+ definitions: [
2417
+ {
2418
+ kind: "OperationDefinition",
2419
+ operation: "query",
2420
+ name: { kind: "Name", value: "RequestDefaults" },
2421
+ variableDefinitions: [
2422
+ {
2423
+ kind: "VariableDefinition",
2424
+ variable: {
2425
+ kind: "Variable",
2426
+ name: { kind: "Name", value: "requestedResources" },
2427
+ },
2428
+ type: {
2429
+ kind: "NonNullType",
2430
+ type: {
2431
+ kind: "ListType",
2432
+ type: {
2433
+ kind: "NonNullType",
2434
+ type: {
2435
+ kind: "NamedType",
2436
+ name: {
2437
+ kind: "Name",
2438
+ value: "RequestConfigurationResourceInput",
2439
+ },
2440
+ },
2441
+ },
2442
+ },
2443
+ },
2444
+ },
2445
+ {
2446
+ kind: "VariableDefinition",
2447
+ variable: {
2448
+ kind: "Variable",
2449
+ name: { kind: "Name", value: "requestedGroups" },
2450
+ },
2451
+ type: {
2452
+ kind: "NonNullType",
2453
+ type: {
2454
+ kind: "ListType",
2455
+ type: {
2456
+ kind: "NonNullType",
2457
+ type: {
2458
+ kind: "NamedType",
2459
+ name: {
2460
+ kind: "Name",
2461
+ value: "RequestConfigurationGroupInput",
2462
+ },
2463
+ },
2464
+ },
2465
+ },
2466
+ },
2467
+ },
2468
+ ],
2469
+ selectionSet: {
2470
+ kind: "SelectionSet",
2471
+ selections: [
2472
+ {
2473
+ kind: "Field",
2474
+ name: { kind: "Name", value: "requestDefaults" },
2475
+ arguments: [
2476
+ {
2477
+ kind: "Argument",
2478
+ name: { kind: "Name", value: "input" },
2479
+ value: {
2480
+ kind: "ObjectValue",
2481
+ fields: [
2482
+ {
2483
+ kind: "ObjectField",
2484
+ name: { kind: "Name", value: "requestedResources" },
2485
+ value: {
2486
+ kind: "Variable",
2487
+ name: { kind: "Name", value: "requestedResources" },
2488
+ },
2489
+ },
2490
+ {
2491
+ kind: "ObjectField",
2492
+ name: { kind: "Name", value: "requestedGroups" },
2493
+ value: {
2494
+ kind: "Variable",
2495
+ name: { kind: "Name", value: "requestedGroups" },
2496
+ },
2497
+ },
2498
+ ],
2499
+ },
2500
+ },
2501
+ ],
2502
+ selectionSet: {
2503
+ kind: "SelectionSet",
2504
+ selections: [
2505
+ {
2506
+ kind: "Field",
2507
+ name: { kind: "Name", value: "durationOptions" },
2508
+ selectionSet: {
2509
+ kind: "SelectionSet",
2510
+ selections: [
2511
+ {
2512
+ kind: "Field",
2513
+ name: { kind: "Name", value: "durationInMinutes" },
2514
+ },
2515
+ { kind: "Field", name: { kind: "Name", value: "label" } },
2516
+ ],
2517
+ },
2518
+ },
2519
+ {
2520
+ kind: "Field",
2521
+ name: { kind: "Name", value: "recommendedDurationInMinutes" },
2522
+ },
2523
+ {
2524
+ kind: "Field",
2525
+ name: { kind: "Name", value: "defaultDurationInMinutes" },
2526
+ },
2527
+ {
2528
+ kind: "Field",
2529
+ name: { kind: "Name", value: "maxDurationInMinutes" },
2530
+ },
2531
+ {
2532
+ kind: "Field",
2533
+ name: { kind: "Name", value: "requireSupportTicket" },
2534
+ },
2535
+ {
2536
+ kind: "Field",
2537
+ name: { kind: "Name", value: "reasonOptional" },
2538
+ },
2539
+ {
2540
+ kind: "Field",
2541
+ name: { kind: "Name", value: "requesterIsAdmin" },
2542
+ },
2543
+ ],
2544
+ },
2545
+ },
2546
+ ],
2547
+ },
2548
+ },
2549
+ ],
2550
+ };
@@ -1,22 +1,42 @@
1
1
  import type { NormalizedCacheObject } from "@apollo/client/core";
2
2
  import type { ApolloClient } from "@apollo/client/core/ApolloClient";
3
3
  import type { Command } from "@oclif/core/lib/command";
4
- export interface AppNode {
4
+ interface AppNode {
5
5
  appName: string;
6
- assets: Map<string, AssetNode>;
6
+ assets: Record<string, AssetNode>;
7
7
  }
8
- export interface AssetNode {
8
+ interface AssetNode {
9
9
  assetName: string;
10
- roles?: Map<string, RoleNode>;
10
+ roles?: Record<string, RoleNode>;
11
11
  }
12
- export interface RoleNode {
12
+ interface RoleNode {
13
13
  roleName: string;
14
14
  }
15
- export type RequestMap = Map<string, AppNode>;
15
+ export type RequestMap = Record<string, AppNode>;
16
+ interface DurationOption {
17
+ durationInMinutes: number;
18
+ label: string;
19
+ }
20
+ interface RequestDefaults {
21
+ durationOptions?: DurationOption[];
22
+ recommendedDurationInMinutes?: number | null;
23
+ defaultDurationInMinutes?: number;
24
+ maxDurationInMinutes?: number | null;
25
+ requireSupportTicket?: boolean;
26
+ reasonOptional?: boolean;
27
+ requesterIsAdmin?: boolean;
28
+ }
29
+ export interface RequestMetadata {
30
+ requestMap: RequestMap;
31
+ requestDefaults: RequestDefaults;
32
+ }
33
+ export declare function createEmptyRequestMetadata(): RequestMetadata;
16
34
  export declare function selectRequestableItems(cmd: Command, client: ApolloClient<NormalizedCacheObject>, requestMap: RequestMap): Promise<void>;
17
35
  export declare function chooseAssets(cmd: Command, client: ApolloClient<NormalizedCacheObject>, appId: string, requestMap: RequestMap): Promise<void>;
18
36
  export declare function chooseRoles(cmd: Command, client: ApolloClient<NormalizedCacheObject>, appId: string, assetId: string, requestMap: RequestMap): Promise<void>;
19
37
  export declare function doneSelectingAssets(): Promise<boolean>;
20
- export declare function promptForReason(): Promise<any>;
21
- export declare function promptForExpiration(): Promise<any>;
38
+ export declare function setRequestDefaults(cmd: Command, client: ApolloClient<NormalizedCacheObject>, metadata: RequestMetadata): Promise<void>;
39
+ export declare function promptForReason(metadata: RequestMetadata): Promise<any>;
40
+ export declare function promptForExpiration(metadata: RequestMetadata): Promise<any>;
22
41
  export declare function submitFinalRequest(cmd: Command): Promise<void>;
42
+ export {};
@@ -1,15 +1,35 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEmptyRequestMetadata = createEmptyRequestMetadata;
3
4
  exports.selectRequestableItems = selectRequestableItems;
4
5
  exports.chooseAssets = chooseAssets;
5
6
  exports.chooseRoles = chooseRoles;
6
7
  exports.doneSelectingAssets = doneSelectingAssets;
8
+ exports.setRequestDefaults = setRequestDefaults;
7
9
  exports.promptForReason = promptForReason;
8
10
  exports.promptForExpiration = promptForExpiration;
9
11
  exports.submitFinalRequest = submitFinalRequest;
10
12
  const inquirer = require("inquirer");
11
13
  const graphql_1 = require("../graphql");
12
14
  inquirer.registerPrompt("autocomplete", require("inquirer-autocomplete-prompt"));
15
+ function createEmptyRequestMetadata() {
16
+ // Initialize with empty defaults
17
+ const requestDefaults = {
18
+ durationOptions: [],
19
+ recommendedDurationInMinutes: undefined,
20
+ defaultDurationInMinutes: undefined,
21
+ maxDurationInMinutes: undefined,
22
+ requireSupportTicket: false,
23
+ reasonOptional: false,
24
+ requesterIsAdmin: false,
25
+ };
26
+ // Initialize with empty map
27
+ const requestMap = {};
28
+ return {
29
+ requestMap,
30
+ requestDefaults,
31
+ };
32
+ }
13
33
  // Queries and Mutations
14
34
  // TODO: add pagination ability from CLI. (Load more...) option
15
35
  const GET_REQUESTABLE_APPS_QUERY = (0, graphql_1.graphql)(`
@@ -211,6 +231,46 @@ async function queryResourceRoles(cmd, client, resourceId) {
211
231
  }
212
232
  }
213
233
  }
234
+ const REQUEST_DEFAULTS_QUERY = (0, graphql_1.graphql)(`
235
+ query RequestDefaults(
236
+ $requestedResources: [RequestConfigurationResourceInput!]!
237
+ $requestedGroups: [RequestConfigurationGroupInput!]!
238
+ ) {
239
+ requestDefaults(input: {
240
+ requestedResources: $requestedResources,
241
+ requestedGroups: $requestedGroups,
242
+ }
243
+ ) {
244
+ durationOptions {
245
+ durationInMinutes
246
+ label
247
+ }
248
+ recommendedDurationInMinutes
249
+ defaultDurationInMinutes
250
+ maxDurationInMinutes
251
+ requireSupportTicket
252
+ reasonOptional
253
+ requesterIsAdmin
254
+ }
255
+ }`);
256
+ async function queryRequestDefaults(cmd, client, requestedResources, requestedGroups) {
257
+ try {
258
+ const resp = await client.query({
259
+ query: REQUEST_DEFAULTS_QUERY,
260
+ variables: {
261
+ requestedResources: requestedResources,
262
+ requestedGroups: requestedGroups,
263
+ },
264
+ fetchPolicy: "network-only", // to avoid caching
265
+ });
266
+ return resp.data.requestDefaults;
267
+ }
268
+ catch (error) {
269
+ if (error instanceof Error || typeof error === "string") {
270
+ cmd.error(error);
271
+ }
272
+ }
273
+ }
214
274
  // Helper functions
215
275
  async function selectRequestableItems(cmd, client, requestMap) {
216
276
  const { App } = await inquirer.prompt([
@@ -226,11 +286,11 @@ async function selectRequestableItems(cmd, client, requestMap) {
226
286
  },
227
287
  ]);
228
288
  // Set the app in the requestMap and call choose assets step
229
- if (!requestMap.has(App.id)) {
230
- requestMap.set(App.id, {
289
+ if (!(App.id in requestMap)) {
290
+ requestMap[App.id] = {
231
291
  appName: App.name,
232
- assets: new Map(),
233
- });
292
+ assets: {},
293
+ };
234
294
  }
235
295
  await chooseAssets(cmd, client, App.id, requestMap);
236
296
  }
@@ -249,22 +309,22 @@ async function chooseAssets(cmd, client, appId, requestMap) {
249
309
  return true;
250
310
  },
251
311
  });
252
- const entry = requestMap.get(appId);
312
+ const entry = requestMap[appId];
253
313
  for (const asset of Assets) {
254
314
  if (entry === undefined) {
255
315
  throw new Error(`App ${appId} not found in requestMap`);
256
316
  }
257
- if (!entry.assets.has(asset.id)) {
258
- entry.assets.set(asset.id, {
317
+ if (!(asset.id in entry.assets)) {
318
+ entry.assets[asset.id] = {
259
319
  assetName: asset.name,
260
- roles: new Map(),
261
- });
320
+ roles: {},
321
+ };
262
322
  }
263
323
  await chooseRoles(cmd, client, appId, asset.id, requestMap);
264
324
  }
265
325
  }
266
326
  async function chooseRoles(cmd, client, appId, assetId, requestMap) {
267
- var _a, _b;
327
+ var _a;
268
328
  const resourceRoles = (_a = (await queryResourceRoles(cmd, client, assetId))) !== null && _a !== void 0 ? _a : [];
269
329
  if (resourceRoles !== undefined &&
270
330
  (resourceRoles.length === 0 ||
@@ -283,15 +343,18 @@ async function chooseRoles(cmd, client, appId, assetId, requestMap) {
283
343
  return true;
284
344
  },
285
345
  });
286
- const entry = requestMap.get(appId);
287
- const assetEntry = entry === null || entry === void 0 ? void 0 : entry.assets.get(assetId);
346
+ const entry = requestMap[appId];
347
+ const assetEntry = entry === null || entry === void 0 ? void 0 : entry.assets[assetId];
288
348
  if (entry === undefined || assetEntry === undefined) {
289
349
  throw new Error(`App ${appId} or Asset ${assetId} not found in requestMap`);
290
350
  }
351
+ if (!assetEntry.roles) {
352
+ assetEntry.roles = {};
353
+ }
291
354
  for (const role of roles) {
292
- (_b = assetEntry.roles) === null || _b === void 0 ? void 0 : _b.set(role.id, {
355
+ assetEntry.roles[role.id] = {
293
356
  roleName: role.name,
294
- });
357
+ };
295
358
  }
296
359
  }
297
360
  async function doneSelectingAssets() {
@@ -307,22 +370,84 @@ async function doneSelectingAssets() {
307
370
  ]);
308
371
  return submitOrAdd === submitMessage;
309
372
  }
310
- async function promptForReason() {
373
+ async function setRequestDefaults(cmd, client, metadata) {
374
+ const requestMap = metadata.requestMap;
375
+ const requestedResources = [];
376
+ const requestedGroups = [];
377
+ for (const appNode of Object.values(requestMap)) {
378
+ for (const [assetId, assetNode] of Object.entries(appNode.assets)) {
379
+ if (assetNode.roles !== undefined) {
380
+ for (const roleId of Object.keys(assetNode.roles)) {
381
+ requestedResources.push({
382
+ resourceId: assetId,
383
+ accessLevelRemoteId: roleId,
384
+ });
385
+ }
386
+ }
387
+ }
388
+ }
389
+ try {
390
+ const requestDefaults = await queryRequestDefaults(cmd, client, requestedResources, requestedGroups);
391
+ if ((requestDefaults === null || requestDefaults === void 0 ? void 0 : requestDefaults.__typename) === "RequestDefaults") {
392
+ metadata.requestDefaults.durationOptions =
393
+ requestDefaults.durationOptions;
394
+ metadata.requestDefaults.recommendedDurationInMinutes =
395
+ requestDefaults.recommendedDurationInMinutes;
396
+ metadata.requestDefaults.defaultDurationInMinutes =
397
+ requestDefaults.defaultDurationInMinutes;
398
+ metadata.requestDefaults.maxDurationInMinutes =
399
+ requestDefaults.maxDurationInMinutes;
400
+ metadata.requestDefaults.requireSupportTicket =
401
+ requestDefaults.requireSupportTicket;
402
+ metadata.requestDefaults.reasonOptional = requestDefaults.reasonOptional;
403
+ metadata.requestDefaults.requesterIsAdmin =
404
+ requestDefaults.requesterIsAdmin;
405
+ }
406
+ }
407
+ catch (_a) {
408
+ cmd.error("Error fetching request defaults.");
409
+ }
410
+ }
411
+ async function promptForReason(metadata) {
311
412
  return await inquirer.prompt([
312
413
  {
313
414
  name: "reason",
314
415
  message: "I need access to this because...",
315
416
  type: "input",
417
+ validate: (answer) => {
418
+ if (metadata.requestDefaults.reasonOptional && answer.length < 1) {
419
+ return "A reason for requesting these assets is required.";
420
+ }
421
+ return true;
422
+ },
316
423
  },
317
424
  ]);
318
425
  }
319
- async function promptForExpiration() {
426
+ async function promptForExpiration(metadata) {
427
+ var _a, _b;
428
+ const durations = ((_b = (_a = metadata.requestDefaults) === null || _a === void 0 ? void 0 : _a.durationOptions) === null || _b === void 0 ? void 0 : _b.map((option) => {
429
+ return {
430
+ name: option.durationInMinutes ===
431
+ metadata.requestDefaults.recommendedDurationInMinutes
432
+ ? `${option.label} (Recommended)`
433
+ : option.label,
434
+ value: {
435
+ label: option.label,
436
+ durationInMinutes: option.durationInMinutes,
437
+ },
438
+ };
439
+ })) || [];
440
+ // TODO: Sort durations by minutes
441
+ // durations = durations.sort(
442
+ // durations.filter((option) => option.value.durationInMinutes),
443
+ // );
320
444
  return await inquirer.prompt([
321
445
  {
322
446
  name: "expiration",
323
447
  message: "When should access expire?",
324
448
  type: "list",
325
- choices: ["1 hour", "1 day", "7 days", "30 days", "1 year", "Indefinite"],
449
+ choices: durations,
450
+ pageSize: 15,
326
451
  },
327
452
  ]);
328
453
  }
@@ -32,17 +32,17 @@ function treeifyRequestMap(requestMap) {
32
32
  const requestTree = {};
33
33
  // Create a tree structure from the requestMap
34
34
  // Iterate over apps
35
- for (const appNode of requestMap.values()) {
35
+ for (const [_appId, appNode] of Object.entries(requestMap)) {
36
36
  const appKey = `🔧${appNode.appName}`;
37
37
  requestTree[appKey] = {}; // Initialize the app key
38
38
  // Iterate over assets
39
- for (const assetNode of appNode.assets.values()) {
39
+ for (const [_assetId, assetNode] of Object.entries(appNode.assets)) {
40
40
  const assetKey = `📦${assetNode.assetName}`;
41
41
  if (assetNode.roles !== undefined) {
42
42
  // If no roles were previously selected
43
43
  requestTree[appKey][assetKey] = {}; // Initialize the asset key
44
44
  // Iterate over roles
45
- for (const roleNode of assetNode.roles.values()) {
45
+ for (const [_roleId, roleNode] of Object.entries(assetNode.roles)) {
46
46
  requestTree[appKey][assetKey][roleNode.roleName] = null; // Initialize the role key
47
47
  }
48
48
  }
@@ -452,15 +452,14 @@
452
452
  "start.js"
453
453
  ]
454
454
  },
455
- "postgres-instances:start": {
455
+ "kube-roles:start": {
456
456
  "aliases": [],
457
457
  "args": {},
458
- "description": "Starts a session to connect to a Postgres database.",
458
+ "description": "Starts a session to assume a Kubernetes cluster IAM role.",
459
459
  "examples": [
460
- "opal postgres-instances:start",
461
- "opal postgres-instances:start --id 51f7176b-0464-4a6f-8369-e951e187b398",
462
- "opal postgres-instances:start --id 51f7176b-0464-4a6f-8369-e951e187b398 --accessLevelRemoteId fullaccess",
463
- "opal postgres-instances:start --id 51f7176b-0464-4a6f-8369-e951e187b398 --accessLevelRemoteId fullaccess --action view"
460
+ "opal kube-roles:start",
461
+ "opal kube-roles:start --id 51f7176b-0464-4a6f-8369-e951e187b398",
462
+ "opal kube-roles:start --id 51f7176b-0464-4a6f-8369-e951e187b398 --accessLevelRemoteId \"arn:aws:iam::712234975475:role/acme-eks-cluster-admin-role\""
464
463
  ],
465
464
  "flags": {
466
465
  "help": {
@@ -500,22 +499,11 @@
500
499
  "name": "refresh",
501
500
  "allowNo": false,
502
501
  "type": "boolean"
503
- },
504
- "action": {
505
- "description": "Method of connecting to the database.\n- psql: Start psql session in shell\n- view: View connection configuration details",
506
- "name": "action",
507
- "hasDynamicHelp": false,
508
- "multiple": false,
509
- "options": [
510
- "psql",
511
- "view"
512
- ],
513
- "type": "option"
514
502
  }
515
503
  },
516
504
  "hasDynamicHelp": false,
517
505
  "hiddenAliases": [],
518
- "id": "postgres-instances:start",
506
+ "id": "kube-roles:start",
519
507
  "pluginAlias": "opal-security",
520
508
  "pluginName": "opal-security",
521
509
  "pluginType": "core",
@@ -525,18 +513,19 @@
525
513
  "relativePath": [
526
514
  "lib",
527
515
  "commands",
528
- "postgres-instances",
516
+ "kube-roles",
529
517
  "start.js"
530
518
  ]
531
519
  },
532
- "kube-roles:start": {
520
+ "postgres-instances:start": {
533
521
  "aliases": [],
534
522
  "args": {},
535
- "description": "Starts a session to assume a Kubernetes cluster IAM role.",
523
+ "description": "Starts a session to connect to a Postgres database.",
536
524
  "examples": [
537
- "opal kube-roles:start",
538
- "opal kube-roles:start --id 51f7176b-0464-4a6f-8369-e951e187b398",
539
- "opal kube-roles:start --id 51f7176b-0464-4a6f-8369-e951e187b398 --accessLevelRemoteId \"arn:aws:iam::712234975475:role/acme-eks-cluster-admin-role\""
525
+ "opal postgres-instances:start",
526
+ "opal postgres-instances:start --id 51f7176b-0464-4a6f-8369-e951e187b398",
527
+ "opal postgres-instances:start --id 51f7176b-0464-4a6f-8369-e951e187b398 --accessLevelRemoteId fullaccess",
528
+ "opal postgres-instances:start --id 51f7176b-0464-4a6f-8369-e951e187b398 --accessLevelRemoteId fullaccess --action view"
540
529
  ],
541
530
  "flags": {
542
531
  "help": {
@@ -576,51 +565,22 @@
576
565
  "name": "refresh",
577
566
  "allowNo": false,
578
567
  "type": "boolean"
579
- }
580
- },
581
- "hasDynamicHelp": false,
582
- "hiddenAliases": [],
583
- "id": "kube-roles:start",
584
- "pluginAlias": "opal-security",
585
- "pluginName": "opal-security",
586
- "pluginType": "core",
587
- "strict": true,
588
- "enableJsonFlag": false,
589
- "isESM": false,
590
- "relativePath": [
591
- "lib",
592
- "commands",
593
- "kube-roles",
594
- "start.js"
595
- ]
596
- },
597
- "resources:get": {
598
- "aliases": [],
599
- "args": {},
600
- "description": "Get resource info for a particular resource.",
601
- "examples": [
602
- "opal resources:get --id 54052a3e-5375-4392-aeaf-0c6c44c131d4"
603
- ],
604
- "flags": {
605
- "help": {
606
- "char": "h",
607
- "description": "Show CLI help.",
608
- "name": "help",
609
- "allowNo": false,
610
- "type": "boolean"
611
568
  },
612
- "id": {
613
- "char": "i",
614
- "description": "The Opal ID of the resource. You can find this from the URL, e.g. https://opal.dev/resources/[ID]",
615
- "name": "id",
569
+ "action": {
570
+ "description": "Method of connecting to the database.\n- psql: Start psql session in shell\n- view: View connection configuration details",
571
+ "name": "action",
616
572
  "hasDynamicHelp": false,
617
573
  "multiple": false,
574
+ "options": [
575
+ "psql",
576
+ "view"
577
+ ],
618
578
  "type": "option"
619
579
  }
620
580
  },
621
581
  "hasDynamicHelp": false,
622
582
  "hiddenAliases": [],
623
- "id": "resources:get",
583
+ "id": "postgres-instances:start",
624
584
  "pluginAlias": "opal-security",
625
585
  "pluginName": "opal-security",
626
586
  "pluginType": "core",
@@ -630,8 +590,8 @@
630
590
  "relativePath": [
631
591
  "lib",
632
592
  "commands",
633
- "resources",
634
- "get.js"
593
+ "postgres-instances",
594
+ "start.js"
635
595
  ]
636
596
  },
637
597
  "request:create": {
@@ -716,6 +676,46 @@
716
676
  "list.js"
717
677
  ]
718
678
  },
679
+ "resources:get": {
680
+ "aliases": [],
681
+ "args": {},
682
+ "description": "Get resource info for a particular resource.",
683
+ "examples": [
684
+ "opal resources:get --id 54052a3e-5375-4392-aeaf-0c6c44c131d4"
685
+ ],
686
+ "flags": {
687
+ "help": {
688
+ "char": "h",
689
+ "description": "Show CLI help.",
690
+ "name": "help",
691
+ "allowNo": false,
692
+ "type": "boolean"
693
+ },
694
+ "id": {
695
+ "char": "i",
696
+ "description": "The Opal ID of the resource. You can find this from the URL, e.g. https://opal.dev/resources/[ID]",
697
+ "name": "id",
698
+ "hasDynamicHelp": false,
699
+ "multiple": false,
700
+ "type": "option"
701
+ }
702
+ },
703
+ "hasDynamicHelp": false,
704
+ "hiddenAliases": [],
705
+ "id": "resources:get",
706
+ "pluginAlias": "opal-security",
707
+ "pluginName": "opal-security",
708
+ "pluginType": "core",
709
+ "strict": true,
710
+ "enableJsonFlag": false,
711
+ "isESM": false,
712
+ "relativePath": [
713
+ "lib",
714
+ "commands",
715
+ "resources",
716
+ "get.js"
717
+ ]
718
+ },
719
719
  "ssh:copyFrom": {
720
720
  "aliases": [],
721
721
  "args": {},
@@ -923,5 +923,5 @@
923
923
  ]
924
924
  }
925
925
  },
926
- "version": "3.1.1-beta.65d1a96"
926
+ "version": "3.1.1-beta.e5e99da"
927
927
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "opal-security",
3
3
  "description": "Opal allows you to centrally manage access to all of your sensitive systems.",
4
- "version": "3.1.1-beta.65d1a96",
4
+ "version": "3.1.1-beta.e5e99da",
5
5
  "author": "Stephen Cobbe",
6
6
  "bin": {
7
7
  "opal": "./bin/run"