@hatem427/code-guard-ci 1.0.5 → 1.1.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/README.md +37 -8
- package/dist/scripts/cli.js +15 -4
- package/dist/scripts/cli.js.map +1 -1
- package/dist/scripts/precommit-check.d.ts.map +1 -1
- package/dist/scripts/precommit-check.js +32 -15
- package/dist/scripts/precommit-check.js.map +1 -1
- package/dist/scripts/setup-supabase.d.ts +8 -0
- package/dist/scripts/setup-supabase.d.ts.map +1 -0
- package/dist/scripts/setup-supabase.js +172 -0
- package/dist/scripts/setup-supabase.js.map +1 -0
- package/dist/scripts/test-remote-db.d.ts +8 -0
- package/dist/scripts/test-remote-db.d.ts.map +1 -0
- package/dist/scripts/test-remote-db.js +15 -0
- package/dist/scripts/test-remote-db.js.map +1 -0
- package/dist/scripts/utils/bypass-manager.d.ts +1 -1
- package/dist/scripts/utils/bypass-manager.d.ts.map +1 -1
- package/dist/scripts/utils/bypass-manager.js +29 -1
- package/dist/scripts/utils/bypass-manager.js.map +1 -1
- package/dist/scripts/utils/remote-logger.d.ts +49 -0
- package/dist/scripts/utils/remote-logger.d.ts.map +1 -0
- package/dist/scripts/utils/remote-logger.js +251 -0
- package/dist/scripts/utils/remote-logger.js.map +1 -0
- package/dist/scripts/utils/security-check.d.ts +12 -0
- package/dist/scripts/utils/security-check.d.ts.map +1 -0
- package/dist/scripts/utils/security-check.js +126 -0
- package/dist/scripts/utils/security-check.js.map +1 -0
- package/dist/scripts/view-bypass-log.js +35 -2
- package/dist/scripts/view-bypass-log.js.map +1 -1
- package/package.json +5 -1
- package/scripts/cli.ts +16 -4
- package/scripts/precommit-check.ts +38 -14
- package/scripts/setup-supabase.ts +158 -0
- package/scripts/test-remote-db.ts +14 -0
- package/scripts/utils/bypass-manager.ts +30 -2
- package/scripts/utils/remote-logger.ts +256 -0
- package/scripts/utils/security-check.ts +108 -0
- package/scripts/view-bypass-log.ts +37 -2
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ============================================================================
|
|
4
|
+
* first-run-check.ts — Force password change on first use
|
|
5
|
+
* ============================================================================
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
|
|
11
|
+
const BYPASS_DIR = '.code-guardian';
|
|
12
|
+
const PASSWORD_FILE = 'bypass-password.hash';
|
|
13
|
+
const ADMIN_FILE = 'admin-credentials.hash';
|
|
14
|
+
const SETUP_COMPLETE_FILE = 'setup-complete';
|
|
15
|
+
|
|
16
|
+
const DEFAULT_PASSWORD_HASH = '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92';
|
|
17
|
+
const DEFAULT_ADMIN_PASSWORD_HASH = '240be518fabd2724ddb6f04eeb1da5967448d7e831c08c8fa822809f74c720a9';
|
|
18
|
+
|
|
19
|
+
function checkSecurity(): boolean {
|
|
20
|
+
const dir = path.join(process.cwd(), BYPASS_DIR);
|
|
21
|
+
const setupFile = path.join(dir, SETUP_COMPLETE_FILE);
|
|
22
|
+
|
|
23
|
+
// If setup already complete, skip
|
|
24
|
+
if (fs.existsSync(setupFile)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const passwordPath = path.join(dir, PASSWORD_FILE);
|
|
29
|
+
const adminPath = path.join(dir, ADMIN_FILE);
|
|
30
|
+
|
|
31
|
+
// Check if still using default passwords
|
|
32
|
+
const usingDefaultBypass = !fs.existsSync(passwordPath) ||
|
|
33
|
+
fs.readFileSync(passwordPath, 'utf-8').trim() === DEFAULT_PASSWORD_HASH;
|
|
34
|
+
|
|
35
|
+
const usingDefaultAdmin = !fs.existsSync(adminPath) ||
|
|
36
|
+
fs.readFileSync(adminPath, 'utf-8').trim() === DEFAULT_ADMIN_PASSWORD_HASH;
|
|
37
|
+
|
|
38
|
+
if (usingDefaultBypass || usingDefaultAdmin) {
|
|
39
|
+
console.error(`
|
|
40
|
+
╔═══════════════════════════════════════════════════════════╗
|
|
41
|
+
║ 🔒 CRITICAL SECURITY WARNING 🔒 ║
|
|
42
|
+
╚═══════════════════════════════════════════════════════════╝
|
|
43
|
+
|
|
44
|
+
⚠️ You are using DEFAULT PASSWORDS! This is a SECURITY RISK!
|
|
45
|
+
|
|
46
|
+
Default passwords are publicly known and published in the source code:
|
|
47
|
+
- Bypass password: "bypass123"
|
|
48
|
+
- Admin password: "admin123"
|
|
49
|
+
|
|
50
|
+
Anyone who can see your repository can bypass ALL security checks!
|
|
51
|
+
|
|
52
|
+
📋 REQUIRED ACTIONS (Run both commands):
|
|
53
|
+
|
|
54
|
+
1. Set bypass password:
|
|
55
|
+
npm run set-bypass-password
|
|
56
|
+
|
|
57
|
+
2. Set admin password:
|
|
58
|
+
npm run set-admin-password
|
|
59
|
+
|
|
60
|
+
❌ ALL COMMITS ARE BLOCKED until you change these passwords.
|
|
61
|
+
|
|
62
|
+
💡 To skip this check temporarily (NOT RECOMMENDED):
|
|
63
|
+
SKIP_SECURITY_CHECK=true git commit -m "message"
|
|
64
|
+
|
|
65
|
+
`);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Mark setup as complete
|
|
70
|
+
if (!fs.existsSync(dir)) {
|
|
71
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
fs.writeFileSync(setupFile, new Date().toISOString());
|
|
74
|
+
|
|
75
|
+
console.log('✅ Security check passed - passwords have been changed from defaults.\n');
|
|
76
|
+
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Allow skipping security check with env var (for emergencies)
|
|
82
|
+
*/
|
|
83
|
+
function shouldSkipSecurityCheck(): boolean {
|
|
84
|
+
return process.env.SKIP_SECURITY_CHECK === 'true';
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Main security check with skip option
|
|
89
|
+
*/
|
|
90
|
+
function performSecurityCheck(): boolean {
|
|
91
|
+
// Allow skip in CI/CD or emergencies
|
|
92
|
+
if (shouldSkipSecurityCheck()) {
|
|
93
|
+
console.warn('⚠️ Security check skipped via SKIP_SECURITY_CHECK env var');
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return checkSecurity();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Export for use in precommit-check
|
|
101
|
+
export { performSecurityCheck as checkSecurity };
|
|
102
|
+
|
|
103
|
+
// Run if called directly
|
|
104
|
+
if (require.main === module) {
|
|
105
|
+
if (!performSecurityCheck()) {
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { generateBypassReport, getBypassesByAuthor, getRecentBypasses } from './utils/bypass-manager';
|
|
14
|
+
import { fetchBypassLogs, isRemoteLoggingEnabled } from './utils/remote-logger';
|
|
14
15
|
import * as logger from './utils/logger';
|
|
15
16
|
|
|
16
17
|
function parseArgs(): { author?: string; days?: number } {
|
|
@@ -34,10 +35,41 @@ function parseArgs(): { author?: string; days?: number } {
|
|
|
34
35
|
return opts;
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
function main() {
|
|
38
|
+
async function main() {
|
|
38
39
|
logger.header('📊 Code Guardian — Bypass Audit Log');
|
|
39
40
|
|
|
40
41
|
const opts = parseArgs();
|
|
42
|
+
const remoteEnabled = isRemoteLoggingEnabled();
|
|
43
|
+
|
|
44
|
+
// Try remote logs first
|
|
45
|
+
if (remoteEnabled) {
|
|
46
|
+
try {
|
|
47
|
+
console.log('📡 Fetching from remote database...\n');
|
|
48
|
+
const remoteLogs = await fetchBypassLogs();
|
|
49
|
+
|
|
50
|
+
if (remoteLogs.length === 0) {
|
|
51
|
+
console.log('✅ No bypasses recorded.\n');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
console.log(`Found ${remoteLogs.length} bypass(es):\n`);
|
|
56
|
+
remoteLogs.forEach((entry: any, idx: number) => {
|
|
57
|
+
const date = new Date(entry.timestamp).toLocaleString();
|
|
58
|
+
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
|
59
|
+
console.log(`${idx + 1}. ${entry.author.name} <${entry.author.email}>`);
|
|
60
|
+
console.log(` 📅 ${date}`);
|
|
61
|
+
console.log(` 📝 ${entry.reason}`);
|
|
62
|
+
console.log(` 🌿 ${entry.branch}`);
|
|
63
|
+
console.log(` 🔑 ${entry.method}`);
|
|
64
|
+
console.log(` 📁 ${entry.files.length} file(s)`);
|
|
65
|
+
console.log('');
|
|
66
|
+
});
|
|
67
|
+
return;
|
|
68
|
+
} catch (error: any) {
|
|
69
|
+
console.warn('⚠️ Failed to fetch remote logs:', error.message);
|
|
70
|
+
console.log('Falling back to local logs...\n');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
41
73
|
|
|
42
74
|
if (opts.author) {
|
|
43
75
|
logger.info(`Filtering by author: ${opts.author}`);
|
|
@@ -89,4 +121,7 @@ function main() {
|
|
|
89
121
|
}
|
|
90
122
|
}
|
|
91
123
|
|
|
92
|
-
main()
|
|
124
|
+
main().catch((err) => {
|
|
125
|
+
console.error('❌ Error:', err.message);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
});
|