@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.
- package/CONTRIBUTING.md +23 -0
- package/LICENSE.md +675 -0
- package/README.md +201 -0
- package/dist/commands/__tests__/login.test.d.ts +1 -0
- package/dist/commands/__tests__/login.test.js +75 -0
- package/dist/commands/__tests__/ls.test.d.ts +1 -0
- package/dist/commands/__tests__/ls.test.js +84 -0
- package/dist/commands/__tests__/request.test.d.ts +1 -0
- package/dist/commands/__tests__/request.test.js +94 -0
- package/dist/commands/__tests__/ssh.test.d.ts +1 -0
- package/dist/commands/__tests__/ssh.test.js +107 -0
- package/dist/commands/aws/__tests__/__input__/saml-response.d.ts +11 -0
- package/dist/commands/aws/__tests__/__input__/saml-response.js +18 -0
- package/dist/commands/aws/__tests__/__input__/sts-response.d.ts +11 -0
- package/dist/commands/aws/__tests__/__input__/sts-response.js +37 -0
- package/dist/commands/aws/__tests__/role.test.d.ts +1 -0
- package/dist/commands/aws/__tests__/role.test.js +98 -0
- package/dist/commands/aws/index.d.ts +4 -0
- package/dist/commands/aws/index.js +26 -0
- package/dist/commands/aws/role.d.ts +27 -0
- package/dist/commands/aws/role.js +123 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.js +49 -0
- package/dist/commands/login.d.ts +14 -0
- package/dist/commands/login.js +93 -0
- package/dist/commands/ls.d.ts +4 -0
- package/dist/commands/ls.js +78 -0
- package/dist/commands/request.d.ts +12 -0
- package/dist/commands/request.js +116 -0
- package/dist/commands/ssh.d.ts +11 -0
- package/dist/commands/ssh.js +154 -0
- package/dist/common/auth/oidc.d.ts +4 -0
- package/dist/common/auth/oidc.js +18 -0
- package/dist/common/auth/server.d.ts +15 -0
- package/dist/common/auth/server.js +73 -0
- package/dist/common/fetch.d.ts +16 -0
- package/dist/common/fetch.js +39 -0
- package/dist/common/mime.d.ts +14 -0
- package/dist/common/mime.js +17 -0
- package/dist/common/xml.d.ts +21 -0
- package/dist/common/xml.js +52 -0
- package/dist/drivers/__mocks__/auth.d.ts +30 -0
- package/dist/drivers/__mocks__/auth.js +46 -0
- package/dist/drivers/api.d.ts +3 -0
- package/dist/drivers/api.js +69 -0
- package/dist/drivers/auth.d.ts +11 -0
- package/dist/drivers/auth.js +122 -0
- package/dist/drivers/env.d.ts +15 -0
- package/dist/drivers/env.js +38 -0
- package/dist/drivers/firestore.d.ts +10 -0
- package/dist/drivers/firestore.js +53 -0
- package/dist/drivers/stdio.d.ts +25 -0
- package/dist/drivers/stdio.js +44 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +23 -0
- package/dist/middlewares/version.d.ts +8 -0
- package/dist/middlewares/version.js +77 -0
- package/dist/plugins/__mocks__/login.d.ts +14 -0
- package/dist/plugins/__mocks__/login.js +24 -0
- package/dist/plugins/aws/__mocks__/assumeRole.d.ts +12 -0
- package/dist/plugins/aws/__mocks__/assumeRole.js +20 -0
- package/dist/plugins/aws/api.d.ts +12 -0
- package/dist/plugins/aws/api.js +16 -0
- package/dist/plugins/aws/assumeRole.d.ts +14 -0
- package/dist/plugins/aws/assumeRole.js +55 -0
- package/dist/plugins/aws/config.d.ts +5 -0
- package/dist/plugins/aws/config.js +38 -0
- package/dist/plugins/aws/ssm/index.d.ts +18 -0
- package/dist/plugins/aws/ssm/index.js +274 -0
- package/dist/plugins/aws/ssm/install.d.ts +7 -0
- package/dist/plugins/aws/ssm/install.js +133 -0
- package/dist/plugins/aws/types.d.ts +54 -0
- package/dist/plugins/aws/types.js +2 -0
- package/dist/plugins/google/login.d.ts +2 -0
- package/dist/plugins/google/login.js +76 -0
- package/dist/plugins/login.d.ts +13 -0
- package/dist/plugins/login.js +19 -0
- package/dist/plugins/okta/aws.d.ts +5 -0
- package/dist/plugins/okta/aws.js +42 -0
- package/dist/plugins/okta/login.d.ts +8 -0
- package/dist/plugins/okta/login.js +165 -0
- package/dist/plugins/ssh/types.d.ts +22 -0
- package/dist/plugins/ssh/types.js +2 -0
- package/dist/public/favicon.ico +0 -0
- package/dist/public/redirect-landing.html +40 -0
- package/dist/testing/firestore.d.ts +2 -0
- package/dist/testing/firestore.js +16 -0
- package/dist/testing/yargs.d.ts +12 -0
- package/dist/testing/yargs.js +23 -0
- package/dist/types/identity.d.ts +23 -0
- package/dist/types/identity.js +2 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.js +15 -0
- package/dist/types/oidc.d.ts +41 -0
- package/dist/types/oidc.js +2 -0
- package/dist/types/org.d.ts +20 -0
- package/dist/types/org.js +2 -0
- package/dist/types/request.d.ts +35 -0
- package/dist/types/request.js +20 -0
- package/dist/util.d.ts +42 -0
- package/dist/util.js +87 -0
- package/p0 +16 -0
- 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>";
|