diff --git a/packages/core/acme-client/src/auto.js b/packages/core/acme-client/src/auto.js index 6f698643..6f40bc01 100644 --- a/packages/core/acme-client/src/auto.js +++ b/packages/core/acme-client/src/auto.js @@ -134,6 +134,10 @@ module.exports = async function(client, userOpts) { await client.waitForValidStatus(challenge); } + catch (e) { + log(`[auto] [${d}] challengeCreateFn threw error: ${e.message}`); + throw e; + } finally { /* Trigger challengeRemoveFn(), suppress errors */ log(`[auto] [${d}] Trigger challengeRemoveFn()`); diff --git a/packages/core/pipeline/src/plugin/decorator.ts b/packages/core/pipeline/src/plugin/decorator.ts index f8f0a830..3ab7df97 100644 --- a/packages/core/pipeline/src/plugin/decorator.ts +++ b/packages/core/pipeline/src/plugin/decorator.ts @@ -8,6 +8,7 @@ import { AUTOWIRE_KEY } from "../decorator"; export const PLUGIN_CLASS_KEY = "pipeline:plugin"; export function IsTaskPlugin(define: PluginDefine): ClassDecorator { + console.log("IsTaskPlugin"); return (target: any) => { target = Decorator.target(target); diff --git a/packages/plugins/plugin-huawei/package.json b/packages/plugins/plugin-huawei/package.json index daf32eb9..ec397b7a 100644 --- a/packages/plugins/plugin-huawei/package.json +++ b/packages/plugins/plugin-huawei/package.json @@ -17,23 +17,22 @@ }, "dependencies": { "@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", "lodash": "^4.17.21", - "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" + "node-forge": "^0.10.0" }, "devDependencies": { - "log4js": "^6.7.1", - "@types/lodash": "^4.14.186", - "vue-tsc": "^0.38.9", "@alicloud/cs20151215": "^3.0.3", "@alicloud/openapi-client": "^0.4.0", "@alicloud/pop-core": "^1.7.10", "@midwayjs/core": "^3.0.0", "@midwayjs/decorator": "^3.0.0", "@types/chai": "^4.3.3", + "@types/lodash": "^4.14.186", "@types/mocha": "^10.0.0", "@types/node-forge": "^1.3.0", "@typescript-eslint/eslint-plugin": "^5.38.1", @@ -44,9 +43,11 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", + "log4js": "^6.7.1", "mocha": "^10.1.0", "ts-node": "^10.9.1", "typescript": "^4.8.4", - "vite": "^3.1.0" + "vite": "^3.1.0", + "vue-tsc": "^0.38.9" } } diff --git a/packages/plugins/plugin-huawei/src/lib/client.ts b/packages/plugins/plugin-huawei/src/lib/client.ts index 94ef3433..9578c509 100644 --- a/packages/plugins/plugin-huawei/src/lib/client.ts +++ b/packages/plugins/plugin-huawei/src/lib/client.ts @@ -1,7 +1,6 @@ -// @ts-ignore -import signer from "./signer"; +import { Signer, SigHttpRequest } from "./signer"; import { HuaweiAccess } from "../access"; -import { axios } from "@certd/acme-client"; +import axios from "axios"; import { logger } from "@certd/pipeline"; export type ApiRequestOptions = { @@ -16,10 +15,7 @@ export class HuaweiYunClient { this.access = access; } async request(options: ApiRequestOptions) { - const sig = new signer.Signer(); - //Set the AK/SK to sign and authenticate the request. - sig.Key = this.access.accessKeyId; - sig.Secret = this.access.accessKeySecret; + const sig = new Signer(this.access.accessKeyId, this.access.accessKeySecret); //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. @@ -30,7 +26,7 @@ export class HuaweiYunClient { if (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. 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. diff --git a/packages/plugins/plugin-huawei/src/lib/signer.js b/packages/plugins/plugin-huawei/src/lib/signer.js deleted file mode 100644 index 4bcd57cf..00000000 --- a/packages/plugins/plugin-huawei/src/lib/signer.js +++ /dev/null @@ -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, - }; -}); diff --git a/packages/plugins/plugin-huawei/src/lib/signer.ts b/packages/plugins/plugin-huawei/src/lib/signer.ts new file mode 100644 index 00000000..cbf1cbcd --- /dev/null +++ b/packages/plugins/plugin-huawei/src/lib/signer.ts @@ -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; + } +} diff --git a/packages/plugins/plugin-huawei/test/cert.fake.test.ts b/packages/plugins/plugin-huawei/test/cert.fake.test.ts deleted file mode 100644 index f6a0fb0a..00000000 --- a/packages/plugins/plugin-huawei/test/cert.fake.test.ts +++ /dev/null @@ -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-----`; diff --git a/packages/plugins/plugin-huawei/test/index.test.ts b/packages/plugins/plugin-huawei/test/index.test.ts deleted file mode 100644 index 1498b2ba..00000000 --- a/packages/plugins/plugin-huawei/test/index.test.ts +++ /dev/null @@ -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"); - }); -}); diff --git a/packages/plugins/plugin-huawei/test/pipeline/access-service-test.ts b/packages/plugins/plugin-huawei/test/pipeline/access-service-test.ts deleted file mode 100644 index 4e0ee395..00000000 --- a/packages/plugins/plugin-huawei/test/pipeline/access-service-test.ts +++ /dev/null @@ -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 { - return { - ...aliyunSecret, - } as HuaweiAccess; - } -} diff --git a/packages/plugins/plugin-huawei/test/pipeline/init.test.ts b/packages/plugins/plugin-huawei/test/pipeline/init.test.ts deleted file mode 100644 index d1e28763..00000000 --- a/packages/plugins/plugin-huawei/test/pipeline/init.test.ts +++ /dev/null @@ -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, -}; diff --git a/packages/plugins/plugin-huawei/test/pipeline/pipeline.define.ts b/packages/plugins/plugin-huawei/test/pipeline/pipeline.define.ts deleted file mode 100644 index 1369d482..00000000 --- a/packages/plugins/plugin-huawei/test/pipeline/pipeline.define.ts +++ /dev/null @@ -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, - }, - }, - ], - }, - ], - }, - ], -}; diff --git a/packages/plugins/plugin-huawei/test/pipeline/pipeline.test.ts b/packages/plugins/plugin-huawei/test/pipeline/pipeline.test.ts deleted file mode 100644 index 494746e0..00000000 --- a/packages/plugins/plugin-huawei/test/pipeline/pipeline.test.ts +++ /dev/null @@ -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"); - }); -});