scripts/security_harness.js (46 lines of code) (raw):

#!/usr/bin/env node const path = require('path'); const fs = require('fs').promises; const { ReadStream } = require('fs'); const crypto = require('crypto'); function getHashForFilepath(filePath) { return new Promise(resolve => { const shasum = crypto.createHash('sha256'); const s = ReadStream(filePath); s.on('data', d => { shasum.update(d); }); s.on('end', () => { const hash = shasum.digest('hex'); resolve(hash); }); }); } const hookSourcePath = path.resolve(__dirname, './security_harness_hook.sh'); const hookPath = path.resolve(__dirname, '../.git/hooks/pre-push'); (async () => { let doesHookExist; try { await fs.stat(hookPath); doesHookExist = true; } catch (err) { doesHookExist = false; } if (doesHookExist) { const sourceHash = await getHashForFilepath(hookSourcePath); const destHash = await getHashForFilepath(hookPath); if (sourceHash === destHash) { await fs.unlink(hookPath); console.log('Security harness removed -- you can now push to all remotes.'); } else { console.log(`${hookPath} exists and is different from our hook!`); console.log('Remove it and re-run this script to continue.'); process.exit(1); } } else { const hookSource = await fs.readFile(hookSourcePath); await fs.writeFile(hookPath, hookSource, { mode: 0o755, }); console.log( 'Security harness installed -- you will only be able to push to gitlab.com/gitlab-org/security!', ); } })();