@grafana/sign-plugin 2.0.0 → 2.0.2-canary.481.f400697.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/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ # v2.0.1 (Tue Oct 03 2023)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - Allows to sign behind an https proxy [#436](https://github.com/grafana/plugin-tools/pull/436) ([@academo](https://github.com/academo))
6
+
7
+ #### Authors: 1
8
+
9
+ - Esteban Beltran ([@academo](https://github.com/academo))
10
+
11
+ ---
12
+
1
13
  # v2.0.0 (Mon Oct 02 2023)
2
14
 
3
15
  #### 🐛 Bug Fix
package/README.md CHANGED
@@ -22,7 +22,7 @@ Signing a plugin allows Grafana to verify the authenticity of the plugin with si
22
22
 
23
23
  All plugins require a signature since Grafana 7.0.
24
24
 
25
- Please refer to [Signing plugins documentation](https://grafana.com/docs/grafana/latest/developers/plugins/sign-a-plugin/) to understand how to sign a Grafana plugin. The following commands are mentioned here for development purposes.
25
+ Please refer to [Signing plugins documentation](https://grafana.com/developers/plugin-tools/publish-a-plugin/sign-a-plugin) to understand how to sign a Grafana plugin. The following commands are mentioned here for development purposes.
26
26
 
27
27
  ### Sign a public plugin
28
28
 
package/dist/bin/run.js CHANGED
@@ -3,14 +3,14 @@
3
3
  var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
5
  };
6
- exports.__esModule = true;
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  var minimist_1 = __importDefault(require("minimist"));
8
8
  var commands_1 = require("../commands");
9
9
  var args = process.argv.slice(2);
10
- var argv = (0, minimist_1["default"])(args);
10
+ var argv = (0, minimist_1.default)(args);
11
11
  var commands = {
12
12
  sign: commands_1.sign,
13
- version: commands_1.version
13
+ version: commands_1.version,
14
14
  };
15
15
  var command = commands[argv._[0]] || commands.sign;
16
16
  command(argv);
@@ -13,6 +13,6 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
13
13
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
- exports.__esModule = true;
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./sign.command"), exports);
18
18
  __exportStar(require("./version.command"), exports);
@@ -38,7 +38,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
38
38
  var __importDefault = (this && this.__importDefault) || function (mod) {
39
39
  return (mod && mod.__esModule) ? mod : { "default": mod };
40
40
  };
41
- exports.__esModule = true;
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
42
  exports.sign = void 0;
43
43
  var path_1 = __importDefault(require("path"));
44
44
  var fs_1 = require("fs");
@@ -52,7 +52,7 @@ var sign = function (argv) { return __awaiter(void 0, void 0, void 0, function (
52
52
  switch (_d.label) {
53
53
  case 0:
54
54
  distDir = (_a = argv.distDir) !== null && _a !== void 0 ? _a : 'dist';
55
- pluginDistDir = path_1["default"].resolve(distDir);
55
+ pluginDistDir = path_1.default.resolve(distDir);
56
56
  signatureType = argv.signatureType;
57
57
  rootUrls = (_c = (_b = argv.rootUrls) === null || _b === void 0 ? void 0 : _b.split(',')) !== null && _c !== void 0 ? _c : [];
58
58
  if (!(0, fs_1.existsSync)(pluginDistDir)) {
@@ -35,7 +35,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
35
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
36
  }
37
37
  };
38
- exports.__esModule = true;
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.version = void 0;
40
40
  var getVersion_1 = require("../utils/getVersion");
41
41
  var version = function () { return __awaiter(void 0, void 0, void 0, function () {
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- exports.__esModule = true;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getVersion = void 0;
4
4
  var fs_1 = require("fs");
5
5
  var path_1 = require("path");
@@ -46,7 +46,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
46
46
  var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
47
47
  var i, p;
48
48
  return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
49
- function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
49
+ function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
50
50
  };
51
51
  var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
52
52
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -73,7 +73,7 @@ var __values = (this && this.__values) || function(o) {
73
73
  var __importDefault = (this && this.__importDefault) || function (mod) {
74
74
  return (mod && mod.__esModule) ? mod : { "default": mod };
75
75
  };
76
- exports.__esModule = true;
76
+ Object.defineProperty(exports, "__esModule", { value: true });
77
77
  exports.saveManifest = exports.signManifest = exports.buildManifest = void 0;
78
78
  var crypto_1 = __importDefault(require("crypto"));
79
79
  var promises_1 = __importDefault(require("fs/promises"));
@@ -88,76 +88,71 @@ function walk(dir, baseDir) {
88
88
  return __generator(this, function (_g) {
89
89
  switch (_g.label) {
90
90
  case 0:
91
- _g.trys.push([0, 20, 21, 26]);
91
+ _g.trys.push([0, 17, 18, 23]);
92
92
  _a = true;
93
- return [4, __await(promises_1["default"].opendir(dir))];
93
+ return [4, __await(promises_1.default.opendir(dir))];
94
94
  case 1:
95
95
  _b = __asyncValues.apply(void 0, [_g.sent()]);
96
96
  _g.label = 2;
97
97
  case 2: return [4, __await(_b.next())];
98
98
  case 3:
99
- if (!(_c = _g.sent(), _d = _c.done, !_d)) return [3, 19];
99
+ if (!(_c = _g.sent(), _d = _c.done, !_d)) return [3, 16];
100
100
  _f = _c.value;
101
101
  _a = false;
102
- _g.label = 4;
103
- case 4:
104
- _g.trys.push([4, , 17, 18]);
105
102
  d = _f;
106
- entry = path_1["default"].join(dir, d.name);
107
- if (!d.isDirectory()) return [3, 8];
103
+ entry = path_1.default.join(dir, d.name);
104
+ if (!d.isDirectory()) return [3, 7];
108
105
  return [4, __await(walk(entry, baseDir))];
109
- case 5: return [5, __values(__asyncDelegator.apply(void 0, [__asyncValues.apply(void 0, [_g.sent()])]))];
110
- case 6: return [4, __await.apply(void 0, [_g.sent()])];
106
+ case 4: return [5, __values(__asyncDelegator.apply(void 0, [__asyncValues.apply(void 0, [_g.sent()])]))];
107
+ case 5: return [4, __await.apply(void 0, [_g.sent()])];
108
+ case 6:
109
+ _g.sent();
110
+ return [3, 15];
111
111
  case 7:
112
+ if (!d.isFile()) return [3, 10];
113
+ return [4, __await(path_1.default.relative(baseDir, entry))];
114
+ case 8: return [4, _g.sent()];
115
+ case 9:
112
116
  _g.sent();
113
- return [3, 16];
114
- case 8:
115
- if (!d.isFile()) return [3, 11];
116
- return [4, __await(path_1["default"].relative(baseDir, entry))];
117
- case 9: return [4, _g.sent()];
117
+ return [3, 15];
118
118
  case 10:
119
- _g.sent();
120
- return [3, 16];
119
+ if (!d.isSymbolicLink()) return [3, 15];
120
+ return [4, __await(promises_1.default.realpath(entry))];
121
121
  case 11:
122
- if (!d.isSymbolicLink()) return [3, 16];
123
- return [4, __await(promises_1["default"].realpath(entry))];
124
- case 12:
125
122
  realPath = _g.sent();
126
123
  if (!realPath.startsWith(baseDir)) {
127
- throw new Error("symbolic link ".concat(path_1["default"].relative(baseDir, entry), " targets a file outside of the base directory: ").concat(baseDir));
124
+ throw new Error("symbolic link ".concat(path_1.default.relative(baseDir, entry), " targets a file outside of the base directory: ").concat(baseDir));
128
125
  }
129
- return [4, __await(promises_1["default"].stat(realPath))];
130
- case 13:
126
+ return [4, __await(promises_1.default.stat(realPath))];
127
+ case 12:
131
128
  stats = _g.sent();
132
- if (!stats.isFile()) return [3, 16];
133
- return [4, __await(path_1["default"].relative(baseDir, entry))];
134
- case 14: return [4, _g.sent()];
135
- case 15:
129
+ if (!stats.isFile()) return [3, 15];
130
+ return [4, __await(path_1.default.relative(baseDir, entry))];
131
+ case 13: return [4, _g.sent()];
132
+ case 14:
136
133
  _g.sent();
137
- _g.label = 16;
138
- case 16: return [3, 18];
139
- case 17:
134
+ _g.label = 15;
135
+ case 15:
140
136
  _a = true;
141
- return [7];
142
- case 18: return [3, 2];
143
- case 19: return [3, 26];
144
- case 20:
137
+ return [3, 2];
138
+ case 16: return [3, 23];
139
+ case 17:
145
140
  e_1_1 = _g.sent();
146
141
  e_1 = { error: e_1_1 };
147
- return [3, 26];
148
- case 21:
149
- _g.trys.push([21, , 24, 25]);
150
- if (!(!_a && !_d && (_e = _b["return"]))) return [3, 23];
142
+ return [3, 23];
143
+ case 18:
144
+ _g.trys.push([18, , 21, 22]);
145
+ if (!(!_a && !_d && (_e = _b.return))) return [3, 20];
151
146
  return [4, __await(_e.call(_b))];
152
- case 22:
147
+ case 19:
153
148
  _g.sent();
154
- _g.label = 23;
155
- case 23: return [3, 25];
156
- case 24:
149
+ _g.label = 20;
150
+ case 20: return [3, 22];
151
+ case 21:
157
152
  if (e_1) throw e_1.error;
158
153
  return [7];
159
- case 25: return [7];
160
- case 26: return [2];
154
+ case 22: return [7];
155
+ case 23: return [2];
161
156
  }
162
157
  });
163
158
  });
@@ -169,11 +164,11 @@ function buildManifest(dir) {
169
164
  return __generator(this, function (_g) {
170
165
  switch (_g.label) {
171
166
  case 0:
172
- pluginJson = JSON.parse((0, fs_1.readFileSync)(path_1["default"].join(dir, 'plugin.json'), { encoding: 'utf8' }));
167
+ pluginJson = JSON.parse((0, fs_1.readFileSync)(path_1.default.join(dir, 'plugin.json'), { encoding: 'utf8' }));
173
168
  manifest = {
174
169
  plugin: pluginJson.id,
175
170
  version: pluginJson.info.version,
176
- files: {}
171
+ files: {},
177
172
  };
178
173
  _g.label = 1;
179
174
  case 1:
@@ -188,22 +183,19 @@ function buildManifest(dir) {
188
183
  if (!(_f = _g.sent(), _a = _f.done, !_a)) return [3, 6];
189
184
  _c = _f.value;
190
185
  _d = false;
191
- try {
192
- filePath = _c;
193
- if (filePath === MANIFEST_FILE) {
194
- return [3, 5];
195
- }
196
- sanitisedFilePath = filePath.split(path_1["default"].sep).join(path_1["default"].posix.sep);
197
- manifest.files[sanitisedFilePath] = crypto_1["default"]
198
- .createHash('sha256')
199
- .update((0, fs_1.readFileSync)(path_1["default"].join(dir, filePath)))
200
- .digest('hex');
201
- }
202
- finally {
203
- _d = true;
186
+ filePath = _c;
187
+ if (filePath === MANIFEST_FILE) {
188
+ return [3, 5];
204
189
  }
190
+ sanitisedFilePath = filePath.split(path_1.default.sep).join(path_1.default.posix.sep);
191
+ manifest.files[sanitisedFilePath] = crypto_1.default
192
+ .createHash('sha256')
193
+ .update((0, fs_1.readFileSync)(path_1.default.join(dir, filePath)))
194
+ .digest('hex');
205
195
  _g.label = 5;
206
- case 5: return [3, 3];
196
+ case 5:
197
+ _d = true;
198
+ return [3, 3];
207
199
  case 6: return [3, 13];
208
200
  case 7:
209
201
  e_2_1 = _g.sent();
@@ -211,7 +203,7 @@ function buildManifest(dir) {
211
203
  return [3, 13];
212
204
  case 8:
213
205
  _g.trys.push([8, , 11, 12]);
214
- if (!(!_d && !_a && (_b = _e["return"]))) return [3, 10];
206
+ if (!(!_d && !_a && (_b = _e.return))) return [3, 10];
215
207
  return [4, _b.call(_e)];
216
208
  case 9:
217
209
  _g.sent();
@@ -237,10 +229,10 @@ function signManifest(manifest) {
237
229
  GRAFANA_API_KEY = process.env.GRAFANA_API_KEY;
238
230
  GRAFANA_ACCESS_POLICY_TOKEN = process.env.GRAFANA_ACCESS_POLICY_TOKEN;
239
231
  if (!GRAFANA_ACCESS_POLICY_TOKEN && !GRAFANA_API_KEY) {
240
- throw new Error('You must create a GRAFANA_ACCESS_POLICY_TOKEN env variable to sign plugins. Please see: https://grafana.com/docs/grafana/latest/developers/plugins/sign-a-plugin/#generate-a-token for instructions.');
232
+ throw new Error('You must create a GRAFANA_ACCESS_POLICY_TOKEN env variable to sign plugins. Please see: https://grafana.com/developers/plugin-tools/publish-a-plugin/sign-a-plugin#generate-an-access-policy-token for instructions.');
241
233
  }
242
234
  if (GRAFANA_API_KEY) {
243
- console.warn("\u001B[33m%s\u001B[0m", 'The usage of GRAFANA_API_KEY is deprecated, please consider using GRAFANA_ACCESS_POLICY_TOKEN instead. For more info visit https://grafana.com/docs/grafana/latest/developers/plugins/publish-a-plugin/sign-a-plugin');
235
+ console.warn("\u001B[33m%s\u001B[0m", 'The usage of GRAFANA_API_KEY is deprecated, please consider using GRAFANA_ACCESS_POLICY_TOKEN instead. For more info visit https://grafana.com/developers/plugin-tools/publish-a-plugin/sign-a-plugin');
244
236
  }
245
237
  GRAFANA_COM_URL = process.env.GRAFANA_COM_URL || 'https://grafana.com/api';
246
238
  url = GRAFANA_COM_URL + '/plugins/ci/sign';
@@ -249,7 +241,7 @@ function signManifest(manifest) {
249
241
  case 1:
250
242
  _c.trys.push([1, 3, , 4]);
251
243
  return [4, (0, request_1.postData)(url, manifest, {
252
- Authorization: 'Bearer ' + token
244
+ Authorization: 'Bearer ' + token,
253
245
  })];
254
246
  case 2:
255
247
  info = _c.sent();
@@ -272,7 +264,7 @@ function signManifest(manifest) {
272
264
  exports.signManifest = signManifest;
273
265
  function saveManifest(dir, signedManifest) {
274
266
  try {
275
- (0, fs_1.writeFileSync)(path_1["default"].join(dir, MANIFEST_FILE), signedManifest);
267
+ (0, fs_1.writeFileSync)(path_1.default.join(dir, MANIFEST_FILE), signedManifest);
276
268
  return true;
277
269
  }
278
270
  catch (error) {
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- exports.__esModule = true;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.assertRootUrlIsValid = exports.getPluginJson = exports.validatePluginJson = void 0;
4
4
  var validatePluginJson = function (pluginJson) {
5
5
  if (!pluginJson.id) {
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- exports.__esModule = true;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var pluginValidation_1 = require("./pluginValidation");
4
4
  describe('pluginValidation', function () {
5
5
  describe('plugin.json', function () {
@@ -49,10 +49,12 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
49
49
  var __importDefault = (this && this.__importDefault) || function (mod) {
50
50
  return (mod && mod.__esModule) ? mod : { "default": mod };
51
51
  };
52
- exports.__esModule = true;
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
53
  exports.postData = void 0;
54
54
  var https_1 = __importDefault(require("https"));
55
+ var proxy_agent_1 = require("proxy-agent");
55
56
  var url_1 = require("url");
57
+ var agent = new proxy_agent_1.ProxyAgent();
56
58
  function postData(urlString, data, headers) {
57
59
  return __awaiter(this, void 0, void 0, function () {
58
60
  return __generator(this, function (_a) {
@@ -64,9 +66,10 @@ function postData(urlString, data, headers) {
64
66
  port: url.port || 443,
65
67
  path: url.pathname,
66
68
  method: 'POST',
67
- headers: __assign(__assign({}, headers), { 'Content-Type': 'application/json' })
69
+ headers: __assign(__assign({}, headers), { 'Content-Type': 'application/json' }),
70
+ agent: agent,
68
71
  };
69
- var req = https_1["default"].request(options, function (res) {
72
+ var req = https_1.default.request(options, function (res) {
70
73
  var chunks = [];
71
74
  res.on('data', function (chunk) { return chunks.push(chunk); });
72
75
  res.on('end', function () {
@@ -74,7 +77,7 @@ function postData(urlString, data, headers) {
74
77
  var results = Buffer.concat(chunks);
75
78
  resolve({
76
79
  data: results.toString(),
77
- status: (_a = res.statusCode) !== null && _a !== void 0 ? _a : 200
80
+ status: (_a = res.statusCode) !== null && _a !== void 0 ? _a : 200,
78
81
  });
79
82
  });
80
83
  res.on('error', reject);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grafana/sign-plugin",
3
- "version": "2.0.0",
3
+ "version": "2.0.2-canary.481.f400697.0",
4
4
  "main": "index.js",
5
5
  "repository": {
6
6
  "directory": "packages/sign-plugin",
@@ -23,7 +23,8 @@
23
23
  "typecheck": "tsc --noEmit"
24
24
  },
25
25
  "dependencies": {
26
- "minimist": "^1.2.2"
26
+ "minimist": "^1.2.2",
27
+ "proxy-agent": "6.3.1"
27
28
  },
28
29
  "devDependencies": {
29
30
  "@types/minimist": "^1.2.2"
@@ -40,5 +41,5 @@
40
41
  "engines": {
41
42
  "node": ">=18"
42
43
  },
43
- "gitHead": "d61bc5effe7e3c9bd444ebe05c6840c48f15ecef"
44
+ "gitHead": "f40069751aa92d8136651fefac2bf57b1cd15c4d"
44
45
  }
@@ -80,11 +80,11 @@ export async function signManifest(manifest: ManifestInfo): Promise<string> {
80
80
 
81
81
  if(!GRAFANA_ACCESS_POLICY_TOKEN && !GRAFANA_API_KEY) {
82
82
  throw new Error(
83
- 'You must create a GRAFANA_ACCESS_POLICY_TOKEN env variable to sign plugins. Please see: https://grafana.com/docs/grafana/latest/developers/plugins/sign-a-plugin/#generate-a-token for instructions.'
83
+ 'You must create a GRAFANA_ACCESS_POLICY_TOKEN env variable to sign plugins. Please see: https://grafana.com/developers/plugin-tools/publish-a-plugin/sign-a-plugin#generate-an-access-policy-token for instructions.'
84
84
  );
85
85
  }
86
86
  if (GRAFANA_API_KEY) {
87
- console.warn(`\x1b[33m%s\x1b[0m`,'The usage of GRAFANA_API_KEY is deprecated, please consider using GRAFANA_ACCESS_POLICY_TOKEN instead. For more info visit https://grafana.com/docs/grafana/latest/developers/plugins/publish-a-plugin/sign-a-plugin')
87
+ console.warn(`\x1b[33m%s\x1b[0m`,'The usage of GRAFANA_API_KEY is deprecated, please consider using GRAFANA_ACCESS_POLICY_TOKEN instead. For more info visit https://grafana.com/developers/plugin-tools/publish-a-plugin/sign-a-plugin')
88
88
  }
89
89
 
90
90
  const GRAFANA_COM_URL = process.env.GRAFANA_COM_URL || 'https://grafana.com/api';
@@ -1,4 +1,6 @@
1
1
  import https, { RequestOptions } from 'https';
2
+ import { ProxyAgent } from 'proxy-agent';
3
+
2
4
  import { URL } from 'url';
3
5
 
4
6
  interface Headers {
@@ -11,6 +13,8 @@ interface Response<R> {
11
13
  status: number;
12
14
  }
13
15
 
16
+ const agent = new ProxyAgent();
17
+
14
18
  export async function postData(urlString: string, data: unknown, headers: Headers): Promise<Response<string>> {
15
19
  return new Promise<Response<string>>((resolve, reject) => {
16
20
  const url = new URL(urlString);
@@ -25,6 +29,7 @@ export async function postData(urlString: string, data: unknown, headers: Header
25
29
  ...headers,
26
30
  'Content-Type': 'application/json',
27
31
  },
32
+ agent,
28
33
  };
29
34
 
30
35
  const req = https.request(options, (res) => {