@p0security/cli 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/CONTRIBUTING.md +23 -0
  2. package/LICENSE.md +675 -0
  3. package/README.md +201 -0
  4. package/dist/commands/__tests__/login.test.d.ts +1 -0
  5. package/dist/commands/__tests__/login.test.js +75 -0
  6. package/dist/commands/__tests__/ls.test.d.ts +1 -0
  7. package/dist/commands/__tests__/ls.test.js +84 -0
  8. package/dist/commands/__tests__/request.test.d.ts +1 -0
  9. package/dist/commands/__tests__/request.test.js +94 -0
  10. package/dist/commands/__tests__/ssh.test.d.ts +1 -0
  11. package/dist/commands/__tests__/ssh.test.js +107 -0
  12. package/dist/commands/aws/__tests__/__input__/saml-response.d.ts +11 -0
  13. package/dist/commands/aws/__tests__/__input__/saml-response.js +18 -0
  14. package/dist/commands/aws/__tests__/__input__/sts-response.d.ts +11 -0
  15. package/dist/commands/aws/__tests__/__input__/sts-response.js +37 -0
  16. package/dist/commands/aws/__tests__/role.test.d.ts +1 -0
  17. package/dist/commands/aws/__tests__/role.test.js +98 -0
  18. package/dist/commands/aws/index.d.ts +4 -0
  19. package/dist/commands/aws/index.js +26 -0
  20. package/dist/commands/aws/role.d.ts +27 -0
  21. package/dist/commands/aws/role.js +123 -0
  22. package/dist/commands/index.d.ts +2 -0
  23. package/dist/commands/index.js +49 -0
  24. package/dist/commands/login.d.ts +14 -0
  25. package/dist/commands/login.js +93 -0
  26. package/dist/commands/ls.d.ts +4 -0
  27. package/dist/commands/ls.js +78 -0
  28. package/dist/commands/request.d.ts +12 -0
  29. package/dist/commands/request.js +116 -0
  30. package/dist/commands/ssh.d.ts +11 -0
  31. package/dist/commands/ssh.js +154 -0
  32. package/dist/common/auth/oidc.d.ts +4 -0
  33. package/dist/common/auth/oidc.js +18 -0
  34. package/dist/common/auth/server.d.ts +15 -0
  35. package/dist/common/auth/server.js +73 -0
  36. package/dist/common/fetch.d.ts +16 -0
  37. package/dist/common/fetch.js +39 -0
  38. package/dist/common/mime.d.ts +14 -0
  39. package/dist/common/mime.js +17 -0
  40. package/dist/common/xml.d.ts +21 -0
  41. package/dist/common/xml.js +52 -0
  42. package/dist/drivers/__mocks__/auth.d.ts +30 -0
  43. package/dist/drivers/__mocks__/auth.js +46 -0
  44. package/dist/drivers/api.d.ts +3 -0
  45. package/dist/drivers/api.js +69 -0
  46. package/dist/drivers/auth.d.ts +11 -0
  47. package/dist/drivers/auth.js +122 -0
  48. package/dist/drivers/env.d.ts +15 -0
  49. package/dist/drivers/env.js +38 -0
  50. package/dist/drivers/firestore.d.ts +10 -0
  51. package/dist/drivers/firestore.js +53 -0
  52. package/dist/drivers/stdio.d.ts +25 -0
  53. package/dist/drivers/stdio.js +44 -0
  54. package/dist/index.d.ts +1 -0
  55. package/dist/index.js +23 -0
  56. package/dist/middlewares/version.d.ts +8 -0
  57. package/dist/middlewares/version.js +77 -0
  58. package/dist/plugins/__mocks__/login.d.ts +14 -0
  59. package/dist/plugins/__mocks__/login.js +24 -0
  60. package/dist/plugins/aws/__mocks__/assumeRole.d.ts +12 -0
  61. package/dist/plugins/aws/__mocks__/assumeRole.js +20 -0
  62. package/dist/plugins/aws/api.d.ts +12 -0
  63. package/dist/plugins/aws/api.js +16 -0
  64. package/dist/plugins/aws/assumeRole.d.ts +14 -0
  65. package/dist/plugins/aws/assumeRole.js +55 -0
  66. package/dist/plugins/aws/config.d.ts +5 -0
  67. package/dist/plugins/aws/config.js +38 -0
  68. package/dist/plugins/aws/ssm/index.d.ts +18 -0
  69. package/dist/plugins/aws/ssm/index.js +274 -0
  70. package/dist/plugins/aws/ssm/install.d.ts +7 -0
  71. package/dist/plugins/aws/ssm/install.js +133 -0
  72. package/dist/plugins/aws/types.d.ts +54 -0
  73. package/dist/plugins/aws/types.js +2 -0
  74. package/dist/plugins/google/login.d.ts +2 -0
  75. package/dist/plugins/google/login.js +76 -0
  76. package/dist/plugins/login.d.ts +13 -0
  77. package/dist/plugins/login.js +19 -0
  78. package/dist/plugins/okta/aws.d.ts +5 -0
  79. package/dist/plugins/okta/aws.js +42 -0
  80. package/dist/plugins/okta/login.d.ts +8 -0
  81. package/dist/plugins/okta/login.js +165 -0
  82. package/dist/plugins/ssh/types.d.ts +22 -0
  83. package/dist/plugins/ssh/types.js +2 -0
  84. package/dist/public/favicon.ico +0 -0
  85. package/dist/public/redirect-landing.html +40 -0
  86. package/dist/testing/firestore.d.ts +2 -0
  87. package/dist/testing/firestore.js +16 -0
  88. package/dist/testing/yargs.d.ts +12 -0
  89. package/dist/testing/yargs.js +23 -0
  90. package/dist/types/identity.d.ts +23 -0
  91. package/dist/types/identity.js +2 -0
  92. package/dist/types/index.d.ts +11 -0
  93. package/dist/types/index.js +15 -0
  94. package/dist/types/oidc.d.ts +41 -0
  95. package/dist/types/oidc.js +2 -0
  96. package/dist/types/org.d.ts +20 -0
  97. package/dist/types/org.js +2 -0
  98. package/dist/types/request.d.ts +35 -0
  99. package/dist/types/request.js +20 -0
  100. package/dist/util.d.ts +42 -0
  101. package/dist/util.js +87 -0
  102. package/p0 +16 -0
  103. package/package.json +70 -0
