mirror of https://github.com/certd/certd
perf: huawei signer ts化
parent
3751fcd4c9
commit
ac15c8fc0e
|
@ -134,6 +134,10 @@ module.exports = async function(client, userOpts) {
|
||||||
|
|
||||||
await client.waitForValidStatus(challenge);
|
await client.waitForValidStatus(challenge);
|
||||||
}
|
}
|
||||||
|
catch (e) {
|
||||||
|
log(`[auto] [${d}] challengeCreateFn threw error: ${e.message}`);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
finally {
|
finally {
|
||||||
/* Trigger challengeRemoveFn(), suppress errors */
|
/* Trigger challengeRemoveFn(), suppress errors */
|
||||||
log(`[auto] [${d}] Trigger challengeRemoveFn()`);
|
log(`[auto] [${d}] Trigger challengeRemoveFn()`);
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { AUTOWIRE_KEY } from "../decorator";
|
||||||
export const PLUGIN_CLASS_KEY = "pipeline:plugin";
|
export const PLUGIN_CLASS_KEY = "pipeline:plugin";
|
||||||
|
|
||||||
export function IsTaskPlugin(define: PluginDefine): ClassDecorator {
|
export function IsTaskPlugin(define: PluginDefine): ClassDecorator {
|
||||||
|
console.log("IsTaskPlugin");
|
||||||
return (target: any) => {
|
return (target: any) => {
|
||||||
target = Decorator.target(target);
|
target = Decorator.target(target);
|
||||||
|
|
||||||
|
|
|
@ -17,23 +17,22 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/acme-client": "workspace:^0.3.0",
|
"@certd/acme-client": "workspace:^0.3.0",
|
||||||
|
"@certd/pipeline": "workspace:^0.3.0",
|
||||||
|
"@certd/plugin-cert": "workspace:^0.3.0",
|
||||||
|
"@certd/plugin-util": "workspace:^0.3.0",
|
||||||
|
"axios": "^0.27.2",
|
||||||
"dayjs": "^1.11.6",
|
"dayjs": "^1.11.6",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"node-forge": "^0.10.0",
|
"node-forge": "^0.10.0"
|
||||||
"@certd/pipeline": "workspace:^0.3.0",
|
|
||||||
"@certd/plugin-util": "workspace:^0.3.0",
|
|
||||||
"@certd/plugin-cert": "workspace:^0.3.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"log4js": "^6.7.1",
|
|
||||||
"@types/lodash": "^4.14.186",
|
|
||||||
"vue-tsc": "^0.38.9",
|
|
||||||
"@alicloud/cs20151215": "^3.0.3",
|
"@alicloud/cs20151215": "^3.0.3",
|
||||||
"@alicloud/openapi-client": "^0.4.0",
|
"@alicloud/openapi-client": "^0.4.0",
|
||||||
"@alicloud/pop-core": "^1.7.10",
|
"@alicloud/pop-core": "^1.7.10",
|
||||||
"@midwayjs/core": "^3.0.0",
|
"@midwayjs/core": "^3.0.0",
|
||||||
"@midwayjs/decorator": "^3.0.0",
|
"@midwayjs/decorator": "^3.0.0",
|
||||||
"@types/chai": "^4.3.3",
|
"@types/chai": "^4.3.3",
|
||||||
|
"@types/lodash": "^4.14.186",
|
||||||
"@types/mocha": "^10.0.0",
|
"@types/mocha": "^10.0.0",
|
||||||
"@types/node-forge": "^1.3.0",
|
"@types/node-forge": "^1.3.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.38.1",
|
"@typescript-eslint/eslint-plugin": "^5.38.1",
|
||||||
|
@ -44,9 +43,11 @@
|
||||||
"eslint-plugin-import": "^2.26.0",
|
"eslint-plugin-import": "^2.26.0",
|
||||||
"eslint-plugin-node": "^11.1.0",
|
"eslint-plugin-node": "^11.1.0",
|
||||||
"eslint-plugin-prettier": "^4.2.1",
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
|
"log4js": "^6.7.1",
|
||||||
"mocha": "^10.1.0",
|
"mocha": "^10.1.0",
|
||||||
"ts-node": "^10.9.1",
|
"ts-node": "^10.9.1",
|
||||||
"typescript": "^4.8.4",
|
"typescript": "^4.8.4",
|
||||||
"vite": "^3.1.0"
|
"vite": "^3.1.0",
|
||||||
|
"vue-tsc": "^0.38.9"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
// @ts-ignore
|
import { Signer, SigHttpRequest } from "./signer";
|
||||||
import signer from "./signer";
|
|
||||||
import { HuaweiAccess } from "../access";
|
import { HuaweiAccess } from "../access";
|
||||||
import { axios } from "@certd/acme-client";
|
import axios from "axios";
|
||||||
import { logger } from "@certd/pipeline";
|
import { logger } from "@certd/pipeline";
|
||||||
|
|
||||||
export type ApiRequestOptions = {
|
export type ApiRequestOptions = {
|
||||||
|
@ -16,10 +15,7 @@ export class HuaweiYunClient {
|
||||||
this.access = access;
|
this.access = access;
|
||||||
}
|
}
|
||||||
async request(options: ApiRequestOptions) {
|
async request(options: ApiRequestOptions) {
|
||||||
const sig = new signer.Signer();
|
const sig = new Signer(this.access.accessKeyId, this.access.accessKeySecret);
|
||||||
//Set the AK/SK to sign and authenticate the request.
|
|
||||||
sig.Key = this.access.accessKeyId;
|
|
||||||
sig.Secret = this.access.accessKeySecret;
|
|
||||||
|
|
||||||
//The following example shows how to set the request URL and parameters to query a VPC list.
|
//The following example shows how to set the request URL and parameters to query a VPC list.
|
||||||
//Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH.
|
//Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH.
|
||||||
|
@ -30,7 +26,7 @@ export class HuaweiYunClient {
|
||||||
if (options.data) {
|
if (options.data) {
|
||||||
body = JSON.stringify(options.data);
|
body = JSON.stringify(options.data);
|
||||||
}
|
}
|
||||||
const r = new signer.HttpRequest(options.method, options.url, options.headers, body);
|
const r = new SigHttpRequest(options.method, options.url, options.headers, body);
|
||||||
//Add header parameters, for example, x-domain-id for invoking a global service and x-project-id for invoking a project-level service.
|
//Add header parameters, for example, x-domain-id for invoking a global service and x-project-id for invoking a project-level service.
|
||||||
r.headers = { "Content-Type": "application/json" };
|
r.headers = { "Content-Type": "application/json" };
|
||||||
//Add a body if you have specified the PUT or POST method. Special characters, such as the double quotation mark ("), contained in the body must be escaped.
|
//Add a body if you have specified the PUT or POST method. Special characters, such as the double quotation mark ("), contained in the body must be escaped.
|
||||||
|
|
|
@ -1,501 +0,0 @@
|
||||||
// HWS API Gateway Signature
|
|
||||||
(function (root, factory) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/*global define*/
|
|
||||||
if (typeof define === "function" && define.amd) {
|
|
||||||
// AMD
|
|
||||||
define(["CryptoJS"], function (CryptoJS) {
|
|
||||||
var crypto_wrapper = {
|
|
||||||
hmacsha256: function (keyByte, message) {
|
|
||||||
return CryptoJS.HmacSHA256(message, keyByte).toString(CryptoJS.enc.Hex);
|
|
||||||
},
|
|
||||||
HexEncodeSHA256Hash: function (body) {
|
|
||||||
return CryptoJS.SHA256(body);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
return factory(crypto_wrapper);
|
|
||||||
});
|
|
||||||
} else if (typeof wx === "object") {
|
|
||||||
// wechat
|
|
||||||
var CryptoJS = require("./js/hmac-sha256.js");
|
|
||||||
var crypto_wrapper = {
|
|
||||||
hmacsha256: function (keyByte, message) {
|
|
||||||
return CryptoJS.HmacSHA256(message, keyByte).toString(CryptoJS.enc.Hex);
|
|
||||||
},
|
|
||||||
HexEncodeSHA256Hash: function (body) {
|
|
||||||
return CryptoJS.SHA256(body);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
module.exports = factory(crypto_wrapper);
|
|
||||||
} else if (typeof module === "object" && module.exports) {
|
|
||||||
// Node
|
|
||||||
var crypto = require("crypto");
|
|
||||||
var crypto_wrapper = {
|
|
||||||
hmacsha256: function (keyByte, message) {
|
|
||||||
return crypto.createHmac("SHA256", keyByte).update(message).digest().toString("hex");
|
|
||||||
},
|
|
||||||
HexEncodeSHA256Hash: function (body) {
|
|
||||||
return crypto.createHash("SHA256").update(body).digest().toString("hex");
|
|
||||||
},
|
|
||||||
};
|
|
||||||
module.exports = factory(crypto_wrapper);
|
|
||||||
} else {
|
|
||||||
// Browser
|
|
||||||
var CryptoJS = root.CryptoJS;
|
|
||||||
var crypto_wrapper = {
|
|
||||||
hmacsha256: function (keyByte, message) {
|
|
||||||
return CryptoJS.HmacSHA256(message, keyByte).toString(CryptoJS.enc.Hex);
|
|
||||||
},
|
|
||||||
HexEncodeSHA256Hash: function (body) {
|
|
||||||
return CryptoJS.SHA256(body);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
root.signer = factory(crypto_wrapper);
|
|
||||||
}
|
|
||||||
})(this, function (crypto_wrapper) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var Algorithm = "SDK-HMAC-SHA256";
|
|
||||||
var HeaderXDate = "X-Sdk-Date";
|
|
||||||
var HeaderAuthorization = "Authorization";
|
|
||||||
var HeaderContentSha256 = "x-sdk-content-sha256";
|
|
||||||
|
|
||||||
const hexTable = new Array(256);
|
|
||||||
for (var i = 0; i < 256; ++i) hexTable[i] = "%" + ((i < 16 ? "0" : "") + i.toString(16)).toUpperCase();
|
|
||||||
|
|
||||||
const noEscape = [
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0, // 0 - 15
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0, // 16 - 31
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
0, // 32 - 47
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0, // 48 - 63
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1, // 64 - 79
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
1, // 80 - 95
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1, // 96 - 111
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
0, // 112 - 127
|
|
||||||
];
|
|
||||||
|
|
||||||
// function urlEncode is based on https://github.com/nodejs/node/blob/master/lib/querystring.js
|
|
||||||
// Copyright Joyent, Inc. and other Node contributors.
|
|
||||||
function urlEncode(str) {
|
|
||||||
if (typeof str !== "string") {
|
|
||||||
if (typeof str === "object") str = String(str);
|
|
||||||
else str += "";
|
|
||||||
}
|
|
||||||
var out = "";
|
|
||||||
var lastPos = 0;
|
|
||||||
|
|
||||||
for (var i = 0; i < str.length; ++i) {
|
|
||||||
var c = str.charCodeAt(i);
|
|
||||||
|
|
||||||
// ASCII
|
|
||||||
if (c < 0x80) {
|
|
||||||
if (noEscape[c] === 1) continue;
|
|
||||||
if (lastPos < i) out += str.slice(lastPos, i);
|
|
||||||
lastPos = i + 1;
|
|
||||||
out += hexTable[c];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lastPos < i) out += str.slice(lastPos, i);
|
|
||||||
|
|
||||||
// Multi-byte characters ...
|
|
||||||
if (c < 0x800) {
|
|
||||||
lastPos = i + 1;
|
|
||||||
out += hexTable[0xc0 | (c >> 6)] + hexTable[0x80 | (c & 0x3f)];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (c < 0xd800 || c >= 0xe000) {
|
|
||||||
lastPos = i + 1;
|
|
||||||
out += hexTable[0xe0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3f)] + hexTable[0x80 | (c & 0x3f)];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Surrogate pair
|
|
||||||
++i;
|
|
||||||
|
|
||||||
if (i >= str.length) throw new errors.URIError("ERR_INVALID_URI");
|
|
||||||
|
|
||||||
var c2 = str.charCodeAt(i) & 0x3ff;
|
|
||||||
|
|
||||||
lastPos = i + 1;
|
|
||||||
c = 0x10000 + (((c & 0x3ff) << 10) | c2);
|
|
||||||
out += hexTable[0xf0 | (c >> 18)] + hexTable[0x80 | ((c >> 12) & 0x3f)] + hexTable[0x80 | ((c >> 6) & 0x3f)] + hexTable[0x80 | (c & 0x3f)];
|
|
||||||
}
|
|
||||||
if (lastPos === 0) return str;
|
|
||||||
if (lastPos < str.length) return out + str.slice(lastPos);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
function HttpRequest(method, url, headers, body) {
|
|
||||||
if (method === undefined) {
|
|
||||||
this.method = "";
|
|
||||||
} else {
|
|
||||||
this.method = method;
|
|
||||||
}
|
|
||||||
if (url === undefined) {
|
|
||||||
this.host = "";
|
|
||||||
this.uri = "";
|
|
||||||
this.query = {};
|
|
||||||
} else {
|
|
||||||
this.query = {};
|
|
||||||
var host, path;
|
|
||||||
var i = url.indexOf("://");
|
|
||||||
if (i !== -1) {
|
|
||||||
url = url.substr(i + 3);
|
|
||||||
}
|
|
||||||
var i = url.indexOf("?");
|
|
||||||
if (i !== -1) {
|
|
||||||
var query_str = url.substr(i + 1);
|
|
||||||
url = url.substr(0, i);
|
|
||||||
var spl = query_str.split("&");
|
|
||||||
for (var i in spl) {
|
|
||||||
var kv = spl[i];
|
|
||||||
var index = kv.indexOf("=");
|
|
||||||
var key, value;
|
|
||||||
if (index >= 0) {
|
|
||||||
key = kv.substr(0, index);
|
|
||||||
value = kv.substr(index + 1);
|
|
||||||
} else {
|
|
||||||
key = kv;
|
|
||||||
value = "";
|
|
||||||
}
|
|
||||||
if (key !== "") {
|
|
||||||
key = decodeURI(key);
|
|
||||||
value = decodeURI(value);
|
|
||||||
if (this.query[key] === undefined) {
|
|
||||||
this.query[key] = [value];
|
|
||||||
} else {
|
|
||||||
this.query[key].push(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var i = url.indexOf("/");
|
|
||||||
if (i === -1) {
|
|
||||||
host = url;
|
|
||||||
path = "/";
|
|
||||||
} else {
|
|
||||||
host = url.substr(0, i);
|
|
||||||
path = url.substr(i);
|
|
||||||
}
|
|
||||||
this.host = host;
|
|
||||||
this.uri = decodeURI(path);
|
|
||||||
}
|
|
||||||
if (headers === undefined) {
|
|
||||||
this.headers = {};
|
|
||||||
} else {
|
|
||||||
this.headers = headers;
|
|
||||||
}
|
|
||||||
if (body === undefined) {
|
|
||||||
this.body = "";
|
|
||||||
} else {
|
|
||||||
this.body = body;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function findHeader(r, header) {
|
|
||||||
for (var k in r.headers) {
|
|
||||||
if (k.toLowerCase() === header.toLowerCase()) {
|
|
||||||
return r.headers[k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build a CanonicalRequest from a regular request string
|
|
||||||
//
|
|
||||||
// CanonicalRequest =
|
|
||||||
// HTTPRequestMethod + '\n' +
|
|
||||||
// CanonicalURI + '\n' +
|
|
||||||
// CanonicalQueryString + '\n' +
|
|
||||||
// CanonicalHeaders + '\n' +
|
|
||||||
// SignedHeaders + '\n' +
|
|
||||||
// HexEncode(Hash(RequestPayload))
|
|
||||||
function CanonicalRequest(r, signedHeaders) {
|
|
||||||
var hexencode = findHeader(r, HeaderContentSha256);
|
|
||||||
if (hexencode === null) {
|
|
||||||
var data = RequestPayload(r);
|
|
||||||
hexencode = crypto_wrapper.HexEncodeSHA256Hash(data);
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
r.method +
|
|
||||||
"\n" +
|
|
||||||
CanonicalURI(r) +
|
|
||||||
"\n" +
|
|
||||||
CanonicalQueryString(r) +
|
|
||||||
"\n" +
|
|
||||||
CanonicalHeaders(r, signedHeaders) +
|
|
||||||
"\n" +
|
|
||||||
signedHeaders.join(";") +
|
|
||||||
"\n" +
|
|
||||||
hexencode
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function CanonicalURI(r) {
|
|
||||||
var pattens = r.uri.split("/");
|
|
||||||
var uri = [];
|
|
||||||
for (var k in pattens) {
|
|
||||||
var v = pattens[k];
|
|
||||||
uri.push(urlEncode(v));
|
|
||||||
}
|
|
||||||
var urlpath = uri.join("/");
|
|
||||||
if (urlpath[urlpath.length - 1] !== "/") {
|
|
||||||
urlpath = urlpath + "/";
|
|
||||||
}
|
|
||||||
//r.uri = urlpath
|
|
||||||
return urlpath;
|
|
||||||
}
|
|
||||||
|
|
||||||
function CanonicalQueryString(r) {
|
|
||||||
var keys = [];
|
|
||||||
for (var key in r.query) {
|
|
||||||
keys.push(key);
|
|
||||||
}
|
|
||||||
keys.sort();
|
|
||||||
var a = [];
|
|
||||||
for (var i in keys) {
|
|
||||||
var key = urlEncode(keys[i]);
|
|
||||||
var value = r.query[keys[i]];
|
|
||||||
if (Array.isArray(value)) {
|
|
||||||
value.sort();
|
|
||||||
for (var iv in value) {
|
|
||||||
a.push(key + "=" + urlEncode(value[iv]));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
a.push(key + "=" + urlEncode(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return a.join("&");
|
|
||||||
}
|
|
||||||
|
|
||||||
function CanonicalHeaders(r, signedHeaders) {
|
|
||||||
var headers = {};
|
|
||||||
for (var key in r.headers) {
|
|
||||||
headers[key.toLowerCase()] = r.headers[key];
|
|
||||||
}
|
|
||||||
var a = [];
|
|
||||||
for (var i in signedHeaders) {
|
|
||||||
var value = headers[signedHeaders[i]];
|
|
||||||
a.push(signedHeaders[i] + ":" + value.trim());
|
|
||||||
}
|
|
||||||
return a.join("\n") + "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
function SignedHeaders(r) {
|
|
||||||
var a = [];
|
|
||||||
for (var key in r.headers) {
|
|
||||||
a.push(key.toLowerCase());
|
|
||||||
}
|
|
||||||
a.sort();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
function RequestPayload(r) {
|
|
||||||
return r.body;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a "String to Sign".
|
|
||||||
function StringToSign(canonicalRequest, t) {
|
|
||||||
var bytes = crypto_wrapper.HexEncodeSHA256Hash(canonicalRequest);
|
|
||||||
return Algorithm + "\n" + t + "\n" + bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the HWS Signature.
|
|
||||||
function SignStringToSign(stringToSign, signingKey) {
|
|
||||||
return crypto_wrapper.hmacsha256(signingKey, stringToSign);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the finalized value for the "Authorization" header. The signature
|
|
||||||
// parameter is the output from SignStringToSign
|
|
||||||
function AuthHeaderValue(signature, Key, signedHeaders) {
|
|
||||||
return Algorithm + " Access=" + Key + ", SignedHeaders=" + signedHeaders.join(";") + ", Signature=" + signature;
|
|
||||||
}
|
|
||||||
|
|
||||||
function twoChar(s) {
|
|
||||||
if (s >= 10) {
|
|
||||||
return "" + s;
|
|
||||||
} else {
|
|
||||||
return "0" + s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTime() {
|
|
||||||
var date = new Date();
|
|
||||||
return (
|
|
||||||
"" +
|
|
||||||
date.getUTCFullYear() +
|
|
||||||
twoChar(date.getUTCMonth() + 1) +
|
|
||||||
twoChar(date.getUTCDate()) +
|
|
||||||
"T" +
|
|
||||||
twoChar(date.getUTCHours()) +
|
|
||||||
twoChar(date.getUTCMinutes()) +
|
|
||||||
twoChar(date.getUTCSeconds()) +
|
|
||||||
"Z"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function Signer() {
|
|
||||||
this.Key = "";
|
|
||||||
this.Secret = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
Signer.prototype.Sign = function (r) {
|
|
||||||
var headerTime = findHeader(r, HeaderXDate);
|
|
||||||
if (headerTime === null) {
|
|
||||||
headerTime = getTime();
|
|
||||||
r.headers[HeaderXDate] = headerTime;
|
|
||||||
}
|
|
||||||
if (r.method !== "PUT" && r.method !== "PATCH" && r.method !== "POST") {
|
|
||||||
r.body = "";
|
|
||||||
}
|
|
||||||
var queryString = CanonicalQueryString(r);
|
|
||||||
if (queryString !== "") {
|
|
||||||
queryString = "?" + queryString;
|
|
||||||
}
|
|
||||||
var options = {
|
|
||||||
hostname: r.host,
|
|
||||||
path: encodeURI(r.uri) + queryString,
|
|
||||||
method: r.method,
|
|
||||||
headers: r.headers,
|
|
||||||
};
|
|
||||||
if (findHeader(r, "host") === null) {
|
|
||||||
r.headers.host = r.host;
|
|
||||||
}
|
|
||||||
var signedHeaders = SignedHeaders(r);
|
|
||||||
var canonicalRequest = CanonicalRequest(r, signedHeaders);
|
|
||||||
var stringToSign = StringToSign(canonicalRequest, headerTime);
|
|
||||||
var signature = SignStringToSign(stringToSign, this.Secret);
|
|
||||||
options.headers[HeaderAuthorization] = AuthHeaderValue(signature, this.Key, signedHeaders);
|
|
||||||
return options;
|
|
||||||
};
|
|
||||||
return {
|
|
||||||
HttpRequest: HttpRequest,
|
|
||||||
Signer: Signer,
|
|
||||||
urlEncode: urlEncode,
|
|
||||||
findHeader: findHeader,
|
|
||||||
SignedHeaders: SignedHeaders,
|
|
||||||
CanonicalRequest: CanonicalRequest,
|
|
||||||
StringToSign: StringToSign,
|
|
||||||
};
|
|
||||||
});
|
|
|
@ -0,0 +1,452 @@
|
||||||
|
import crypto from "crypto";
|
||||||
|
function hmacsha256(keyByte: any, message: any) {
|
||||||
|
return crypto.createHmac("SHA256", keyByte).update(message).digest().toString("hex");
|
||||||
|
}
|
||||||
|
function HexEncodeSHA256Hash(body: any) {
|
||||||
|
return crypto.createHash("SHA256").update(body).digest().toString("hex");
|
||||||
|
}
|
||||||
|
const Algorithm = "SDK-HMAC-SHA256";
|
||||||
|
const HeaderXDate = "X-Sdk-Date";
|
||||||
|
const HeaderAuthorization = "Authorization";
|
||||||
|
const HeaderContentSha256 = "x-sdk-content-sha256";
|
||||||
|
|
||||||
|
const hexTable = new Array(256);
|
||||||
|
for (let i = 0; i < 256; ++i) hexTable[i] = "%" + ((i < 16 ? "0" : "") + i.toString(16)).toUpperCase();
|
||||||
|
|
||||||
|
const noEscape = [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0, // 0 - 15
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0, // 16 - 31
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0, // 32 - 47
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0, // 48 - 63
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1, // 64 - 79
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1, // 80 - 95
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1, // 96 - 111
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0, // 112 - 127
|
||||||
|
];
|
||||||
|
|
||||||
|
// function urlEncode is based on https://github.com/nodejs/node/blob/master/lib/querystring.js
|
||||||
|
// Copyright Joyent, Inc. and other Node contributors.
|
||||||
|
function urlEncode(str: any) {
|
||||||
|
if (typeof str !== "string") {
|
||||||
|
if (typeof str === "object") str = String(str);
|
||||||
|
else str += "";
|
||||||
|
}
|
||||||
|
let out = "";
|
||||||
|
let lastPos = 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < str.length; ++i) {
|
||||||
|
let c = str.charCodeAt(i);
|
||||||
|
|
||||||
|
// ASCII
|
||||||
|
if (c < 0x80) {
|
||||||
|
if (noEscape[c] === 1) continue;
|
||||||
|
if (lastPos < i) out += str.slice(lastPos, i);
|
||||||
|
lastPos = i + 1;
|
||||||
|
out += hexTable[c];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastPos < i) out += str.slice(lastPos, i);
|
||||||
|
|
||||||
|
// Multi-byte characters ...
|
||||||
|
if (c < 0x800) {
|
||||||
|
lastPos = i + 1;
|
||||||
|
out += hexTable[0xc0 | (c >> 6)] + hexTable[0x80 | (c & 0x3f)];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (c < 0xd800 || c >= 0xe000) {
|
||||||
|
lastPos = i + 1;
|
||||||
|
out += hexTable[0xe0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3f)] + hexTable[0x80 | (c & 0x3f)];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Surrogate pair
|
||||||
|
++i;
|
||||||
|
|
||||||
|
if (i >= str.length) throw new Error("ERR_INVALID_URI");
|
||||||
|
|
||||||
|
const c2 = str.charCodeAt(i) & 0x3ff;
|
||||||
|
|
||||||
|
lastPos = i + 1;
|
||||||
|
c = 0x10000 + (((c & 0x3ff) << 10) | c2);
|
||||||
|
out += hexTable[0xf0 | (c >> 18)] + hexTable[0x80 | ((c >> 12) & 0x3f)] + hexTable[0x80 | ((c >> 6) & 0x3f)] + hexTable[0x80 | (c & 0x3f)];
|
||||||
|
}
|
||||||
|
if (lastPos === 0) return str;
|
||||||
|
if (lastPos < str.length) return out + str.slice(lastPos);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findHeader(r: any, header: any) {
|
||||||
|
for (const k in r.headers) {
|
||||||
|
if (k.toLowerCase() === header.toLowerCase()) {
|
||||||
|
return r.headers[k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build a CanonicalRequest from a regular request string
|
||||||
|
//
|
||||||
|
// CanonicalRequest =
|
||||||
|
// HTTPRequestMethod + '\n' +
|
||||||
|
// CanonicalURI + '\n' +
|
||||||
|
// CanonicalQueryString + '\n' +
|
||||||
|
// CanonicalHeaders + '\n' +
|
||||||
|
// SignedHeaders + '\n' +
|
||||||
|
// HexEncode(Hash(RequestPayload))
|
||||||
|
function CanonicalRequest(r: any, signedHeaders: any) {
|
||||||
|
let hexencode = findHeader(r, HeaderContentSha256);
|
||||||
|
if (hexencode === null) {
|
||||||
|
const data = RequestPayload(r);
|
||||||
|
hexencode = HexEncodeSHA256Hash(data);
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
r.method +
|
||||||
|
"\n" +
|
||||||
|
CanonicalURI(r) +
|
||||||
|
"\n" +
|
||||||
|
CanonicalQueryString(r) +
|
||||||
|
"\n" +
|
||||||
|
CanonicalHeaders(r, signedHeaders) +
|
||||||
|
"\n" +
|
||||||
|
signedHeaders.join(";") +
|
||||||
|
"\n" +
|
||||||
|
hexencode
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function CanonicalURI(r: any) {
|
||||||
|
const pattens = r.uri.split("/");
|
||||||
|
const uri = [];
|
||||||
|
for (const k in pattens) {
|
||||||
|
const v = pattens[k];
|
||||||
|
uri.push(urlEncode(v));
|
||||||
|
}
|
||||||
|
let urlpath = uri.join("/");
|
||||||
|
if (urlpath[urlpath.length - 1] !== "/") {
|
||||||
|
urlpath = urlpath + "/";
|
||||||
|
}
|
||||||
|
//r.uri = urlpath
|
||||||
|
return urlpath;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CanonicalQueryString(r: any) {
|
||||||
|
const keys = [];
|
||||||
|
for (const key in r.query) {
|
||||||
|
keys.push(key);
|
||||||
|
}
|
||||||
|
keys.sort();
|
||||||
|
const a = [];
|
||||||
|
for (const i in keys) {
|
||||||
|
const key = urlEncode(keys[i]);
|
||||||
|
const value = r.query[keys[i]];
|
||||||
|
if (Array.isArray(value)) {
|
||||||
|
value.sort();
|
||||||
|
for (const iv in value) {
|
||||||
|
a.push(key + "=" + urlEncode(value[iv]));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
a.push(key + "=" + urlEncode(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return a.join("&");
|
||||||
|
}
|
||||||
|
|
||||||
|
function CanonicalHeaders(r: any, signedHeaders: any) {
|
||||||
|
const headers: any = {};
|
||||||
|
for (const key in r.headers) {
|
||||||
|
headers[key.toLowerCase()] = r.headers[key];
|
||||||
|
}
|
||||||
|
const a = [];
|
||||||
|
for (const i in signedHeaders) {
|
||||||
|
const value = headers[signedHeaders[i]];
|
||||||
|
a.push(signedHeaders[i] + ":" + value.trim());
|
||||||
|
}
|
||||||
|
return a.join("\n") + "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
function SignedHeaders(r: any) {
|
||||||
|
const a = [];
|
||||||
|
for (const key in r.headers) {
|
||||||
|
a.push(key.toLowerCase());
|
||||||
|
}
|
||||||
|
a.sort();
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RequestPayload(r: any) {
|
||||||
|
return r.body;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a "String to Sign".
|
||||||
|
function StringToSign(canonicalRequest: any, t: any) {
|
||||||
|
const bytes = HexEncodeSHA256Hash(canonicalRequest);
|
||||||
|
return Algorithm + "\n" + t + "\n" + bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the HWS Signature.
|
||||||
|
function SignStringToSign(stringToSign: any, signingKey: any) {
|
||||||
|
return hmacsha256(signingKey, stringToSign);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the finalized value for the "Authorization" header. The signature
|
||||||
|
// parameter is the output from SignStringToSign
|
||||||
|
function AuthHeaderValue(signature: any, Key: any, signedHeaders: any) {
|
||||||
|
return Algorithm + " Access=" + Key + ", SignedHeaders=" + signedHeaders.join(";") + ", Signature=" + signature;
|
||||||
|
}
|
||||||
|
|
||||||
|
function twoChar(s: any) {
|
||||||
|
if (s >= 10) {
|
||||||
|
return "" + s;
|
||||||
|
} else {
|
||||||
|
return "0" + s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTime() {
|
||||||
|
const date = new Date();
|
||||||
|
return (
|
||||||
|
"" +
|
||||||
|
date.getUTCFullYear() +
|
||||||
|
twoChar(date.getUTCMonth() + 1) +
|
||||||
|
twoChar(date.getUTCDate()) +
|
||||||
|
"T" +
|
||||||
|
twoChar(date.getUTCHours()) +
|
||||||
|
twoChar(date.getUTCMinutes()) +
|
||||||
|
twoChar(date.getUTCSeconds()) +
|
||||||
|
"Z"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SigHttpRequest {
|
||||||
|
method = "";
|
||||||
|
host = "";
|
||||||
|
uri = "";
|
||||||
|
query: any = {};
|
||||||
|
headers: any = {};
|
||||||
|
body = "";
|
||||||
|
|
||||||
|
constructor(method: any, url: any, headers: any, body: any) {
|
||||||
|
if (method === undefined) {
|
||||||
|
this.method = "";
|
||||||
|
} else {
|
||||||
|
this.method = method;
|
||||||
|
}
|
||||||
|
if (url === undefined) {
|
||||||
|
this.host = "";
|
||||||
|
this.uri = "";
|
||||||
|
this.query = {};
|
||||||
|
} else {
|
||||||
|
this.query = {};
|
||||||
|
let host, path;
|
||||||
|
let i = url.indexOf("://");
|
||||||
|
if (i !== -1) {
|
||||||
|
url = url.substr(i + 3);
|
||||||
|
}
|
||||||
|
i = url.indexOf("?");
|
||||||
|
if (i !== -1) {
|
||||||
|
const query_str = url.substr(i + 1);
|
||||||
|
url = url.substr(0, i);
|
||||||
|
const spl = query_str.split("&");
|
||||||
|
for (const i in spl) {
|
||||||
|
const kv = spl[i];
|
||||||
|
const index = kv.indexOf("=");
|
||||||
|
let key, value;
|
||||||
|
if (index >= 0) {
|
||||||
|
key = kv.substr(0, index);
|
||||||
|
value = kv.substr(index + 1);
|
||||||
|
} else {
|
||||||
|
key = kv;
|
||||||
|
value = "";
|
||||||
|
}
|
||||||
|
if (key !== "") {
|
||||||
|
key = decodeURI(key);
|
||||||
|
value = decodeURI(value);
|
||||||
|
if (this.query[key] === undefined) {
|
||||||
|
this.query[key] = [value];
|
||||||
|
} else {
|
||||||
|
this.query[key].push(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i = url.indexOf("/");
|
||||||
|
if (i === -1) {
|
||||||
|
host = url;
|
||||||
|
path = "/";
|
||||||
|
} else {
|
||||||
|
host = url.substr(0, i);
|
||||||
|
path = url.substr(i);
|
||||||
|
}
|
||||||
|
this.host = host;
|
||||||
|
this.uri = decodeURI(path);
|
||||||
|
}
|
||||||
|
if (headers === undefined) {
|
||||||
|
this.headers = {};
|
||||||
|
} else {
|
||||||
|
this.headers = headers;
|
||||||
|
}
|
||||||
|
if (body === undefined) {
|
||||||
|
this.body = "";
|
||||||
|
} else {
|
||||||
|
this.body = body;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export class Signer {
|
||||||
|
Key = "";
|
||||||
|
Secret = "";
|
||||||
|
constructor(Key: any, Secret: any) {
|
||||||
|
this.Key = Key;
|
||||||
|
this.Secret = Secret;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sign(r: any) {
|
||||||
|
let headerTime = findHeader(r, HeaderXDate);
|
||||||
|
if (headerTime === null) {
|
||||||
|
headerTime = getTime();
|
||||||
|
r.headers[HeaderXDate] = headerTime;
|
||||||
|
}
|
||||||
|
if (r.method !== "PUT" && r.method !== "PATCH" && r.method !== "POST") {
|
||||||
|
r.body = "";
|
||||||
|
}
|
||||||
|
let queryString = CanonicalQueryString(r);
|
||||||
|
if (queryString !== "") {
|
||||||
|
queryString = "?" + queryString;
|
||||||
|
}
|
||||||
|
const options = {
|
||||||
|
hostname: r.host,
|
||||||
|
path: encodeURI(r.uri) + queryString,
|
||||||
|
method: r.method,
|
||||||
|
headers: r.headers,
|
||||||
|
};
|
||||||
|
if (findHeader(r, "host") === null) {
|
||||||
|
r.headers.host = r.host;
|
||||||
|
}
|
||||||
|
const signedHeaders = SignedHeaders(r);
|
||||||
|
const canonicalRequest = CanonicalRequest(r, signedHeaders);
|
||||||
|
const stringToSign = StringToSign(canonicalRequest, headerTime);
|
||||||
|
const signature = SignStringToSign(stringToSign, this.Secret);
|
||||||
|
options.headers[HeaderAuthorization] = AuthHeaderValue(signature, this.Key, signedHeaders);
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,58 +0,0 @@
|
||||||
export const fakeCrt = `-----BEGIN CERTIFICATE-----
|
|
||||||
MIIFSTCCBDGgAwIBAgITAPoZZk/LhVIyXoic2NnJyxubezANBgkqhkiG9w0BAQsF
|
|
||||||
ADAiMSAwHgYDVQQDDBdGYWtlIExFIEludGVybWVkaWF0ZSBYMTAeFw0yMDEyMTQx
|
|
||||||
NjA1NTFaFw0yMTAzMTQxNjA1NTFaMBsxGTAXBgNVBAMMECouZG9jbWlycm9yLmNs
|
|
||||||
dWIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC75tGrYjly+RpcZehQ
|
|
||||||
my1EpaXElT4L60pINKV2YDKnBrcSSo1c6rO7nFh12eC/ju4WwYUep0RVmBDF8xD0
|
|
||||||
I1Sd1uuDTQWP0UT1X9yqdXtjvxpUqoCHAzG633f3sJRFul7mDLuC9tRCuae9o7qP
|
|
||||||
EZ827XOmjBR35dso9I2GEE4828J3YE3tSKtobZlM+30jozLEcsO0PTyM5mq5PPjP
|
|
||||||
VI3fGLcEaBmLZf5ixz4XkcY9IAhyAMYf03cT2wRoYPBaDdXblgCYL6sFtIMbzl3M
|
|
||||||
Di94PB8NyoNSsC2nmBdWi54wFOgBvY/4ljsX/q7X3EqlSvcA0/M6/c/J9kJ3eupv
|
|
||||||
jV8nAgMBAAGjggJ9MIICeTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB
|
|
||||||
BQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAkdTjSCV3KD
|
|
||||||
x28sf98MrwVfyFYgMB8GA1UdIwQYMBaAFMDMA0a5WCDMXHJw8+EuyyCm9Wg6MHcG
|
|
||||||
CCsGAQUFBwEBBGswaTAyBggrBgEFBQcwAYYmaHR0cDovL29jc3Auc3RnLWludC14
|
|
||||||
MS5sZXRzZW5jcnlwdC5vcmcwMwYIKwYBBQUHMAKGJ2h0dHA6Ly9jZXJ0LnN0Zy1p
|
|
||||||
bnQteDEubGV0c2VuY3J5cHQub3JnLzArBgNVHREEJDAighAqLmRvY21pcnJvci5j
|
|
||||||
bHVigg5kb2NtaXJyb3IuY2x1YjBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEE
|
|
||||||
AYLfEwEBATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9y
|
|
||||||
ZzCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB1ABboacHRlerXw/iXGuPwdgH3jOG2
|
|
||||||
nTGoUhi2g38xqBUIAAABdmI3LM4AAAQDAEYwRAIgaiNqXSEq+sxp8eqlJXp/KFdO
|
|
||||||
so5mT50MoRsLF8Inu0ACIDP46+ekng7I0BlmyIPmbqFcZgnZFVWLLCdLYijhVyOL
|
|
||||||
AHcA3Zk0/KXnJIDJVmh9gTSZCEmySfe1adjHvKs/XMHzbmQAAAF2YjcuxwAABAMA
|
|
||||||
SDBGAiEAxpeB8/w4YkHZ62nH20h128VtuTSmYDCnF7EK2fQyeZYCIQDbJlF2wehZ
|
|
||||||
sF1BeE7qnYYqCTP0dYIrQ9HWtBa/MbGOKTANBgkqhkiG9w0BAQsFAAOCAQEAL2di
|
|
||||||
HKh6XcZtGk0BFxJa51sCZ3MLu9+Zy90kCRD4ooP5x932WxVM25+LBRd+xSzx+TRL
|
|
||||||
UVrlKp9GdMYX1JXL4Vf2NwzuFO3snPDe/qizD/3+D6yo8eKJ/LD82t5kLWAD2rto
|
|
||||||
YfVSTKwfNIBBJwHUnjviBPJmheHHCKmz8Ct6/6QxFAeta9TAMn0sFeVCQnmAq7HL
|
|
||||||
jrunq0tNHR/EKG0ITPLf+6P7MxbmpYNnq918766l0tKsW8oo8ZSGEwKU2LMaSiAa
|
|
||||||
hasyl/2gMnYXjtKOjDcnR8oLpbrOg0qpVbynmJin1HP835oHPPAZ1gLsqYTTizNz
|
|
||||||
AHxTaXliTVvS83dogw==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIEqzCCApOgAwIBAgIRAIvhKg5ZRO08VGQx8JdhT+UwDQYJKoZIhvcNAQELBQAw
|
|
||||||
GjEYMBYGA1UEAwwPRmFrZSBMRSBSb290IFgxMB4XDTE2MDUyMzIyMDc1OVoXDTM2
|
|
||||||
MDUyMzIyMDc1OVowIjEgMB4GA1UEAwwXRmFrZSBMRSBJbnRlcm1lZGlhdGUgWDEw
|
|
||||||
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtWKySDn7rWZc5ggjz3ZB0
|
|
||||||
8jO4xti3uzINfD5sQ7Lj7hzetUT+wQob+iXSZkhnvx+IvdbXF5/yt8aWPpUKnPym
|
|
||||||
oLxsYiI5gQBLxNDzIec0OIaflWqAr29m7J8+NNtApEN8nZFnf3bhehZW7AxmS1m0
|
|
||||||
ZnSsdHw0Fw+bgixPg2MQ9k9oefFeqa+7Kqdlz5bbrUYV2volxhDFtnI4Mh8BiWCN
|
|
||||||
xDH1Hizq+GKCcHsinDZWurCqder/afJBnQs+SBSL6MVApHt+d35zjBD92fO2Je56
|
|
||||||
dhMfzCgOKXeJ340WhW3TjD1zqLZXeaCyUNRnfOmWZV8nEhtHOFbUCU7r/KkjMZO9
|
|
||||||
AgMBAAGjgeMwgeAwDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAw
|
|
||||||
HQYDVR0OBBYEFMDMA0a5WCDMXHJw8+EuyyCm9Wg6MHoGCCsGAQUFBwEBBG4wbDA0
|
|
||||||
BggrBgEFBQcwAYYoaHR0cDovL29jc3Auc3RnLXJvb3QteDEubGV0c2VuY3J5cHQu
|
|
||||||
b3JnLzA0BggrBgEFBQcwAoYoaHR0cDovL2NlcnQuc3RnLXJvb3QteDEubGV0c2Vu
|
|
||||||
Y3J5cHQub3JnLzAfBgNVHSMEGDAWgBTBJnSkikSg5vogKNhcI5pFiBh54DANBgkq
|
|
||||||
hkiG9w0BAQsFAAOCAgEABYSu4Il+fI0MYU42OTmEj+1HqQ5DvyAeyCA6sGuZdwjF
|
|
||||||
UGeVOv3NnLyfofuUOjEbY5irFCDtnv+0ckukUZN9lz4Q2YjWGUpW4TTu3ieTsaC9
|
|
||||||
AFvCSgNHJyWSVtWvB5XDxsqawl1KzHzzwr132bF2rtGtazSqVqK9E07sGHMCf+zp
|
|
||||||
DQVDVVGtqZPHwX3KqUtefE621b8RI6VCl4oD30Olf8pjuzG4JKBFRFclzLRjo/h7
|
|
||||||
IkkfjZ8wDa7faOjVXx6n+eUQ29cIMCzr8/rNWHS9pYGGQKJiY2xmVC9h12H99Xyf
|
|
||||||
zWE9vb5zKP3MVG6neX1hSdo7PEAb9fqRhHkqVsqUvJlIRmvXvVKTwNCP3eCjRCCI
|
|
||||||
PTAvjV+4ni786iXwwFYNz8l3PmPLCyQXWGohnJ8iBm+5nk7O2ynaPVW0U2W+pt2w
|
|
||||||
SVuvdDM5zGv2f9ltNWUiYZHJ1mmO97jSY/6YfdOUH66iRtQtDkHBRdkNBsMbD+Em
|
|
||||||
2TgBldtHNSJBfB3pm9FblgOcJ0FSWcUDWJ7vO0+NTXlgrRofRT6pVywzxVo6dND0
|
|
||||||
WzYlTWeUVsO40xJqhgUQRER9YLOLxJ0O6C8i0xFxAMKOtSdodMB3RIwt7RFQ0uyt
|
|
||||||
n5Z5MqkYhlMI3J1tPRTp1nEt9fyGspBOO05gi148Qasp+3N+svqKomoQglNoAxU=
|
|
||||||
-----END CERTIFICATE-----`;
|
|
|
@ -1,11 +0,0 @@
|
||||||
import { expect } from "chai";
|
|
||||||
import "mocha";
|
|
||||||
import { EchoPlugin } from "../src/plugin";
|
|
||||||
describe("task_plugin", function () {
|
|
||||||
it("#taskplugin", function () {
|
|
||||||
const echoPlugin = new EchoPlugin();
|
|
||||||
const define = echoPlugin.define;
|
|
||||||
echoPlugin.execute({ context: {}, props: { test: 111 } });
|
|
||||||
expect(define.name).eq("EchoPlugin");
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,10 +0,0 @@
|
||||||
import { IAccessService } from "../../src/access/access-service";
|
|
||||||
import { AbstractAccess, HuaweiAccess } from "../../src";
|
|
||||||
import { aliyunSecret } from "../user.secret";
|
|
||||||
export class AccessServiceTest implements IAccessService {
|
|
||||||
async getById(id: any): Promise<AbstractAccess> {
|
|
||||||
return {
|
|
||||||
...aliyunSecret,
|
|
||||||
} as HuaweiAccess;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
import { ContextFactory } from "../../src/core/context";
|
|
||||||
import { FileStorage } from "../../src/core/storage";
|
|
||||||
import { AccessServiceTest } from "./access-service-test";
|
|
||||||
import { logger } from "../../src/utils/util.log";
|
|
||||||
|
|
||||||
const contextFactory = new ContextFactory(new FileStorage());
|
|
||||||
|
|
||||||
const userContext = contextFactory.getContext("user", "test");
|
|
||||||
const pipelineContext = contextFactory.getContext("pipeline", "test");
|
|
||||||
export const pluginInitProps = {
|
|
||||||
accessService: new AccessServiceTest(),
|
|
||||||
pipelineContext: pipelineContext,
|
|
||||||
userContext: userContext,
|
|
||||||
logger: logger,
|
|
||||||
};
|
|
|
@ -1,66 +0,0 @@
|
||||||
import { ConcurrencyStrategy, NextStrategy, Pipeline, RunStrategy } from "../../src";
|
|
||||||
|
|
||||||
let idIndex = 0;
|
|
||||||
function generateId() {
|
|
||||||
idIndex++;
|
|
||||||
return idIndex + "";
|
|
||||||
}
|
|
||||||
export const pipeline: Pipeline = {
|
|
||||||
version: 1,
|
|
||||||
id: generateId(),
|
|
||||||
title: "测试管道",
|
|
||||||
userId: 1,
|
|
||||||
triggers: [],
|
|
||||||
stages: [
|
|
||||||
{
|
|
||||||
id: generateId(),
|
|
||||||
title: "证书申请阶段",
|
|
||||||
concurrency: ConcurrencyStrategy.Serial,
|
|
||||||
next: NextStrategy.AllSuccess,
|
|
||||||
tasks: [
|
|
||||||
{
|
|
||||||
id: generateId(),
|
|
||||||
title: "申请证书任务",
|
|
||||||
steps: [
|
|
||||||
{
|
|
||||||
id: generateId(),
|
|
||||||
title: "申请证书",
|
|
||||||
type: "CertApply",
|
|
||||||
input: {
|
|
||||||
domains: ["*.docmirror.cn"],
|
|
||||||
email: "xiaojunnuo@qq.com",
|
|
||||||
dnsProviderType: "aliyun",
|
|
||||||
accessId: "111",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: generateId(),
|
|
||||||
title: "证书部署阶段",
|
|
||||||
concurrency: ConcurrencyStrategy.Serial,
|
|
||||||
next: NextStrategy.AllSuccess,
|
|
||||||
tasks: [
|
|
||||||
{
|
|
||||||
id: generateId(),
|
|
||||||
title: "测试输出参数任务",
|
|
||||||
steps: [
|
|
||||||
{
|
|
||||||
id: generateId(),
|
|
||||||
title: "输出参数(echo插件)",
|
|
||||||
type: "EchoPlugin",
|
|
||||||
input: {
|
|
||||||
cert: "cert",
|
|
||||||
},
|
|
||||||
strategy: {
|
|
||||||
runStrategy: RunStrategy.SkipWhenSucceed,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
|
@ -1,18 +0,0 @@
|
||||||
//import { expect } from "chai";
|
|
||||||
import "mocha";
|
|
||||||
import { Executor, RunHistory } from "../../src";
|
|
||||||
import { pipeline } from "./pipeline.define";
|
|
||||||
import { AccessServiceTest } from "./access-service-test";
|
|
||||||
import { FileStorage } from "../../src/core/storage";
|
|
||||||
describe("pipeline", function () {
|
|
||||||
it("#pipeline", async function () {
|
|
||||||
this.timeout(120000);
|
|
||||||
function onChanged(history: RunHistory) {
|
|
||||||
console.log("changed:");
|
|
||||||
}
|
|
||||||
|
|
||||||
const executor = new Executor({ userId: "test", pipeline, onChanged, accessService: new AccessServiceTest(), storage: new FileStorage() });
|
|
||||||
await executor.run(1, "user");
|
|
||||||
// expect(define.name).eq("EchoPlugin");
|
|
||||||
});
|
|
||||||
});
|
|
Loading…
Reference in New Issue