prismor 0.1.0__py3-none-any.whl
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.
- prismor/__init__.py +6 -0
- prismor/api.py +118 -0
- prismor/cli.py +210 -0
- prismor-0.1.0.dist-info/METADATA +371 -0
- prismor-0.1.0.dist-info/RECORD +9 -0
- prismor-0.1.0.dist-info/WHEEL +5 -0
- prismor-0.1.0.dist-info/entry_points.txt +2 -0
- prismor-0.1.0.dist-info/licenses/LICENSE +22 -0
- prismor-0.1.0.dist-info/top_level.txt +1 -0
prismor/__init__.py
ADDED
prismor/api.py
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""API client for Prismor security scanning service."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import requests
|
|
5
|
+
from typing import Optional, Dict, Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PrismorAPIError(Exception):
|
|
9
|
+
"""Custom exception for Prismor API errors."""
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PrismorClient:
|
|
14
|
+
"""Client for interacting with Prismor API."""
|
|
15
|
+
|
|
16
|
+
def __init__(self, api_key: Optional[str] = None):
|
|
17
|
+
"""Initialize the Prismor API client.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
api_key: Prismor API key. If not provided, will look for PRISMOR_API_KEY env var.
|
|
21
|
+
"""
|
|
22
|
+
self.api_key = api_key or os.environ.get("PRISMOR_API_KEY")
|
|
23
|
+
if not self.api_key:
|
|
24
|
+
raise PrismorAPIError(
|
|
25
|
+
"PRISMOR_API_KEY environment variable is not set. "
|
|
26
|
+
"Please set it with: export PRISMOR_API_KEY=your_api_key"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
self.base_url = "https://api.prismor.dev"
|
|
30
|
+
self.headers = {
|
|
31
|
+
"Authorization": f"Bearer {self.api_key}",
|
|
32
|
+
"Content-Type": "application/json"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
def normalize_repo_url(self, repo: str) -> str:
|
|
36
|
+
"""Normalize repository input to a full GitHub URL.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
repo: Repository in format 'username/repo' or full GitHub URL
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
Full GitHub repository URL
|
|
43
|
+
"""
|
|
44
|
+
if repo.startswith("http://") or repo.startswith("https://"):
|
|
45
|
+
return repo
|
|
46
|
+
|
|
47
|
+
# Assume it's in username/repo format
|
|
48
|
+
if "/" in repo:
|
|
49
|
+
return f"https://github.com/{repo}"
|
|
50
|
+
|
|
51
|
+
raise PrismorAPIError(
|
|
52
|
+
f"Invalid repository format: {repo}. "
|
|
53
|
+
"Please use 'username/repo' or full GitHub URL"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
def scan(
|
|
57
|
+
self,
|
|
58
|
+
repo: str,
|
|
59
|
+
vex: bool = False,
|
|
60
|
+
sbom: bool = False,
|
|
61
|
+
detect_secret: bool = False,
|
|
62
|
+
fullscan: bool = False
|
|
63
|
+
) -> Dict[str, Any]:
|
|
64
|
+
"""Perform security scan on a GitHub repository.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
repo: Repository URL or username/repo format
|
|
68
|
+
vex: Enable vulnerability scanning
|
|
69
|
+
sbom: Enable SBOM generation
|
|
70
|
+
detect_secret: Enable secret detection
|
|
71
|
+
fullscan: Enable all scan types
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
Dictionary containing scan results
|
|
75
|
+
"""
|
|
76
|
+
repo_url = self.normalize_repo_url(repo)
|
|
77
|
+
|
|
78
|
+
# Prepare request payload
|
|
79
|
+
payload = {
|
|
80
|
+
"repo_url": repo_url,
|
|
81
|
+
"vex": vex or fullscan,
|
|
82
|
+
"sbom": sbom or fullscan,
|
|
83
|
+
"detect_secret": detect_secret or fullscan,
|
|
84
|
+
"fullscan": fullscan
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
try:
|
|
88
|
+
response = requests.post(
|
|
89
|
+
f"{self.base_url}/scan",
|
|
90
|
+
json=payload,
|
|
91
|
+
headers=self.headers,
|
|
92
|
+
timeout=300 # 5 minute timeout
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
if response.status_code == 401:
|
|
96
|
+
raise PrismorAPIError("Invalid API key. Please check your PRISMOR_API_KEY.")
|
|
97
|
+
|
|
98
|
+
if response.status_code == 404:
|
|
99
|
+
raise PrismorAPIError("API endpoint not found. Please check the API URL.")
|
|
100
|
+
|
|
101
|
+
if response.status_code >= 400:
|
|
102
|
+
error_msg = response.json().get("error", "Unknown error")
|
|
103
|
+
raise PrismorAPIError(f"API error: {error_msg}")
|
|
104
|
+
|
|
105
|
+
response.raise_for_status()
|
|
106
|
+
return response.json()
|
|
107
|
+
|
|
108
|
+
except requests.exceptions.Timeout:
|
|
109
|
+
raise PrismorAPIError(
|
|
110
|
+
"Request timed out. The repository scan is taking longer than expected."
|
|
111
|
+
)
|
|
112
|
+
except requests.exceptions.ConnectionError:
|
|
113
|
+
raise PrismorAPIError(
|
|
114
|
+
"Failed to connect to Prismor API. Please check your internet connection."
|
|
115
|
+
)
|
|
116
|
+
except requests.exceptions.RequestException as e:
|
|
117
|
+
raise PrismorAPIError(f"Request failed: {str(e)}")
|
|
118
|
+
|
prismor/cli.py
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"""Command-line interface for Prismor security scanning tool."""
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
import json
|
|
5
|
+
import click
|
|
6
|
+
from typing import Optional
|
|
7
|
+
from .api import PrismorClient, PrismorAPIError
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def print_success(message: str):
|
|
11
|
+
"""Print success message in green."""
|
|
12
|
+
click.secho(f"✓ {message}", fg="green")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def print_error(message: str):
|
|
16
|
+
"""Print error message in red."""
|
|
17
|
+
click.secho(f"✗ {message}", fg="red", err=True)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def print_info(message: str):
|
|
21
|
+
"""Print info message in blue."""
|
|
22
|
+
click.secho(f"ℹ {message}", fg="blue")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def print_warning(message: str):
|
|
26
|
+
"""Print warning message in yellow."""
|
|
27
|
+
click.secho(f"⚠ {message}", fg="yellow")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def format_scan_results(results: dict, scan_type: str):
|
|
31
|
+
"""Format and display scan results."""
|
|
32
|
+
click.echo("\n" + "=" * 60)
|
|
33
|
+
click.secho(f" Scan Results - {scan_type}", fg="cyan", bold=True)
|
|
34
|
+
click.echo("=" * 60 + "\n")
|
|
35
|
+
|
|
36
|
+
# Display repository information
|
|
37
|
+
if "repository" in results:
|
|
38
|
+
click.secho("Repository:", fg="yellow", bold=True)
|
|
39
|
+
click.echo(f" {results['repository']}\n")
|
|
40
|
+
|
|
41
|
+
# Display scan status
|
|
42
|
+
if "status" in results:
|
|
43
|
+
status_color = "green" if results["status"] == "success" else "red"
|
|
44
|
+
click.secho(f"Status: ", fg="yellow", bold=True, nl=False)
|
|
45
|
+
click.secho(results["status"], fg=status_color)
|
|
46
|
+
click.echo()
|
|
47
|
+
|
|
48
|
+
# Display scan results based on type
|
|
49
|
+
if "scan_results" in results:
|
|
50
|
+
scan_data = results["scan_results"]
|
|
51
|
+
|
|
52
|
+
# Vulnerability scan results
|
|
53
|
+
if "vulnerabilities" in scan_data or "Results" in scan_data:
|
|
54
|
+
click.secho("Vulnerabilities Found:", fg="yellow", bold=True)
|
|
55
|
+
vuln_data = scan_data.get("vulnerabilities", scan_data.get("Results", []))
|
|
56
|
+
if isinstance(vuln_data, list):
|
|
57
|
+
click.echo(f" Total: {len(vuln_data)}")
|
|
58
|
+
else:
|
|
59
|
+
click.echo(f" Data available in detailed output")
|
|
60
|
+
click.echo()
|
|
61
|
+
|
|
62
|
+
# Secret scan results
|
|
63
|
+
if "secrets" in scan_data or "findings_summary" in scan_data:
|
|
64
|
+
click.secho("Secrets Detected:", fg="yellow", bold=True)
|
|
65
|
+
secrets = scan_data.get("secrets", scan_data.get("findings_summary", {}))
|
|
66
|
+
if isinstance(secrets, dict):
|
|
67
|
+
for key, value in secrets.items():
|
|
68
|
+
click.echo(f" {key}: {value}")
|
|
69
|
+
else:
|
|
70
|
+
click.echo(f" {len(secrets) if isinstance(secrets, list) else 'Data available'}")
|
|
71
|
+
click.echo()
|
|
72
|
+
|
|
73
|
+
# SBOM results
|
|
74
|
+
if "sbom" in scan_data or "artifacts" in scan_data:
|
|
75
|
+
click.secho("SBOM Generated:", fg="yellow", bold=True)
|
|
76
|
+
sbom_data = scan_data.get("sbom", scan_data.get("artifacts", []))
|
|
77
|
+
if isinstance(sbom_data, list):
|
|
78
|
+
click.echo(f" Total artifacts: {len(sbom_data)}")
|
|
79
|
+
else:
|
|
80
|
+
click.echo(f" SBOM data available")
|
|
81
|
+
click.echo()
|
|
82
|
+
|
|
83
|
+
# Display result URLs if available
|
|
84
|
+
if "public_url" in results:
|
|
85
|
+
click.secho("Results URL:", fg="yellow", bold=True)
|
|
86
|
+
click.echo(f" {results['public_url']}\n")
|
|
87
|
+
|
|
88
|
+
if "presigned_url" in results:
|
|
89
|
+
click.secho("Download URL:", fg="yellow", bold=True)
|
|
90
|
+
click.echo(f" {results['presigned_url']}\n")
|
|
91
|
+
|
|
92
|
+
click.echo("=" * 60 + "\n")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@click.group(invoke_without_command=True)
|
|
96
|
+
@click.option(
|
|
97
|
+
"--scan",
|
|
98
|
+
type=str,
|
|
99
|
+
help="Repository to scan (username/repo or full GitHub URL)"
|
|
100
|
+
)
|
|
101
|
+
@click.option("--vex", is_flag=True, help="Perform vulnerability scanning")
|
|
102
|
+
@click.option("--sbom", is_flag=True, help="Generate Software Bill of Materials")
|
|
103
|
+
@click.option("--detect-secret", is_flag=True, help="Detect secrets in repository")
|
|
104
|
+
@click.option("--fullscan", is_flag=True, help="Perform all scan types")
|
|
105
|
+
@click.option("--json", "output_json", is_flag=True, help="Output results in JSON format")
|
|
106
|
+
@click.version_option(version="0.1.0", prog_name="prismor")
|
|
107
|
+
@click.pass_context
|
|
108
|
+
def cli(ctx, scan: Optional[str], vex: bool, sbom: bool, detect_secret: bool,
|
|
109
|
+
fullscan: bool, output_json: bool):
|
|
110
|
+
"""Prismor CLI - Security scanning tool for GitHub repositories.
|
|
111
|
+
|
|
112
|
+
Examples:
|
|
113
|
+
prismor --scan username/repo --vex
|
|
114
|
+
prismor --scan username/repo --fullscan
|
|
115
|
+
prismor --scan https://github.com/username/repo --detect-secret
|
|
116
|
+
"""
|
|
117
|
+
# If no command and no scan option, show help
|
|
118
|
+
if ctx.invoked_subcommand is None and not scan:
|
|
119
|
+
click.echo(ctx.get_help())
|
|
120
|
+
return
|
|
121
|
+
|
|
122
|
+
# If scan option is provided, perform the scan
|
|
123
|
+
if scan:
|
|
124
|
+
# Check if at least one scan type is selected
|
|
125
|
+
if not any([vex, sbom, detect_secret, fullscan]):
|
|
126
|
+
print_error("Please specify at least one scan type: --vex, --sbom, --detect-secret, or --fullscan")
|
|
127
|
+
sys.exit(1)
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
# Initialize API client
|
|
131
|
+
print_info(f"Initializing Prismor scan for: {scan}")
|
|
132
|
+
client = PrismorClient()
|
|
133
|
+
|
|
134
|
+
# Determine scan type for display
|
|
135
|
+
scan_types = []
|
|
136
|
+
if fullscan:
|
|
137
|
+
scan_types.append("Full Scan (VEX + SBOM + Secret Detection)")
|
|
138
|
+
else:
|
|
139
|
+
if vex:
|
|
140
|
+
scan_types.append("VEX")
|
|
141
|
+
if sbom:
|
|
142
|
+
scan_types.append("SBOM")
|
|
143
|
+
if detect_secret:
|
|
144
|
+
scan_types.append("Secret Detection")
|
|
145
|
+
|
|
146
|
+
print_info(f"Scan type: {', '.join(scan_types)}")
|
|
147
|
+
print_info("Starting scan... (this may take a few minutes)")
|
|
148
|
+
|
|
149
|
+
# Perform scan
|
|
150
|
+
results = client.scan(
|
|
151
|
+
repo=scan,
|
|
152
|
+
vex=vex,
|
|
153
|
+
sbom=sbom,
|
|
154
|
+
detect_secret=detect_secret,
|
|
155
|
+
fullscan=fullscan
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
# Output results
|
|
159
|
+
if output_json:
|
|
160
|
+
click.echo(json.dumps(results, indent=2))
|
|
161
|
+
else:
|
|
162
|
+
print_success("Scan completed successfully!")
|
|
163
|
+
format_scan_results(results, ', '.join(scan_types))
|
|
164
|
+
|
|
165
|
+
except PrismorAPIError as e:
|
|
166
|
+
print_error(str(e))
|
|
167
|
+
sys.exit(1)
|
|
168
|
+
except Exception as e:
|
|
169
|
+
print_error(f"Unexpected error: {str(e)}")
|
|
170
|
+
sys.exit(1)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
@cli.command()
|
|
174
|
+
def version():
|
|
175
|
+
"""Display the version of Prismor CLI."""
|
|
176
|
+
click.echo("Prismor CLI v0.1.0")
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
@cli.command()
|
|
180
|
+
def config():
|
|
181
|
+
"""Display current configuration."""
|
|
182
|
+
import os
|
|
183
|
+
|
|
184
|
+
click.echo("\n" + "=" * 60)
|
|
185
|
+
click.secho(" Prismor CLI Configuration", fg="cyan", bold=True)
|
|
186
|
+
click.echo("=" * 60 + "\n")
|
|
187
|
+
|
|
188
|
+
# Check API key
|
|
189
|
+
api_key = os.environ.get("PRISMOR_API_KEY")
|
|
190
|
+
if api_key:
|
|
191
|
+
# Show only first and last 4 characters
|
|
192
|
+
masked_key = f"{api_key[:4]}...{api_key[-4:]}" if len(api_key) > 8 else "***"
|
|
193
|
+
print_success(f"PRISMOR_API_KEY: {masked_key}")
|
|
194
|
+
else:
|
|
195
|
+
print_error("PRISMOR_API_KEY: Not set")
|
|
196
|
+
click.echo("\nTo set your API key, run:")
|
|
197
|
+
click.echo(" export PRISMOR_API_KEY=your_api_key")
|
|
198
|
+
|
|
199
|
+
click.echo("\nAPI Endpoint: https://api.prismor.dev")
|
|
200
|
+
click.echo("=" * 60 + "\n")
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def main():
|
|
204
|
+
"""Entry point for the CLI."""
|
|
205
|
+
cli()
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
if __name__ == "__main__":
|
|
209
|
+
main()
|
|
210
|
+
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: prismor
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A CLI tool for scanning GitHub repositories for vulnerabilities, secrets, and generating SBOMs
|
|
5
|
+
Home-page: https://github.com/PrismorSec/prismor-cli
|
|
6
|
+
Author: Prismor
|
|
7
|
+
Author-email: support@prismor.dev
|
|
8
|
+
Project-URL: Bug Reports, https://github.com/PrismorSec/prismor-cli/issues
|
|
9
|
+
Project-URL: Source, https://github.com/PrismorSec/prismor-cli
|
|
10
|
+
Project-URL: Documentation, https://docs.prismor.dev
|
|
11
|
+
Project-URL: Homepage, https://prismor.dev
|
|
12
|
+
Keywords: security scanning vulnerability sbom secrets github
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Topic :: Security
|
|
16
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.7
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
25
|
+
Requires-Python: >=3.7
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: click>=8.0.0
|
|
29
|
+
Requires-Dist: requests>=2.25.0
|
|
30
|
+
Dynamic: author
|
|
31
|
+
Dynamic: author-email
|
|
32
|
+
Dynamic: classifier
|
|
33
|
+
Dynamic: description
|
|
34
|
+
Dynamic: description-content-type
|
|
35
|
+
Dynamic: home-page
|
|
36
|
+
Dynamic: keywords
|
|
37
|
+
Dynamic: license-file
|
|
38
|
+
Dynamic: project-url
|
|
39
|
+
Dynamic: requires-dist
|
|
40
|
+
Dynamic: requires-python
|
|
41
|
+
Dynamic: summary
|
|
42
|
+
|
|
43
|
+
# Prismor CLI
|
|
44
|
+
|
|
45
|
+
A powerful command-line tool for scanning GitHub repositories for security vulnerabilities, secrets, and generating Software Bill of Materials (SBOM).
|
|
46
|
+
|
|
47
|
+
**Get started at [https://prismor.dev](https://prismor.dev)** - Sign up for free to get your API key and access full dashboarding and analysis features!
|
|
48
|
+
|
|
49
|
+
## Features
|
|
50
|
+
|
|
51
|
+
- 🔍 **Vulnerability Scanning (VEX)** - Detect security vulnerabilities in your codebase
|
|
52
|
+
- 🔐 **Secret Detection** - Find exposed secrets, API keys, and credentials
|
|
53
|
+
- 📦 **SBOM Generation** - Generate comprehensive Software Bill of Materials
|
|
54
|
+
- ⚡ **Full Scan** - Run all security checks in one command
|
|
55
|
+
- 🎨 **Beautiful CLI Output** - Colorful, easy-to-read results
|
|
56
|
+
- 🔗 **Flexible Repository Input** - Support for `username/repo` or full GitHub URLs
|
|
57
|
+
|
|
58
|
+
## Quick Start
|
|
59
|
+
|
|
60
|
+
1. **Sign up** at [https://prismor.dev](https://prismor.dev)
|
|
61
|
+
2. **Generate your API Key** from the dashboard
|
|
62
|
+
3. **Install** the CLI: `pip install prismor`
|
|
63
|
+
4. **Set your API key**: `export PRISMOR_API_KEY=your_api_key`
|
|
64
|
+
5. **Run your first scan**: `prismor --scan username/repo --fullscan`
|
|
65
|
+
|
|
66
|
+
For the complete analysis with dashboards and reports, visit [Prismor.dev](https://prismor.dev) after running scans!
|
|
67
|
+
|
|
68
|
+
## Installation
|
|
69
|
+
|
|
70
|
+
Install Prismor CLI via pip:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
pip install prismor
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Prerequisites
|
|
77
|
+
|
|
78
|
+
### Getting Your API Key
|
|
79
|
+
|
|
80
|
+
Before using Prismor CLI, you need to get your API key from [Prismor.dev](https://prismor.dev):
|
|
81
|
+
|
|
82
|
+
1. Visit [https://prismor.dev](https://prismor.dev)
|
|
83
|
+
2. **Sign up** for a free account
|
|
84
|
+
3. Navigate to your dashboard
|
|
85
|
+
4. **Generate an API Key**
|
|
86
|
+
5. Copy your API key
|
|
87
|
+
|
|
88
|
+
### Setting Up Your API Key
|
|
89
|
+
|
|
90
|
+
Once you have your API key, set it as an environment variable:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
export PRISMOR_API_KEY=your_api_key_here
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
To make this permanent, add it to your shell configuration file (`~/.bashrc`, `~/.zshrc`, etc.):
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
echo 'export PRISMOR_API_KEY=your_api_key_here' >> ~/.zshrc
|
|
100
|
+
source ~/.zshrc
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Private Repositories
|
|
104
|
+
|
|
105
|
+
To scan **private repositories**, you need to integrate your GitHub account:
|
|
106
|
+
|
|
107
|
+
1. Go to [Prismor.dev](https://prismor.dev)
|
|
108
|
+
2. Navigate to **Settings** or **Integrations**
|
|
109
|
+
3. **Connect your GitHub account**
|
|
110
|
+
4. Authorize Prismor to access your private repositories
|
|
111
|
+
|
|
112
|
+
This allows Prismor to securely access and scan your private repositories.
|
|
113
|
+
|
|
114
|
+
## Usage
|
|
115
|
+
|
|
116
|
+
### Basic Syntax
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
prismor --scan <repository> [scan-type]
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Repository Format
|
|
123
|
+
|
|
124
|
+
You can specify repositories in two ways:
|
|
125
|
+
|
|
126
|
+
1. **Username/Repository format:**
|
|
127
|
+
```bash
|
|
128
|
+
prismor --scan Ar9av/trychai-web-revamped --fullscan
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
2. **Full GitHub URL:**
|
|
132
|
+
```bash
|
|
133
|
+
prismor --scan https://github.com/Ar9av/trychai-web-revamped --fullscan
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Scan Types
|
|
137
|
+
|
|
138
|
+
#### 1. Vulnerability Scanning (VEX)
|
|
139
|
+
|
|
140
|
+
Scan for security vulnerabilities in your dependencies and code:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
prismor --scan myrepository --vex
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### 2. Secret Detection
|
|
147
|
+
|
|
148
|
+
Detect exposed secrets, API keys, passwords, and other sensitive information:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
prismor --scan myrepository --detect-secret
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
#### 3. SBOM Generation
|
|
155
|
+
|
|
156
|
+
Generate a Software Bill of Materials for your repository:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
prismor --scan myrepository --sbom
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
#### 4. Full Scan
|
|
163
|
+
|
|
164
|
+
Run all security checks (VEX + Secret Detection + SBOM):
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
prismor --scan myrepository --fullscan
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Multiple Scan Types
|
|
171
|
+
|
|
172
|
+
You can combine multiple scan types:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
prismor --scan myrepository --vex --detect-secret
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### JSON Output
|
|
179
|
+
|
|
180
|
+
Get results in JSON format for automation and integration:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
prismor --scan myrepository --fullscan --json
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Examples
|
|
187
|
+
|
|
188
|
+
### Example 1: Quick Vulnerability Scan
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
prismor --scan facebook/react --vex
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Example 2: Comprehensive Security Audit
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
prismor --scan https://github.com/microsoft/vscode --fullscan
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Example 3: Secret Detection Only
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
prismor --scan openai/gpt-3 --detect-secret
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Example 4: SBOM Generation with JSON Output
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
prismor --scan kubernetes/kubernetes --sbom --json > sbom-results.json
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Additional Commands
|
|
213
|
+
|
|
214
|
+
### Check Configuration
|
|
215
|
+
|
|
216
|
+
View your current Prismor CLI configuration:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
prismor config
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Version Information
|
|
223
|
+
|
|
224
|
+
Display the version of Prismor CLI:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
prismor version
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Or:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
prismor --version
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Help
|
|
237
|
+
|
|
238
|
+
Get help and see all available options:
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
prismor --help
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Output
|
|
245
|
+
|
|
246
|
+
Prismor CLI provides clear, colorful output with:
|
|
247
|
+
|
|
248
|
+
- ✓ Success indicators
|
|
249
|
+
- ✗ Error messages
|
|
250
|
+
- ℹ Information updates
|
|
251
|
+
- ⚠ Warnings
|
|
252
|
+
- Detailed scan results including:
|
|
253
|
+
- Repository information
|
|
254
|
+
- Vulnerability counts
|
|
255
|
+
- Secret detection findings
|
|
256
|
+
- SBOM artifact counts
|
|
257
|
+
- Download links for detailed reports
|
|
258
|
+
|
|
259
|
+
## Full Analysis & Dashboarding
|
|
260
|
+
|
|
261
|
+
For comprehensive analysis and visualization of your scan results, visit the **[Prismor Dashboard](https://prismor.dev)**:
|
|
262
|
+
|
|
263
|
+
### Features Available on Prismor.dev:
|
|
264
|
+
- 📊 **Interactive Dashboards** - Visualize security trends and metrics
|
|
265
|
+
- 📈 **Historical Analysis** - Track vulnerabilities over time
|
|
266
|
+
- 🎯 **Detailed Reports** - In-depth analysis of all findings
|
|
267
|
+
- 🔔 **Alerts & Notifications** - Get notified of critical issues
|
|
268
|
+
- 👥 **Team Collaboration** - Share reports with your team
|
|
269
|
+
- 🔄 **CI/CD Integration** - Automate scans in your pipeline
|
|
270
|
+
- 📁 **Repository Management** - Manage multiple repositories in one place
|
|
271
|
+
|
|
272
|
+
### Accessing Full Reports:
|
|
273
|
+
|
|
274
|
+
After running a scan with the CLI, you can:
|
|
275
|
+
|
|
276
|
+
1. Visit [https://prismor.dev](https://prismor.dev)
|
|
277
|
+
2. Log into your dashboard
|
|
278
|
+
3. View all your scan results with rich visualizations
|
|
279
|
+
4. Export reports in various formats
|
|
280
|
+
5. Set up automated scanning schedules
|
|
281
|
+
|
|
282
|
+
The CLI provides quick results in your terminal, while the web dashboard offers comprehensive analysis and long-term security monitoring.
|
|
283
|
+
|
|
284
|
+
## API Information
|
|
285
|
+
|
|
286
|
+
Prismor CLI communicates with the Prismor API at `https://api.prismor.dev`. The CLI handles:
|
|
287
|
+
|
|
288
|
+
- Authentication via API key
|
|
289
|
+
- Request formatting
|
|
290
|
+
- Error handling
|
|
291
|
+
- Response parsing
|
|
292
|
+
- Result presentation
|
|
293
|
+
|
|
294
|
+
## Troubleshooting
|
|
295
|
+
|
|
296
|
+
### API Key Not Set
|
|
297
|
+
|
|
298
|
+
If you see an error about `PRISMOR_API_KEY` not being set:
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
export PRISMOR_API_KEY=your_api_key_here
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Invalid Repository Format
|
|
305
|
+
|
|
306
|
+
Ensure your repository is in one of these formats:
|
|
307
|
+
- `username/repository`
|
|
308
|
+
- `https://github.com/username/repository`
|
|
309
|
+
|
|
310
|
+
### Connection Issues
|
|
311
|
+
|
|
312
|
+
If you experience connection issues:
|
|
313
|
+
1. Check your internet connection
|
|
314
|
+
2. Verify the API endpoint is accessible
|
|
315
|
+
3. Ensure your API key is valid
|
|
316
|
+
|
|
317
|
+
## Development
|
|
318
|
+
|
|
319
|
+
### Local Installation
|
|
320
|
+
|
|
321
|
+
For development, clone the repository and install in editable mode:
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
git clone https://github.com/PrismorSec/prismor-cli.git
|
|
325
|
+
cd prismor-cli
|
|
326
|
+
pip install -e .
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Project Structure
|
|
330
|
+
|
|
331
|
+
```
|
|
332
|
+
prismor-cli/
|
|
333
|
+
├── prismor/
|
|
334
|
+
│ ├── __init__.py # Package initialization
|
|
335
|
+
│ ├── cli.py # CLI interface and commands
|
|
336
|
+
│ └── api.py # API client and communication
|
|
337
|
+
├── setup.py # Package configuration
|
|
338
|
+
├── requirements.txt # Dependencies
|
|
339
|
+
└── README.md # Documentation
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## Requirements
|
|
343
|
+
|
|
344
|
+
- Python 3.7 or higher
|
|
345
|
+
- `click` >= 8.0.0
|
|
346
|
+
- `requests` >= 2.25.0
|
|
347
|
+
|
|
348
|
+
## License
|
|
349
|
+
|
|
350
|
+
MIT License - See LICENSE file for details
|
|
351
|
+
|
|
352
|
+
## Support
|
|
353
|
+
|
|
354
|
+
- **Website**: [https://prismor.dev](https://prismor.dev)
|
|
355
|
+
- **Dashboard**: [https://prismor.dev](https://prismor.dev) (Sign up for full features)
|
|
356
|
+
- **Documentation**: [https://docs.prismor.dev](https://docs.prismor.dev)
|
|
357
|
+
- **Issues**: [https://github.com/PrismorSec/prismor-cli/issues](https://github.com/prismor/prismor-cli/issues)
|
|
358
|
+
|
|
359
|
+
### Need Help?
|
|
360
|
+
|
|
361
|
+
1. Visit [Prismor.dev](https://prismor.dev) for full documentation and support
|
|
362
|
+
2. Check the dashboard for detailed scan results and analysis
|
|
363
|
+
3. Join our community for questions and discussions
|
|
364
|
+
|
|
365
|
+
## Contributing
|
|
366
|
+
|
|
367
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
Made with ❤️ by Prismor
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
prismor/__init__.py,sha256=d_7a1UaXHGT7kAzI5fERetpR2vEj349becGSTKatQU0,230
|
|
2
|
+
prismor/api.py,sha256=jnbxgzDJjYLGxC5viT18xVjcmbupFecvlb-ph8J0yik,3938
|
|
3
|
+
prismor/cli.py,sha256=zjRJH9li_0_2CNquI4Y14alGpmiq1d-P_rZBTp4bS6I,7310
|
|
4
|
+
prismor-0.1.0.dist-info/licenses/LICENSE,sha256=qWFF8Eh6gpZOq_3effdd6hfeMN2WN9ZG4vOyFk2MyhU,1065
|
|
5
|
+
prismor-0.1.0.dist-info/METADATA,sha256=2boiqdtLo65Do3pxw_P7wWmU-FjVv95S43b3xfNT7Ps,9394
|
|
6
|
+
prismor-0.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
7
|
+
prismor-0.1.0.dist-info/entry_points.txt,sha256=Uiu0HW04eq2Gb6sQC9o-LqMKMyW1SKwkojxrkFeVfqg,45
|
|
8
|
+
prismor-0.1.0.dist-info/top_level.txt,sha256=nlJGoJ3fQXRL27RXQ5LJU2LX1kl1VSgKXyKjcSR28lw,8
|
|
9
|
+
prismor-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Prismor
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
prismor
|