package/README.md ADDED
@@ -0,0 +1,201 @@
1
+ <div align="center">
2
+ <a href="https://github.com/p0-security/p0cli">
3
+ <img width="200" height="200" src="https://p0.dev/images/logo.png" alt="P0 Security logo">
4
+ </a>
5
+ </div>
6
+
7
+ # P0 Security CLI
8
+
9
+ The offical Command-Line Interface (CLI) for P0.
10
+
11
+ Supports creating access requests for cloud resources, assuming AWS roles, and connecting to AWS instances.
12
+
13
+ ## Table of Contents
14
+
15
+ - [About](#about)
16
+ - [Quickstart](#quickstart)
17
+ - [Installation](#installation)
18
+ - [Configuration](#configuration)
19
+ - [Command Reference](#command-reference)
20
+ - [Example Usage](#example-usage)
21
+ - [Support](#support)
22
+ - [Contributing](#contributing)
23
+ - [Copyright](#copyright)
24
+
25
+ ## About
26
+
27
+ P0 manages just-in-time access to your cloud resources. The P0 CLI enables developers to seamlessly integrate P0 into their normal workflows by supporting the following use cases:
28
+
29
+ - Assume an AWS role or SSH into an AWS instance: P0 will request access, wait for access to be approved and provisioned, and then execute the relevant `aws` command
30
+ - Create P0 access requests for any cloud resource
31
+
32
+ To learn more about P0, see our [docs](https://docs.p0.dev/).
33
+
34
+ ## Quickstart
35
+
36
+ ### Installation
37
+
38
+ To install the P0 CLI, run:
39
+
40
+ ```
41
+ npm install -g @p0security/cli
42
+ ```
43
+
44
+ You can now invoke the CLI by running `p0`.
45
+
46
+ ### Configuration
47
+
48
+ Before you can make requests using the P0 CLI, you will need to authenticate with your P0 organization. If you don't have a P0 organization account yet, follow our [Quick Start guide](https://docs.p0.dev/getting-started/quick-start) to create an account and install a resource for access requests.
49
+
50
+ Once you have a P0 organization account, run
51
+
52
+ ```
53
+ p0 login <P0_ORGANIZATION_ID>
54
+ ```
55
+
56
+ then follow the prompts in your browser to complete authentication.
57
+
58
+ You can now request access via
59
+
60
+ ```
61
+ p0 request
62
+ ```
63
+
64
+ ## CLI Reference
65
+
66
+ ### Usage
67
+
68
+ Interact with the `p0` CLI via:
69
+
70
+ ```
71
+ p0 <command> <options>
72
+ ```
73
+
74
+ To view help, use the `--help` option with any command.
75
+
76
+ ### Available commands
77
+
78
+ ```
79
+ p0 aws Execute AWS commands
80
+ p0 login <org> Log in to p0 using a web browser
81
+ p0 ls [arguments..] List request-command arguments
82
+ p0 request [arguments..] Manually request permissions on a resource
83
+ p0 ssh <destination> SSH into a virtual machine
84
+ ```
85
+
86
+ ## Example Usage
87
+
88
+ ### Create an access request
89
+
90
+ To view the resources available for access requests, run:
91
+
92
+ ```
93
+ p0 request --help
94
+ ```
95
+
96
+ Sample output:
97
+
98
+ ```
99
+ Request access to a resource using P0
100
+
101
+ Commands:
102
+ p0 request aws Amazon Web Services
103
+ p0 request azure-ad Entra ID
104
+ p0 request gcloud Google Cloud
105
+ p0 request okta Okta
106
+ p0 request ssh <destination> Secure Shell (SSH) session
107
+ p0 request workspace Google Workspace
108
+
109
+ Options:
110
+ --help Show help [boolean]
111
+ --reason Reason access is needed [string]
112
+ -w, --wait Block until the request is completed [boolean]
113
+ ```
114
+
115
+ Run `--help` on any of these commands for information on requesting that resource. For example, to request a Google Cloud role, run
116
+
117
+ ```
118
+ p0 request gcloud --help
119
+ ```
120
+
121
+ ```
122
+ Google Cloud
123
+
124
+ Commands:
125
+ p0 request gcloud resource <accesses..> GCP resource
126
+ p0 request gcloud role <names..> Custom or predefined role
127
+ p0 request gcloud permission <names..> GCP permissions
128
+
129
+ Options:
130
+ --help Show help [boolean]
131
+ --reason Reason access is needed [string]
132
+ -w, --wait Block until the request is completed [boolean]
133
+ ```
134
+
135
+ If you don't know the name of the role you need, you can use the `p0 ls` command. `p0 ls` accepts the same arguments that you provide to `p0 request` and lists the available options for access within your selected resource. For example, to view the available Google Cloud roles, run
136
+
137
+ ```
138
+ p0 ls gcloud role names --like bigquery
139
+ ```
140
+
141
+ Now, to request `bigquery.admin`, run:
142
+
143
+ ```
144
+ p0 request gcloud role bigquery.admin
145
+ ```
146
+
147
+ This will create an access request on Slack. Once your access request is approved, you will automatically get access to the Bigquery Admin role.
148
+
149
+ ### Assume an AWS IAM Role
150
+
151
+ You can use the P0 CLI to assume a role in AWS.
152
+
153
+ To use this feature, you will need to have installed and configured the AWS CLI. If you have not done so already, you can follow the [installation steps](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).
154
+
155
+ List the roles that you have permissions to assume via:
156
+
157
+ ```
158
+ p0 aws role ls
159
+ ```
160
+
161
+ If you don't see your desired role, you will first need to request access to it. You can do that with `p0 request aws role <ROLE_NAME>`.
162
+
163
+ Once you have permissions, you can run
164
+
165
+ ```
166
+ $(p0 aws role assume <ROLE_NAME>)
167
+ ```
168
+
169
+ ### SSH into an AWS Instance
170
+
171
+ You can request access to an AWS instance and open a SSH session once access is provisioned with a single command in the P0 CLI.
172
+
173
+ To use this feature, you will need to have installed and configured the AWS CLI and the Session Manager plugin. If you have not done so already, you can follow the [AWS CLI installation steps](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) and [Session Manager plugin installation step](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html).
174
+
175
+ To see the available AWS instances, run:
176
+
177
+ ```
178
+ p0 ls ssh destination
179
+ ```
180
+
181
+ You can start a SSH session with:
182
+
183
+ ```
184
+ p0 ssh <INSTANCE_NAME>
185
+ ```
186
+
187
+ If you already have access, this will directly open the SSH session. Otherwise, it will request access, wait for approval, and open a SSH session once the access is provisioned.
188
+
189
+ ## Support
190
+
191
+ If you encounter any issues with the P0 CLI, you can open a GitHub issue on this repo, email `support@p0.dev`, or reach out to us on our [community slack](https://join.slack.com/t/p0securitycommunity/shared_invite/zt-1zouzlovp-1kuym9RfuzkJ17ZlvAf6mQ).
192
+
193
+ ## Contributing
194
+
195
+ See [CONTRIBUTING.md](CONTRIBUTING.md)
196
+
197
+ ## Copyright
198
+
199
+ Copyright © 2024-present P0 Security.
200
+
201
+ The P0 Security CLI is licensed under the terms of the GNU General Public License version 3. See [LICENSE.md](LICENSE.md) for details.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ /** Copyright © 2024-present P0 Security
13
+
14
+ This file is part of @p0security/cli
15
+
16
+ @p0security/cli is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.
17
+
18
+ @p0security/cli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
19
+
20
+ You should have received a copy of the GNU General Public License along with @p0security/cli. If not, see <https://www.gnu.org/licenses/>.
21
+ **/
22
+ const login_1 = require("../../plugins/login");
23
+ const firestore_1 = require("../../testing/firestore");
24
+ const login_2 = require("../login");
25
+ const auth_1 = require("firebase/auth");
26
+ const promises_1 = require("fs/promises");
27
+ jest.spyOn(Date, "now").mockReturnValue(1.6e12);
28
+ jest.mock("fs/promises");
29
+ jest.mock("../../drivers/auth", () => (Object.assign(Object.assign({}, jest.requireActual("../../drivers/auth")), { IDENTITY_FILE_PATH: "/path/to/home/.p0" })));
30
+ jest.mock("../../drivers/stdio");
31
+ jest.mock("../../plugins/login");
32
+ const mockReadFile = promises_1.readFile;
33
+ const mockWriteFile = promises_1.writeFile;
34
+ describe("login", () => {
35
+ it("prints a friendly error if the org is not found", () => __awaiter(void 0, void 0, void 0, function* () {
36
+ (0, firestore_1.mockGetDoc)(undefined);
37
+ yield expect((0, login_2.login)({ org: "test-org" })).rejects.toMatchInlineSnapshot(`"Could not find organization"`);
38
+ }));
39
+ it("should print a friendly error if unsupported login", () => __awaiter(void 0, void 0, void 0, function* () {
40
+ (0, firestore_1.mockGetDoc)({
41
+ slug: "test-org",
42
+ tenantId: "test-tenant",
43
+ ssoProvider: "microsoft",
44
+ });
45
+ yield expect((0, login_2.login)({ org: "test-org" })).rejects.toMatchInlineSnapshot(`"Unsupported login for your organization"`);
46
+ }));
47
+ describe("organization exists", () => {
48
+ let credentialData = "";
49
+ mockReadFile.mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () { return Buffer.from(credentialData, "utf-8"); }));
50
+ mockWriteFile.mockImplementation((_path, data) => __awaiter(void 0, void 0, void 0, function* () {
51
+ credentialData = data;
52
+ }));
53
+ beforeEach(() => {
54
+ credentialData = "";
55
+ jest.clearAllMocks();
56
+ (0, firestore_1.mockGetDoc)({
57
+ slug: "test-org",
58
+ tenantId: "test-tenant",
59
+ ssoProvider: "google",
60
+ });
61
+ });
62
+ it("should call the provider's login function", () => __awaiter(void 0, void 0, void 0, function* () {
63
+ yield (0, login_2.login)({ org: "test-org" });
64
+ expect(login_1.pluginLoginMap.google).toHaveBeenCalled();
65
+ }));
66
+ it("should write the user's identity to the file system", () => __awaiter(void 0, void 0, void 0, function* () {
67
+ yield (0, login_2.login)({ org: "test-org" });
68
+ expect(mockWriteFile.mock.calls).toMatchSnapshot();
69
+ }));
70
+ it("validates authentication", () => __awaiter(void 0, void 0, void 0, function* () {
71
+ yield (0, login_2.login)({ org: "test-org" });
72
+ expect(auth_1.signInWithCredential.mock.calls).toMatchSnapshot();
73
+ }));
74
+ });
75
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ /** Copyright © 2024-present P0 Security
16
+
17
+ This file is part of @p0security/cli
18
+
19
+ @p0security/cli is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.
20
+
21
+ @p0security/cli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
22
+
23
+ You should have received a copy of the GNU General Public License along with @p0security/cli. If not, see <https://www.gnu.org/licenses/>.
24
+ **/
25
+ const api_1 = require("../../drivers/api");
26
+ const stdio_1 = require("../../drivers/stdio");
27
+ const yargs_1 = require("../../testing/yargs");
28
+ const ls_1 = require("../ls");
29
+ const yargs_2 = __importDefault(require("yargs"));
30
+ jest.mock("../../drivers/api");
31
+ jest.mock("../../drivers/auth");
32
+ jest.mock("../../drivers/stdio");
33
+ const mockFetchCommand = api_1.fetchCommand;
34
+ const mockPrint1 = stdio_1.print1;
35
+ const mockPrint2 = stdio_1.print2;
36
+ describe("ls", () => {
37
+ beforeEach(() => jest.clearAllMocks());
38
+ describe("when valid ls command", () => {
39
+ const command = "ls ssh destination";
40
+ const mockItems = (items) => mockFetchCommand.mockResolvedValue({
41
+ ok: true,
42
+ term: "",
43
+ arg: "destination",
44
+ items,
45
+ });
46
+ it("should print list response", () => __awaiter(void 0, void 0, void 0, function* () {
47
+ mockItems([
48
+ { key: "instance-1", group: "Group", value: "Resource 1" },
49
+ { key: "instance-2", value: "Resource 2" },
50
+ ]);
51
+ yield (0, ls_1.lsCommand)((0, yargs_2.default)()).parse(command);
52
+ expect(mockPrint1.mock.calls).toMatchSnapshot("stdout");
53
+ expect(mockPrint2.mock.calls).toMatchSnapshot("stderr");
54
+ }));
55
+ it("should print friendly message if no items", () => __awaiter(void 0, void 0, void 0, function* () {
56
+ mockItems([]);
57
+ yield (0, ls_1.lsCommand)((0, yargs_2.default)()).parse(command);
58
+ expect(mockPrint1.mock.calls).toMatchSnapshot("stdout");
59
+ expect(mockPrint2.mock.calls).toMatchSnapshot("stderr");
60
+ }));
61
+ });
62
+ describe("when error", () => {
63
+ const command = "ls foo";
64
+ beforeAll(() => {
65
+ mockFetchCommand.mockResolvedValue({
66
+ error: `p0 ls
67
+
68
+ List available resources
69
+
70
+ Commands:
71
+ p0 ls ssh <destination> Secure Shell (SSH) session
72
+
73
+ Options:
74
+ --help Show help [boolean]
75
+
76
+ Unknown argument: foo`,
77
+ });
78
+ });
79
+ it("should print error message", () => __awaiter(void 0, void 0, void 0, function* () {
80
+ const error = yield (0, yargs_1.failure)((0, ls_1.lsCommand)((0, yargs_2.default)()), command);
81
+ expect(error).toMatchSnapshot();
82
+ }));
83
+ });
84
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ /** Copyright © 2024-present P0 Security
16
+
17
+ This file is part of @p0security/cli
18
+
19
+ @p0security/cli is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.
20
+
21
+ @p0security/cli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
22
+
23
+ You should have received a copy of the GNU General Public License along with @p0security/cli. If not, see <https://www.gnu.org/licenses/>.
24
+ **/
25
+ const api_1 = require("../../drivers/api");
26
+ const stdio_1 = require("../../drivers/stdio");
27
+ const yargs_1 = require("../../testing/yargs");
28
+ const util_1 = require("../../util");
29
+ const request_1 = require("../request");
30
+ const firestore_1 = require("firebase/firestore");
31
+ const yargs_2 = __importDefault(require("yargs"));
32
+ jest.mock("../../drivers/api");
33
+ jest.mock("../../drivers/auth");
34
+ jest.mock("../../drivers/stdio");
35
+ const mockFetchCommand = api_1.fetchCommand;
36
+ const mockPrint1 = stdio_1.print1;
37
+ const mockPrint2 = stdio_1.print2;
38
+ describe("request", () => {
39
+ beforeEach(() => jest.clearAllMocks());
40
+ describe("when valid request command", () => {
41
+ const command = "request gcloud role viewer";
42
+ function mockFetch(response) {
43
+ mockFetchCommand.mockResolvedValue(Object.assign({ ok: true, message: "a message", id: "abcefg", isPreexisting: false, isPersistent: false }, (response !== null && response !== void 0 ? response : {})));
44
+ }
45
+ describe.each([
46
+ [false, false, true],
47
+ [true, false, true],
48
+ [false, true, true],
49
+ ])("preexisting=%p persistent=%p", (isPreexisting, isPersistent, should) => {
50
+ it(`should${should ? "" : " not"} print request response`, () => __awaiter(void 0, void 0, void 0, function* () {
51
+ mockFetch({ isPreexisting, isPersistent });
52
+ yield (0, request_1.requestCommand)((0, yargs_2.default)()).parse(command);
53
+ expect(mockPrint2.mock.calls).toMatchSnapshot();
54
+ expect(mockPrint1).not.toHaveBeenCalled();
55
+ }));
56
+ });
57
+ it("should wait for access", () => __awaiter(void 0, void 0, void 0, function* () {
58
+ mockFetch();
59
+ const promise = (0, request_1.requestCommand)((0, yargs_2.default)()).parse(`${command} --wait`);
60
+ const wait = (0, util_1.sleep)(10);
61
+ yield expect(wait).resolves.toBeUndefined();
62
+ firestore_1.onSnapshot.trigger({
63
+ status: "DONE",
64
+ });
65
+ yield expect(promise).resolves.toBeDefined();
66
+ expect(mockPrint2.mock.calls).toMatchSnapshot();
67
+ expect(mockPrint1).not.toHaveBeenCalled();
68
+ }));
69
+ });
70
+ describe("when error", () => {
71
+ const command = "request foo";
72
+ beforeAll(() => {
73
+ mockFetchCommand.mockResolvedValue({
74
+ error: `p0 request
75
+
76
+ Request access to a resource using P0
77
+
78
+ Commands:
79
+ p0 request gcloud Google Cloud
80
+
81
+ Options:
82
+ --help Show help [boolean]
83
+ --reason Reason access is needed [string]
84
+ -w, --wait Block until the request is completed [boolean]
85
+
86
+ Unknown argument: foo`,
87
+ });
88
+ });
89
+ it("should print error message", () => __awaiter(void 0, void 0, void 0, function* () {
90
+ const error = yield (0, yargs_1.failure)((0, request_1.requestCommand)((0, yargs_2.default)()), command);
91
+ expect(error).toMatchSnapshot();
92
+ }));
93
+ });
94
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ /** Copyright © 2024-present P0 Security
16
+
17
+ This file is part of @p0security/cli
18
+
19
+ @p0security/cli is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.
20
+
21
+ @p0security/cli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
22
+
23
+ You should have received a copy of the GNU General Public License along with @p0security/cli. If not, see <https://www.gnu.org/licenses/>.
24
+ **/
25
+ const api_1 = require("../../drivers/api");
26
+ const stdio_1 = require("../../drivers/stdio");
27
+ const ssm_1 = require("../../plugins/aws/ssm");
28
+ const firestore_1 = require("../../testing/firestore");
29
+ const util_1 = require("../../util");
30
+ const ssh_1 = require("../ssh");
31
+ const firestore_2 = require("firebase/firestore");
32
+ const lodash_1 = require("lodash");
33
+ const yargs_1 = __importDefault(require("yargs"));
34
+ jest.mock("../../drivers/api");
35
+ jest.mock("../../drivers/auth");
36
+ jest.mock("../../drivers/stdio");
37
+ jest.mock("../../plugins/aws/ssm");
38
+ const mockFetchCommand = api_1.fetchCommand;
39
+ const mockSsm = ssm_1.ssm;
40
+ const mockPrint1 = stdio_1.print1;
41
+ const mockPrint2 = stdio_1.print2;
42
+ (0, firestore_1.mockGetDoc)({
43
+ workflows: {
44
+ items: [
45
+ {
46
+ identifier: "test-account",
47
+ state: "installed",
48
+ type: "aws",
49
+ },
50
+ ],
51
+ },
52
+ });
53
+ mockSsm.mockResolvedValue({});
54
+ describe("ssh", () => {
55
+ describe.each([
56
+ ["persistent", true],
57
+ ["ephemeral", false],
58
+ ])("%s access", (_, isPersistent) => {
59
+ beforeEach(() => {
60
+ jest.clearAllMocks();
61
+ mockFetchCommand.mockResolvedValue({
62
+ ok: true,
63
+ message: "a message",
64
+ id: "abcefg",
65
+ isPreexisting: false,
66
+ isPersistent,
67
+ });
68
+ });
69
+ it("should call p0 request with reason arg", () => __awaiter(void 0, void 0, void 0, function* () {
70
+ void (0, ssh_1.sshCommand)((0, yargs_1.default)()).parse(`ssh some-instance --reason reason`);
71
+ yield (0, util_1.sleep)(100);
72
+ const hiddenFilenameRequestArgs = (0, lodash_1.omit)(mockFetchCommand.mock.calls[0][1], "$0");
73
+ expect(hiddenFilenameRequestArgs).toMatchSnapshot("args");
74
+ }));
75
+ it("should wait for access grant", () => __awaiter(void 0, void 0, void 0, function* () {
76
+ const promise = (0, ssh_1.sshCommand)((0, yargs_1.default)()).parse(`ssh some-instance`);
77
+ const wait = (0, util_1.sleep)(100);
78
+ yield Promise.race([wait, promise]);
79
+ yield expect(wait).resolves.toBeUndefined();
80
+ }));
81
+ it("should wait for provisioning", () => __awaiter(void 0, void 0, void 0, function* () {
82
+ const promise = (0, ssh_1.sshCommand)((0, yargs_1.default)()).parse(`ssh some-instance`);
83
+ yield (0, util_1.sleep)(100); // Need to wait for listen before trigger in tests
84
+ firestore_2.onSnapshot.trigger({
85
+ status: "APPROVED",
86
+ });
87
+ const wait = (0, util_1.sleep)(100);
88
+ yield Promise.race([wait, promise]);
89
+ yield expect(wait).resolves.toBeUndefined();
90
+ }));
91
+ it("should call ssm", () => __awaiter(void 0, void 0, void 0, function* () {
92
+ const promise = (0, ssh_1.sshCommand)((0, yargs_1.default)()).parse(`ssh some-instance`);
93
+ yield (0, util_1.sleep)(100); // Need to wait for listen before trigger in tests
94
+ firestore_2.onSnapshot.trigger({
95
+ status: "APPROVED",
96
+ });
97
+ yield (0, util_1.sleep)(100); // Need to wait for listen before trigger in tests
98
+ firestore_2.onSnapshot.trigger({
99
+ status: "DONE",
100
+ });
101
+ yield expect(promise).resolves.toBeDefined();
102
+ expect(mockPrint2.mock.calls).toMatchSnapshot("stderr");
103
+ expect(mockPrint1).not.toHaveBeenCalled();
104
+ expect(mockSsm).toHaveBeenCalled();
105
+ }));
106
+ });
107
+ });
@@ -0,0 +1,11 @@
1
+ /** Copyright © 2024-present P0 Security
2
+
3
+ This file is part of @p0security/cli
4
+
5
+ @p0security/cli is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.
6
+
7
+ @p0security/cli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
+
9
+ You should have received a copy of the GNU General Public License along with @p0security/cli. If not, see <https://www.gnu.org/licenses/>.
10
+ **/
11
+ export declare const samlResponse = "<html>\n <body>\n <input name=\"SAMLResponse\" type=\"hidden\" value=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxzYW1sMnA6UmVzcG9uc2UgeG1sbnM6c2FtbDJwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgRGVzdGluYXRpb249Imh0dHBzOi8vc2lnbmluLmF3cy5hbWF6b24uY29tL3NhbWwiIElEPSJhYmMiIElzc3VlSW5zdGFudD0iMjAyNC0wMS0wMVQwMDowMDowMC4wMDBaIiBWZXJzaW9uPSIyLjAiPgogIDxzYW1sMjpJc3N1ZXIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6ZW50aXR5Ij5odHRwOi8vd3d3Lm9rdGEuY29tL2FiY2RlZjwvc2FtbDI6SXNzdWVyPgogIDxkczpTaWduYXR1cmUgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgogICAgPGRzOlNpZ25lZEluZm8+CiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+CiAgICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8+CiAgICAgIDxkczpSZWZlcmVuY2UgVVJJPSIjYWJjIj4KICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4KICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPgogICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyI+CiAgICAgICAgICAgIDxlYzpJbmNsdXNpdmVOYW1lc3BhY2VzIHhtbG5zOmVjPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiIFByZWZpeExpc3Q9InhzIi8+CiAgICAgICAgICA8L2RzOlRyYW5zZm9ybT4KICAgICAgICA8L2RzOlRyYW5zZm9ybXM+CiAgICAgICAgPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIvPgogICAgICAgIDxkczpEaWdlc3RWYWx1ZT5kaWdlc3Q8L2RzOkRpZ2VzdFZhbHVlPgogICAgICA8L2RzOlJlZmVyZW5jZT4KICAgIDwvZHM6U2lnbmVkSW5mbz4KICAgIDxkczpTaWduYXR1cmVWYWx1ZT5zaWduYXR1cmU8L2RzOlNpZ25hdHVyZVZhbHVlPgogICAgPGRzOktleUluZm8+CiAgICAgIDxkczpYNTA5RGF0YT4KICAgICAgICA8ZHM6WDUwOUNlcnRpZmljYXRlPmNlcnRpZmljYXRlPC9kczpYNTA5Q2VydGlmaWNhdGU+CiAgICAgIDwvZHM6WDUwOURhdGE+CiAgICA8L2RzOktleUluZm8+CiAgPC9kczpTaWduYXR1cmU+CiAgPHNhbWwycDpTdGF0dXMgeG1sbnM6c2FtbDJwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiPgogICAgPHNhbWwycDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz4KICA8L3NhbWwycDpTdGF0dXM+CiAgPHNhbWwyOkFzc2VydGlvbiB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBJRD0iYWJjIiBJc3N1ZUluc3RhbnQ9IjIwMjQtMDEtMDFUMDA6MDA6MDAuMDAwWiIgVmVyc2lvbj0iMi4wIj4KICAgIDxzYW1sMjpJc3N1ZXIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6ZW50aXR5Ij5odHRwOi8vd3d3Lm9rdGEuY29tL2FiY2RlZjwvc2FtbDI6SXNzdWVyPgogICAgPGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CiAgICAgIDxkczpTaWduZWRJbmZvPgogICAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+CiAgICAgICAgPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZHNpZy1tb3JlI3JzYS1zaGEyNTYiLz4KICAgICAgICA8ZHM6UmVmZXJlbmNlIFVSST0iI2lkODQ3NzcyOTk3NzUzMjMwMTkyNzA4ODcwOCI+CiAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4KICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+CiAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiPgogICAgICAgICAgICAgIDxlYzpJbmNsdXNpdmVOYW1lc3BhY2VzIHhtbG5zOmVjPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiIFByZWZpeExpc3Q9InhzIi8+CiAgICAgICAgICAgIDwvZHM6VHJhbnNmb3JtPgogICAgICAgICAgPC9kczpUcmFuc2Zvcm1zPgogICAgICAgICAgPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIvPgogICAgICAgICAgPGRzOkRpZ2VzdFZhbHVlPmRpZ2VzdDwvZHM6RGlnZXN0VmFsdWU+CiAgICAgICAgPC9kczpSZWZlcmVuY2U+CiAgICAgIDwvZHM6U2lnbmVkSW5mbz4KICAgICAgPGRzOlNpZ25hdHVyZVZhbHVlPnNpZ25hdHVyZTwvZHM6U2lnbmF0dXJlVmFsdWU+CiAgICAgIDxkczpLZXlJbmZvPgogICAgICAgIDxkczpYNTA5RGF0YT4KICAgICAgICAgIDxkczpYNTA5Q2VydGlmaWNhdGU+Y2VydGlmaWNhdGU8L2RzOlg1MDlDZXJ0aWZpY2F0ZT4KICAgICAgICA8L2RzOlg1MDlEYXRhPgogICAgICA8L2RzOktleUluZm8+CiAgICA8L2RzOlNpZ25hdHVyZT4KICAgIDxzYW1sMjpTdWJqZWN0IHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIj4KICAgICAgPHNhbWwyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnVuc3BlY2lmaWVkIj50ZXN0LXVzZXJAdGVzdC5jb208L3NhbWwyOk5hbWVJRD4KICAgICAgPHNhbWwyOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4KICAgICAgICA8c2FtbDI6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDI0LTAxLTAxVDAwOjAwOjAwLjAwMFoiIFJlY2lwaWVudD0iaHR0cHM6Ly9zaWduaW4uYXdzLmFtYXpvbi5jb20vc2FtbCIvPgogICAgICA8L3NhbWwyOlN1YmplY3RDb25maXJtYXRpb24+CiAgICA8L3NhbWwyOlN1YmplY3Q+CiAgICA8c2FtbDI6Q29uZGl0aW9ucyB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgTm90QmVmb3JlPSIyMDI0LTAxLTAxVDAwOjAwOjAwLjAwMFoiIE5vdE9uT3JBZnRlcj0iMjAyNC0wMS0wMVQwMDowMDowMC4wMDBaIj4KICAgICAgPHNhbWwyOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICAgICAgPHNhbWwyOkF1ZGllbmNlPnVybjphbWF6b246d2Vic2VydmljZXM8L3NhbWwyOkF1ZGllbmNlPgogICAgICA8L3NhbWwyOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICA8L3NhbWwyOkNvbmRpdGlvbnM+CiAgICA8c2FtbDI6QXV0aG5TdGF0ZW1lbnQgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIEF1dGhuSW5zdGFudD0iMjAyNC0wMS0wMVQwMDowMDowMC4wMDBaIiBTZXNzaW9uSW5kZXg9ImFiYyI+CiAgICAgIDxzYW1sMjpBdXRobkNvbnRleHQ+CiAgICAgICAgPHNhbWwyOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkUHJvdGVjdGVkVHJhbnNwb3J0PC9zYW1sMjpBdXRobkNvbnRleHRDbGFzc1JlZj4KICAgICAgPC9zYW1sMjpBdXRobkNvbnRleHQ+CiAgICA8L3NhbWwyOkF1dGhuU3RhdGVtZW50PgogICAgPHNhbWwyOkF0dHJpYnV0ZVN0YXRlbWVudCB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiI+CiAgICAgIDxzYW1sMjpBdHRyaWJ1dGUgTmFtZT0iaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9TQU1ML0F0dHJpYnV0ZXMvUm9sZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1cmkiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPmFybjphd3M6aWFtOjoxOnNhbWwtcHJvdmlkZXIvdGVzdF9va3RhLGFybjphd3M6aWFtOjoxOnJvbGUvUm9sZTE8L3NhbWwyOkF0dHJpYnV0ZVZhbHVlPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPmFybjphd3M6aWFtOjoxOnNhbWwtcHJvdmlkZXIvdGVzdF9va3RhLGFybjphd3M6aWFtOjoxOnJvbGUvUm9sZTI8L3NhbWwyOkF0dHJpYnV0ZVZhbHVlPgogICAgICA8L3NhbWwyOkF0dHJpYnV0ZT4KICAgICAgPHNhbWwyOkF0dHJpYnV0ZSBOYW1lPSJodHRwczovL2F3cy5hbWF6b24uY29tL1NBTUwvQXR0cmlidXRlcy9Sb2xlU2Vzc2lvbk5hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3QtdXNlckB0ZXN0LmNvbTwvc2FtbDI6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDI6QXR0cmlidXRlPgogICAgICA8c2FtbDI6QXR0cmlidXRlIE5hbWU9Imh0dHBzOi8vYXdzLmFtYXpvbi5jb20vU0FNTC9BdHRyaWJ1dGVzL1Nlc3Npb25EdXJhdGlvbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+CiAgICAgICAgPHNhbWwyOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+MzYwMDwvc2FtbDI6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDI6QXR0cmlidXRlPgogICAgICA8c2FtbDI6QXR0cmlidXRlIE5hbWU9Imh0dHBzOi8vYXdzLmFtYXpvbi5jb20vU0FNTC9BdHRyaWJ1dGVzL1ByaW5jaXBhbFRhZzpvcmciIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3Q8L3NhbWwyOkF0dHJpYnV0ZVZhbHVlPgogICAgICA8L3NhbWwyOkF0dHJpYnV0ZT4KICAgICAgPHNhbWwyOkF0dHJpYnV0ZSBOYW1lPSJodHRwczovL2F3cy5hbWF6b24uY29tL1NBTUwvQXR0cmlidXRlcy9Tb3VyY2VJZGVudGl0eSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1cmkiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3QtdXNlckB0ZXN0LmNvbTwvc2FtbDI6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDI6QXR0cmlidXRlPgogICAgPC9zYW1sMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ+CiAgPC9zYW1sMjpBc3NlcnRpb24+Cjwvc2FtbDJwOlJlc3BvbnNlPg==\" />\n </body>\n</html>";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.samlResponse = void 0;
4
+ /** Copyright © 2024-present P0 Security
5
+
6
+ This file is part of @p0security/cli
7
+
8
+ @p0security/cli is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.
9
+
10
+ @p0security/cli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
11
+
12
+ You should have received a copy of the GNU General Public License along with @p0security/cli. If not, see <https://www.gnu.org/licenses/>.
13
+ **/
14
+ exports.samlResponse = `<html>
15
+ <body>
16
+ <input name="SAMLResponse" type="hidden" value="PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxzYW1sMnA6UmVzcG9uc2UgeG1sbnM6c2FtbDJwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgRGVzdGluYXRpb249Imh0dHBzOi8vc2lnbmluLmF3cy5hbWF6b24uY29tL3NhbWwiIElEPSJhYmMiIElzc3VlSW5zdGFudD0iMjAyNC0wMS0wMVQwMDowMDowMC4wMDBaIiBWZXJzaW9uPSIyLjAiPgogIDxzYW1sMjpJc3N1ZXIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6ZW50aXR5Ij5odHRwOi8vd3d3Lm9rdGEuY29tL2FiY2RlZjwvc2FtbDI6SXNzdWVyPgogIDxkczpTaWduYXR1cmUgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgogICAgPGRzOlNpZ25lZEluZm8+CiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+CiAgICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8+CiAgICAgIDxkczpSZWZlcmVuY2UgVVJJPSIjYWJjIj4KICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4KICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPgogICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyI+CiAgICAgICAgICAgIDxlYzpJbmNsdXNpdmVOYW1lc3BhY2VzIHhtbG5zOmVjPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiIFByZWZpeExpc3Q9InhzIi8+CiAgICAgICAgICA8L2RzOlRyYW5zZm9ybT4KICAgICAgICA8L2RzOlRyYW5zZm9ybXM+CiAgICAgICAgPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIvPgogICAgICAgIDxkczpEaWdlc3RWYWx1ZT5kaWdlc3Q8L2RzOkRpZ2VzdFZhbHVlPgogICAgICA8L2RzOlJlZmVyZW5jZT4KICAgIDwvZHM6U2lnbmVkSW5mbz4KICAgIDxkczpTaWduYXR1cmVWYWx1ZT5zaWduYXR1cmU8L2RzOlNpZ25hdHVyZVZhbHVlPgogICAgPGRzOktleUluZm8+CiAgICAgIDxkczpYNTA5RGF0YT4KICAgICAgICA8ZHM6WDUwOUNlcnRpZmljYXRlPmNlcnRpZmljYXRlPC9kczpYNTA5Q2VydGlmaWNhdGU+CiAgICAgIDwvZHM6WDUwOURhdGE+CiAgICA8L2RzOktleUluZm8+CiAgPC9kczpTaWduYXR1cmU+CiAgPHNhbWwycDpTdGF0dXMgeG1sbnM6c2FtbDJwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiPgogICAgPHNhbWwycDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz4KICA8L3NhbWwycDpTdGF0dXM+CiAgPHNhbWwyOkFzc2VydGlvbiB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBJRD0iYWJjIiBJc3N1ZUluc3RhbnQ9IjIwMjQtMDEtMDFUMDA6MDA6MDAuMDAwWiIgVmVyc2lvbj0iMi4wIj4KICAgIDxzYW1sMjpJc3N1ZXIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6ZW50aXR5Ij5odHRwOi8vd3d3Lm9rdGEuY29tL2FiY2RlZjwvc2FtbDI6SXNzdWVyPgogICAgPGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CiAgICAgIDxkczpTaWduZWRJbmZvPgogICAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+CiAgICAgICAgPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZHNpZy1tb3JlI3JzYS1zaGEyNTYiLz4KICAgICAgICA8ZHM6UmVmZXJlbmNlIFVSST0iI2lkODQ3NzcyOTk3NzUzMjMwMTkyNzA4ODcwOCI+CiAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4KICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+CiAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiPgogICAgICAgICAgICAgIDxlYzpJbmNsdXNpdmVOYW1lc3BhY2VzIHhtbG5zOmVjPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiIFByZWZpeExpc3Q9InhzIi8+CiAgICAgICAgICAgIDwvZHM6VHJhbnNmb3JtPgogICAgICAgICAgPC9kczpUcmFuc2Zvcm1zPgogICAgICAgICAgPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIvPgogICAgICAgICAgPGRzOkRpZ2VzdFZhbHVlPmRpZ2VzdDwvZHM6RGlnZXN0VmFsdWU+CiAgICAgICAgPC9kczpSZWZlcmVuY2U+CiAgICAgIDwvZHM6U2lnbmVkSW5mbz4KICAgICAgPGRzOlNpZ25hdHVyZVZhbHVlPnNpZ25hdHVyZTwvZHM6U2lnbmF0dXJlVmFsdWU+CiAgICAgIDxkczpLZXlJbmZvPgogICAgICAgIDxkczpYNTA5RGF0YT4KICAgICAgICAgIDxkczpYNTA5Q2VydGlmaWNhdGU+Y2VydGlmaWNhdGU8L2RzOlg1MDlDZXJ0aWZpY2F0ZT4KICAgICAgICA8L2RzOlg1MDlEYXRhPgogICAgICA8L2RzOktleUluZm8+CiAgICA8L2RzOlNpZ25hdHVyZT4KICAgIDxzYW1sMjpTdWJqZWN0IHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIj4KICAgICAgPHNhbWwyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnVuc3BlY2lmaWVkIj50ZXN0LXVzZXJAdGVzdC5jb208L3NhbWwyOk5hbWVJRD4KICAgICAgPHNhbWwyOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4KICAgICAgICA8c2FtbDI6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDI0LTAxLTAxVDAwOjAwOjAwLjAwMFoiIFJlY2lwaWVudD0iaHR0cHM6Ly9zaWduaW4uYXdzLmFtYXpvbi5jb20vc2FtbCIvPgogICAgICA8L3NhbWwyOlN1YmplY3RDb25maXJtYXRpb24+CiAgICA8L3NhbWwyOlN1YmplY3Q+CiAgICA8c2FtbDI6Q29uZGl0aW9ucyB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgTm90QmVmb3JlPSIyMDI0LTAxLTAxVDAwOjAwOjAwLjAwMFoiIE5vdE9uT3JBZnRlcj0iMjAyNC0wMS0wMVQwMDowMDowMC4wMDBaIj4KICAgICAgPHNhbWwyOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICAgICAgPHNhbWwyOkF1ZGllbmNlPnVybjphbWF6b246d2Vic2VydmljZXM8L3NhbWwyOkF1ZGllbmNlPgogICAgICA8L3NhbWwyOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICA8L3NhbWwyOkNvbmRpdGlvbnM+CiAgICA8c2FtbDI6QXV0aG5TdGF0ZW1lbnQgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIEF1dGhuSW5zdGFudD0iMjAyNC0wMS0wMVQwMDowMDowMC4wMDBaIiBTZXNzaW9uSW5kZXg9ImFiYyI+CiAgICAgIDxzYW1sMjpBdXRobkNvbnRleHQ+CiAgICAgICAgPHNhbWwyOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkUHJvdGVjdGVkVHJhbnNwb3J0PC9zYW1sMjpBdXRobkNvbnRleHRDbGFzc1JlZj4KICAgICAgPC9zYW1sMjpBdXRobkNvbnRleHQ+CiAgICA8L3NhbWwyOkF1dGhuU3RhdGVtZW50PgogICAgPHNhbWwyOkF0dHJpYnV0ZVN0YXRlbWVudCB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiI+CiAgICAgIDxzYW1sMjpBdHRyaWJ1dGUgTmFtZT0iaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9TQU1ML0F0dHJpYnV0ZXMvUm9sZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1cmkiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPmFybjphd3M6aWFtOjoxOnNhbWwtcHJvdmlkZXIvdGVzdF9va3RhLGFybjphd3M6aWFtOjoxOnJvbGUvUm9sZTE8L3NhbWwyOkF0dHJpYnV0ZVZhbHVlPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPmFybjphd3M6aWFtOjoxOnNhbWwtcHJvdmlkZXIvdGVzdF9va3RhLGFybjphd3M6aWFtOjoxOnJvbGUvUm9sZTI8L3NhbWwyOkF0dHJpYnV0ZVZhbHVlPgogICAgICA8L3NhbWwyOkF0dHJpYnV0ZT4KICAgICAgPHNhbWwyOkF0dHJpYnV0ZSBOYW1lPSJodHRwczovL2F3cy5hbWF6b24uY29tL1NBTUwvQXR0cmlidXRlcy9Sb2xlU2Vzc2lvbk5hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3QtdXNlckB0ZXN0LmNvbTwvc2FtbDI6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDI6QXR0cmlidXRlPgogICAgICA8c2FtbDI6QXR0cmlidXRlIE5hbWU9Imh0dHBzOi8vYXdzLmFtYXpvbi5jb20vU0FNTC9BdHRyaWJ1dGVzL1Nlc3Npb25EdXJhdGlvbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+CiAgICAgICAgPHNhbWwyOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+MzYwMDwvc2FtbDI6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDI6QXR0cmlidXRlPgogICAgICA8c2FtbDI6QXR0cmlidXRlIE5hbWU9Imh0dHBzOi8vYXdzLmFtYXpvbi5jb20vU0FNTC9BdHRyaWJ1dGVzL1ByaW5jaXBhbFRhZzpvcmciIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3Q8L3NhbWwyOkF0dHJpYnV0ZVZhbHVlPgogICAgICA8L3NhbWwyOkF0dHJpYnV0ZT4KICAgICAgPHNhbWwyOkF0dHJpYnV0ZSBOYW1lPSJodHRwczovL2F3cy5hbWF6b24uY29tL1NBTUwvQXR0cmlidXRlcy9Tb3VyY2VJZGVudGl0eSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1cmkiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3QtdXNlckB0ZXN0LmNvbTwvc2FtbDI6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDI6QXR0cmlidXRlPgogICAgPC9zYW1sMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ+CiAgPC9zYW1sMjpBc3NlcnRpb24+Cjwvc2FtbDJwOlJlc3BvbnNlPg==" />
17
+ </body>
18
+ </html>`;
@@ -0,0 +1,11 @@
1
+ /** Copyright © 2024-present P0 Security
2
+
3
+ This file is part of @p0security/cli
4
+
5
+ @p0security/cli is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.
6
+
7
+ @p0security/cli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
+
9
+ You should have received a copy of the GNU General Public License along with @p0security/cli. If not, see <https://www.gnu.org/licenses/>.
10
+ **/
11
+ export declare const stsResponse = "<AssumeRoleWithSAMLResponse xmlns=\"https://sts.amazonaws.com/doc/2011-06-15/\">\n<AssumeRoleWithSAMLResult>\n <Audience>https://signin.aws.amazon.com/saml</Audience>\n <AssumedRoleUser>\n <AssumedRoleId>ABCDEFGHIJLMNOPQRST:test-user@test.com</AssumedRoleId>\n <Arn>arn:aws:sts::1:assumed-role/Role1/test-user@test.com</Arn>\n </AssumedRoleUser>\n <Credentials>\n <AccessKeyId>test-access-key</AccessKeyId>\n <SecretAccessKey>secret-access-key</SecretAccessKey>\n <SessionToken>session-token</SessionToken>\n <Expiration>2024-02-22T00:18:21Z</Expiration>\n </Credentials>\n <Subject>test-user@test.com</Subject>\n <NameQualifier>abcdefghijklmnop</NameQualifier>\n <SourceIdentity>test-user@test.com</SourceIdentity>\n <PackedPolicySize>2</PackedPolicySize>\n <SubjectType>unspecified</SubjectType>\n <Issuer>http://www.okta.com/abc</Issuer>\n</AssumeRoleWithSAMLResult>\n<ResponseMetadata>\n <RequestId>f5b94ad4-f322-4d7b-b568-84f2ec184cd7</RequestId>\n</ResponseMetadata>\n</AssumeRoleWithSAMLResponse>";