Merge branch 'release/21.49.0' into master
[gitter.git] / scripts / security-harness.js
blob7d6f367f5594354503813f57893867ede1e9e578
1 #!/usr/bin/env node
2 'use strict';
4 const Promise = require('bluebird');
5 const path = require('path');
6 const fs = require('fs').promises;
7 const ReadStream = require('fs').ReadStream;
8 const crypto = require('crypto');
10 function getHashForFilepath(filePath) {
11   return new Promise(resolve => {
12     var shasum = crypto.createHash('sha256');
14     const s = ReadStream(filePath);
15     s.on('data', function(d) {
16       shasum.update(d);
17     });
18     s.on('end', function() {
19       const hash = shasum.digest('hex');
20       resolve(hash);
21     });
22   });
25 const hookSourcePath = path.resolve(__dirname, './security-harness-hook.sh');
26 const hookPath = path.resolve(__dirname, '../.git/hooks/pre-push');
28 (async () => {
29   let doesHookExist;
30   try {
31     await fs.stat(hookPath);
32     doesHookExist = true;
33   } catch (err) {
34     doesHookExist = false;
35   }
37   if (doesHookExist) {
38     const sourceHash = await getHashForFilepath(hookSourcePath);
39     const destHash = await getHashForFilepath(hookPath);
41     if (sourceHash === destHash) {
42       await fs.unlink(hookPath);
43       console.log('Security harness removed -- you can now push to all remotes.');
44     } else {
45       console.log(`${hookPath} exists and is different from our hook!`);
46       console.log('Remove it and re-run this script to continue.');
48       process.exit(1);
49     }
50   } else {
51     const hookSource = await fs.readFile(hookSourcePath);
52     await fs.writeFile(hookPath, hookSource, {
53       mode: 0o755
54     });
56     console.log('Security harness installed -- you will only be able to push to dev.gitlab.org!');
57   }
58 })();