@cerema/cadriciel 1.2.9 → 1.3.1

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.
Binary file
@@ -0,0 +1,56 @@
1
+ .focus-in-contract {
2
+ -webkit-animation: focus-in-contract 0.7s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
3
+ animation: focus-in-contract 0.7s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
4
+ }
5
+
6
+ .centered-text {
7
+ position: absolute;
8
+ top: 50%;
9
+ left: 50%;
10
+ transform: translate(-50%, -50%);
11
+ font-size: 50px;
12
+ font-family: 'Arial black';
13
+ font-weight: 400;
14
+ text-align: center;
15
+ }
16
+
17
+ .description {
18
+ position: absolute;
19
+ top: 50%;
20
+ left: 50%;
21
+ transform: translate(-50%, -50%);
22
+ font-size: 20px;
23
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
24
+ text-align: center;
25
+ width: 100%;
26
+ }
27
+
28
+ @-webkit-keyframes focus-in-contract {
29
+ 0% {
30
+ letter-spacing: 1em;
31
+ -webkit-filter: blur(12px);
32
+ filter: blur(12px);
33
+ opacity: 0;
34
+ }
35
+
36
+ 100% {
37
+ -webkit-filter: blur(0px);
38
+ filter: blur(0px);
39
+ opacity: 1;
40
+ }
41
+ }
42
+
43
+ @keyframes focus-in-contract {
44
+ 0% {
45
+ letter-spacing: 1em;
46
+ -webkit-filter: blur(12px);
47
+ filter: blur(12px);
48
+ opacity: 0;
49
+ }
50
+
51
+ 100% {
52
+ -webkit-filter: blur(0px);
53
+ filter: blur(0px);
54
+ opacity: 1;
55
+ }
56
+ }
@@ -0,0 +1,29 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Cadriciel</title>
8
+ <link rel="stylesheet" type="text/css" href="http://127.0.0.1:4200/index.css">
9
+ </link>
10
+ </head>
11
+
12
+ <body>
13
+ <div class="focus-in-contract centered-text">Bienvenue</div>
14
+ <div class="centered-text description"><br><br><br><br><br>Vous êtes authentifié. Vous pouvez fermer votre
15
+ navigateur</div>
16
+
17
+
18
+ <div style="position:absolute;bottom:0px;right:0px;">
19
+ <img src="http://127.0.0.1:4200/nono.png" width="300px" height="300px">
20
+ </div>
21
+ <div
22
+ style="position:absolute;top:30px;left:0px;background-image:url(http://127.0.0.1:4200/cerema.jpeg);background-position:center;background-repeat:no-repeat;background-size:contain;width:100%;height:150px">
23
+ </div>
24
+ <div
25
+ style="position:absolute;top:150px;left:30px;background-image:url(http://127.0.0.1:4200/logo.png);background-position:center;background-repeat:no-repeat;background-size:contain;width:100%;height:100px">
26
+ </div>
27
+ </body>
28
+
29
+ </html>
Binary file
Binary file
@@ -1,5 +1,6 @@
1
1
  module.exports = (args) => {
2
- var UID = require('shortid').generate();
2
+ const { nanoid } = require('nanoid');
3
+ var UID = nanoid();
3
4
  const inquirer = require('inquirer');
4
5
  const chalk = require('chalk-v2');
5
6
  const path = require('path');
@@ -11,12 +12,12 @@ module.exports = (args) => {
11
12
  const fs = require('fs');
12
13
  const log = require('log-beautify');
13
14
  const isBinary = require('isbinaryfile').isBinaryFile;
15
+ const userHomeDir = os.homedir();
14
16
  const {
15
17
  capitalizeFirstLetter,
16
18
  getAccount,
17
19
  getTemplates,
18
20
  } = require('../../lib/util');
19
- const { S3 } = require('../../lib/s3');
20
21
 
21
22
  const unzipFile = (zipFilePath, outputPath, callback) => {
22
23
  const zip = new AdmZip(zipFilePath);
@@ -33,12 +34,21 @@ module.exports = (args) => {
33
34
  };
34
35
 
35
36
  const download = async (name, cb) => {
36
- var client = await S3();
37
- client.get('cadriciel-templates', `${name}.zip`, function (e) {
38
- unzipFile(`${os.tmpdir()}/${name}.zip`, `${os.tmpdir()}/${UID}`, () => {
39
- DEFAULT_TEMPLATE = name;
40
- fs.unlink(`${os.tmpdir()}/${name}.zip`, cb);
41
- });
37
+ try {
38
+ var token = fs.readFileSync(`${userHomeDir}/.cadriciel/account`, 'utf-8');
39
+ } catch (e) {
40
+ return console.error(chalk.bold.red("Vous n'êtes pas authentifié."));
41
+ }
42
+ const CadricielAPI = require('../../lib/cadriciel');
43
+ const cadriciel = new CadricielAPI(token);
44
+ await cadriciel.downloadFile(
45
+ '/template?key=' + name + '.zip',
46
+ `${os.tmpdir()}/${name}.zip`
47
+ );
48
+
49
+ unzipFile(`${os.tmpdir()}/${name}.zip`, `${os.tmpdir()}/${UID}`, () => {
50
+ DEFAULT_TEMPLATE = name;
51
+ fs.unlink(`${os.tmpdir()}/${name}.zip`, cb);
42
52
  });
43
53
  };
44
54
 
@@ -196,6 +206,7 @@ module.exports = (args) => {
196
206
  start: async () => {
197
207
  const templates = await getTemplates();
198
208
  var tpl = [];
209
+ if (!templates) return process.exit(1);
199
210
  for (let i = 0; i < templates.length; i++) tpl.push(templates[i].title);
200
211
  console.log(
201
212
  '\n😃 ' + chalk.bold('Tout grand projet commence par un nom !\n')
@@ -2,55 +2,172 @@ module.exports = (args) => {
2
2
  const os = require('os');
3
3
  const fs = require('fs');
4
4
  const userHomeDir = os.homedir();
5
- const inquirer = require('inquirer');
6
-
7
- const log = require('log-beautify');
8
- const { makeAccount } = require('../../lib/util');
9
- const { S3 } = require('../../lib/s3');
10
-
11
- const createLogin = () => {
12
- inquirer
13
- .prompt([
14
- {
15
- type: 'input',
16
- name: 'accessKey',
17
- message: 'Login',
18
- },
19
- {
20
- type: 'password',
21
- name: 'secretKey',
22
- message: 'Mot de passe',
23
- },
24
- ])
25
- .then(async (answers) => {
26
- var client = await S3(answers);
27
- client.get('cadriciel-templates', 'template.json', function (e, r) {
28
- if (e) return log.error('Votre login ou mot de passe incorrecte');
29
- makeAccount(JSON.stringify(answers), function (e) {
30
- if (e) return log.error('Impossible de créer votre compte.');
31
- log.success('Votre compte a été crée avec succès.');
32
- });
33
- });
34
- })
35
- .catch((error) => {
36
- console.log(error);
37
- throw error;
38
- });
39
- };
5
+ const chalk = require('chalk-v2');
6
+ const prompts = require('prompts');
7
+ const { exec } = require('child_process');
8
+ const jwt = require('jsonwebtoken');
9
+
10
+ const express = require('express');
11
+ const axios = require('axios');
12
+ const querystring = require('querystring');
13
+
14
+ const app = express();
15
+ const PORT = 4200;
16
+
17
+ const KEYCLOAK_SERVER = 'https://orion-recette.cerema.fr';
18
+ const REALM = 'CeremaApps';
19
+ const CLIENT_ID = 'marep_dev';
20
+ const REDIRECT_URI = 'http://localhost:4200/callback';
21
+
22
+ const INDEX_HTML = fs.readFileSync(
23
+ __dirname + '/../assets/index.html',
24
+ 'utf8'
25
+ );
26
+
40
27
  return {
41
28
  info: {
42
29
  title: 'login',
43
30
  description: 'Authentification du cadriciel',
44
31
  },
45
- start: () => {
46
- fs.readFile(
47
- `${userHomeDir}/.cadriciel/account.json`,
48
- 'utf-8',
49
- function (e, r) {
50
- if (e) return createLogin();
51
- log.warning('Vous êtes déjà authentifié.');
52
- }
32
+ start: async () => {
33
+ if (fs.existsSync(`${userHomeDir}/.cadriciel/account`)) {
34
+ console.log(
35
+ chalk.bold.green('\n [AUTH]') +
36
+ chalk.green(' Vous êtes déjà authentifié.')
37
+ );
38
+ const code = jwt.decode(
39
+ fs.readFileSync(`${userHomeDir}/.cadriciel/account`)
40
+ );
41
+ console.log('\n 👍 Bonjour ' + code.given_name + ' !');
42
+ return;
43
+ }
44
+ console.log(
45
+ `\n ${chalk.bold(
46
+ '[INFO]'
47
+ )} Pendant le processus d'authentification, votre navigateur va s'ouvrir.\n Veuillez laisser le processus s'effectuer jusqu'au bout.`
53
48
  );
49
+ console.log('\n');
50
+
51
+ const response = await prompts({
52
+ type: 'confirm',
53
+ name: 'code',
54
+ message: 'Ouvrir le navigateur et se connecter à ORION',
55
+ });
56
+
57
+ if (response.code === false) return;
58
+
59
+ const auth = async (wellKnownConfig) => {
60
+ app.use(express.static(__dirname + '/../assets'));
61
+ app.get('/callback', (req, res) => {
62
+ const code = req.query.code;
63
+ axios
64
+ .post(
65
+ wellKnownConfig.token_endpoint,
66
+ querystring.stringify({
67
+ client_id: CLIENT_ID,
68
+ code: code,
69
+ redirect_uri: REDIRECT_URI,
70
+ grant_type: 'authorization_code',
71
+ }),
72
+ {
73
+ headers: {
74
+ 'Content-Type': 'application/x-www-form-urlencoded',
75
+ },
76
+ }
77
+ )
78
+ .then((response) => {
79
+ const accessToken = response.data.access_token;
80
+ const code = jwt.decode(accessToken);
81
+ res.setHeader('Content-Type', 'text/html');
82
+ res.end(INDEX_HTML);
83
+ fs.mkdir(`${userHomeDir}/.cadriciel`, { recursive: true }, () => {
84
+ fs.writeFile(
85
+ `${userHomeDir}/.cadriciel/account`,
86
+ accessToken,
87
+ async (err) => {
88
+ const CadricielAPI = require('../../lib/cadriciel');
89
+ const cadriciel = new CadricielAPI(accessToken);
90
+ try {
91
+ const response = await cadriciel.get('/login');
92
+ } catch (e) {
93
+ console.log(' ');
94
+ console.log(
95
+ chalk.red(' [AUTH]') +
96
+ chalk.red(
97
+ " Vous avez bien été authentifié mais vous n'avez pas accès au cadriciel."
98
+ )
99
+ );
100
+ try {
101
+ fs.unlinkSync(`${userHomeDir}/.cadriciel/account`);
102
+ fs.rmdirSync(`${userHomeDir}/.cadriciel`);
103
+ } catch (e) {}
104
+ return process.exit(1);
105
+ }
106
+ await cadriciel.downloadFile(
107
+ '/update',
108
+ userHomeDir + '/.cadriciel/template.json'
109
+ );
110
+
111
+ setTimeout(() => {
112
+ console.log(' ');
113
+ console.log(
114
+ chalk.bold.green(' [AUTH]') +
115
+ chalk.green(' Authentification réussie.')
116
+ );
117
+ console.log('\n 👍 Bonjour ' + code.given_name + ' !');
118
+ console.log(' ');
119
+ process.exit(1);
120
+ }, 1000);
121
+ }
122
+ );
123
+ });
124
+ })
125
+ .catch((error) => {
126
+ console.log(error);
127
+ res
128
+ .status(500)
129
+ .send("Erreur lors de l'échange du code d'autorisaton.");
130
+ });
131
+ });
132
+ app.listen(PORT, () => {
133
+ // Construisez l'URL d'authentification
134
+ const authUrl =
135
+ `${wellKnownConfig.authorization_endpoint}?` +
136
+ querystring.stringify({
137
+ client_id: CLIENT_ID,
138
+ redirect_uri: REDIRECT_URI,
139
+ response_type: 'code',
140
+ scope: 'openid',
141
+ });
142
+
143
+ // Ouvrez le navigateur vers l'URL d'authentification
144
+ switch (process.platform) {
145
+ case 'darwin':
146
+ exec(`open "${authUrl}"`);
147
+ break;
148
+ case 'win32':
149
+ exec(`start "${authUrl}"`);
150
+ break;
151
+ default:
152
+ exec(`xdg-open "${authUrl}"`);
153
+ break;
154
+ }
155
+ });
156
+ };
157
+
158
+ axios
159
+ .get(
160
+ `${KEYCLOAK_SERVER}/auth/realms/${REALM}/.well-known/openid-configuration`
161
+ )
162
+ .then((response) => {
163
+ auth(response.data);
164
+ })
165
+ .catch((error) => {
166
+ console.error(
167
+ 'Erreur lors de la récupération de la configuration Keycloak:',
168
+ error
169
+ );
170
+ });
54
171
  },
55
172
  };
56
173
  };
@@ -9,7 +9,7 @@ module.exports = (args) => {
9
9
  description: 'Déconnexion de votre compte',
10
10
  },
11
11
  start: () => {
12
- fs.unlink(`${userHomeDir}/.cadriciel/account.json`, function (e) {
12
+ fs.unlink(`${userHomeDir}/.cadriciel/account`, function (e) {
13
13
  if (e) return log.error("Vous n'êtes pas authentifié.");
14
14
  fs.unlink(`${userHomeDir}/.cadriciel/template.json`, function (e) {
15
15
  fs.rmdir(`${userHomeDir}/.cadriciel`, function (e) {
@@ -2,26 +2,31 @@ module.exports = (args) => {
2
2
  const log = require('log-beautify');
3
3
  const fs = require('fs');
4
4
  const os = require('os');
5
- const { S3 } = require('../../lib/s3');
5
+ const userHomeDir = os.homedir();
6
+ const chalk = require('chalk-v2');
7
+
6
8
  return {
7
9
  info: {
8
10
  title: 'update',
9
11
  description: 'Mise à jour du cadriciel',
10
12
  },
11
13
  start: async () => {
12
- console.log('- Mise à jour du cadriciel');
13
- /** update json */
14
- const s3 = await S3();
15
- s3.get('cadriciel-templates', 'template.json', function (e) {
16
- fs.rename(
17
- os.tmpdir() + '/template.json',
18
- os.homedir() + '/.cadriciel/template.json',
19
- function (e) {
20
- if (e) return log.error('Mise à jour impossible');
21
- log.success('OK');
22
- }
14
+ try {
15
+ var token = fs.readFileSync(
16
+ `${userHomeDir}/.cadriciel/account`,
17
+ 'utf-8'
23
18
  );
24
- });
19
+ } catch (e) {
20
+ return log.error("Vous n'êtes pas authentifié.");
21
+ }
22
+ const CadricielAPI = require('../../lib/cadriciel');
23
+ const cadriciel = new CadricielAPI(token);
24
+ console.log('- Mise à jour du cadriciel');
25
+ await cadriciel.downloadFile(
26
+ '/update',
27
+ userHomeDir + '/.cadriciel/template.json'
28
+ );
29
+ console.log('Mise à jour OK.');
25
30
  },
26
31
  };
27
32
  };
package/cli.js CHANGED
@@ -5,14 +5,22 @@ const fs = require('fs');
5
5
  const log = require('log-beautify');
6
6
  const path = require('path');
7
7
  const { spawn } = require('child_process');
8
+ const os = require('os');
9
+ const userHomeDir = os.homedir();
8
10
 
9
11
  const CADRICIEL_PATH = findCadricielDir(process.cwd());
10
12
  const CADRICIEL_COMMAND =
11
13
  process.argv[1].split('/')[process.argv[1].split('/').length - 1];
14
+ global.CADRICIEL_URI = 'https://dev.siipro.fr/api';
12
15
 
13
16
  var CADRICIEL_GLOBAL_COMMANDS = {};
14
17
  var CADRICIEL_COMMANDS = {};
15
18
 
19
+ /** efface les anciens credentials s'ils existent */
20
+ try {
21
+ fs.unlinkSync(`${userHomeDir}/.cadriciel/account.json`);
22
+ } catch (e) {}
23
+
16
24
  /**
17
25
  * Recherche récursivement le répertoire '.cadriciel' à partir du chemin donné, en remontant vers les répertoires parents.
18
26
  * @param {string} startPath - Le chemin de départ pour la recherche.
@@ -0,0 +1,72 @@
1
+ const axios = require('axios');
2
+ const chalk = require('chalk-v2');
3
+ const fs = require('fs');
4
+ const baseURL = 'https://dev.siipro.fr/api';
5
+ //const baseURL = 'http://127.0.0.1:3000/api';
6
+
7
+ class CadricielAPI {
8
+ constructor(token) {
9
+ this.client = axios.create({
10
+ baseURL: baseURL,
11
+ timeout: 10000,
12
+ headers: { Authorization: 'Bearer ' + token },
13
+ });
14
+ }
15
+
16
+ async get(url, params = {}) {
17
+ try {
18
+ const response = await this.client.get(url, { params });
19
+ return response.data;
20
+ } catch (error) {
21
+ throw error;
22
+ }
23
+ }
24
+
25
+ async post(url, data = {}) {
26
+ try {
27
+ const response = await this.client.post(url, data);
28
+ return response.data;
29
+ } catch (error) {
30
+ throw error;
31
+ }
32
+ }
33
+ async put(url, data = {}) {
34
+ try {
35
+ const response = await this.client.put(url, data);
36
+ return response.data;
37
+ } catch (error) {
38
+ throw error;
39
+ }
40
+ }
41
+
42
+ async patch(url, data = {}) {
43
+ try {
44
+ const response = await this.client.patch(url, data);
45
+ return response.data;
46
+ } catch (error) {
47
+ throw error;
48
+ }
49
+ }
50
+
51
+ async delete(url, data = {}) {
52
+ try {
53
+ const response = await this.client.delete(url, { data });
54
+ return response.data;
55
+ } catch (error) {
56
+ throw error;
57
+ }
58
+ }
59
+
60
+ async downloadFile(url, savePath) {
61
+ try {
62
+ const response = await this.client.get(url, {
63
+ responseType: 'arraybuffer',
64
+ });
65
+ fs.writeFileSync(savePath, response.data);
66
+ } catch (error) {
67
+ console.error(chalk.bold.red('Erreur lors du téléchargement du fichier'));
68
+ }
69
+ }
70
+ }
71
+
72
+ module.exports = CadricielAPI;
package/lib/util.js CHANGED
@@ -4,6 +4,7 @@
4
4
  const os = require('os');
5
5
  const fs = require('fs');
6
6
  const util = require('util');
7
+ const jwt = require('jsonwebtoken');
7
8
  const userHomeDir = os.homedir();
8
9
  const log = require('log-beautify');
9
10
  const readFile = util.promisify(fs.readFile);
@@ -14,8 +15,16 @@ const capitalizeFirstLetter = (string) => {
14
15
  };
15
16
  const getAccount = async () => {
16
17
  try {
17
- var txt = await readFile(`${userHomeDir}/.cadriciel/account.json`);
18
- return JSON.parse(txt);
18
+ var txt = await readFile(`${userHomeDir}/.cadriciel/account`);
19
+ return jwt.decode(txt);
20
+ } catch (e) {
21
+ log.error("Vous n'êtes pas authentifié.");
22
+ }
23
+ };
24
+ const getAccountToken = async () => {
25
+ try {
26
+ var txt = await readFile(`${userHomeDir}/.cadriciel/account`);
27
+ return txt;
19
28
  } catch (e) {
20
29
  log.error("Vous n'êtes pas authentifié.");
21
30
  }
@@ -44,3 +53,4 @@ exports.getAccount = getAccount;
44
53
  exports.makeAccount = makeAccount;
45
54
  exports.getTemplates = getTemplates;
46
55
  exports.capitalizeFirstLetter = capitalizeFirstLetter;
56
+ exports.getAccountToken = getAccountToken;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cerema/cadriciel",
3
- "version": "1.2.9",
3
+ "version": "1.3.1",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "npm": ">=8.0.0",
@@ -11,16 +11,19 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "adm-zip": "^0.5.10",
14
+ "axios": "^1.5.1",
14
15
  "chalk-v2": "^1.0.2",
15
16
  "commander": "^10.0.0",
17
+ "express": "^4.18.2",
16
18
  "figlet": "^1.5.2",
17
19
  "inquirer": "8.2.5",
18
20
  "isbinaryfile": "^5.0.0",
21
+ "jsonwebtoken": "^9.0.2",
19
22
  "log-beautify": "^1.2.0",
20
- "minio": "^7.0.32",
23
+ "nanoid": "^3.3.6",
21
24
  "ora": "^5.4.1",
25
+ "prompts": "^2.4.2",
22
26
  "recursive-readdir": "^2.2.3",
23
- "shortid": "^2.2.16",
24
27
  "terminal-link": "2.1.1",
25
28
  "unzipper": "^0.10.11",
26
29
  "yauzl": "^2.10.0"
package/lib/s3.js DELETED
@@ -1,31 +0,0 @@
1
- const os = require('os');
2
- const fs = require('fs');
3
- const util = require('util');
4
- const S3_URI = 's3.gra.io.cloud.ovh.net';
5
- const S3_REGION = 'gra';
6
- const Minio = require('minio');
7
-
8
- const readFile = util.promisify(fs.readFile);
9
-
10
- const S3 = async function (current_login) {
11
- const login = async () => {
12
- if (current_login) {
13
- current_login.endPoint = S3_URI;
14
- current_login.region = S3_REGION;
15
- return new Minio.Client(current_login);
16
- }
17
- const r = await readFile(`${os.homedir}/.cadriciel/account.json`, 'utf-8');
18
- r.endPoint = S3_URI;
19
- r.region = S3_REGION;
20
- if (r) return new Minio.Client(JSON.parse(r));
21
- };
22
- var client = await login(current_login);
23
-
24
- return {
25
- get(bucket, filename, cb) {
26
- client.fGetObject(bucket, filename, `${os.tmpdir()}/${filename}`, cb);
27
- },
28
- };
29
- };
30
-
31
- exports.S3 = S3;