@adobe/aio-cli-plugin-certificate 0.4.0 → 1.0.1-pre.2024-01-08.sha-f2646ee4

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/README.md CHANGED
@@ -26,88 +26,90 @@ $ aio certificate --help
26
26
  # Commands
27
27
  <!-- commands -->
28
28
  * [`aio certificate`](#aio-certificate)
29
- * [`aio certificate:fingerprint FILE`](#aio-certificatefingerprint-file)
30
- * [`aio certificate:generate`](#aio-certificategenerate)
31
- * [`aio certificate:verify FILE`](#aio-certificateverify-file)
29
+ * [`aio certificate fingerprint FILE`](#aio-certificate-fingerprint-file)
30
+ * [`aio certificate generate`](#aio-certificate-generate)
31
+ * [`aio certificate verify FILE`](#aio-certificate-verify-file)
32
32
 
33
33
  ## `aio certificate`
34
34
 
35
- Generate or verify a certificate for use with Adobe I/O
35
+ Generate, fingerprint, or verify a certificate for use with Adobe I/O
36
36
 
37
37
  ```
38
38
  USAGE
39
39
  $ aio certificate
40
+
41
+ DESCRIPTION
42
+ Generate, fingerprint, or verify a certificate for use with Adobe I/O
40
43
  ```
41
44
 
42
- _See code: [src/commands/certificate/index.js](https://github.com/adobe/aio-cli-plugin-certificate/blob/0.4.0/src/commands/certificate/index.js)_
45
+ _See code: [src/commands/certificate/index.ts](https://github.com/adobe/aio-cli-plugin-certificate/blob/1.0.1-pre.2024-01-08.sha-f2646ee4/src/commands/certificate/index.ts)_
43
46
 
44
- ## `aio certificate:fingerprint FILE`
47
+ ## `aio certificate fingerprint FILE`
45
48
 
46
49
  Compute the fingerprint of a public key certificate for use with Adobe I/O
47
50
 
48
51
  ```
49
52
  USAGE
50
- $ aio certificate:fingerprint FILE
53
+ $ aio certificate fingerprint FILE
51
54
 
52
55
  ARGUMENTS
53
56
  FILE file path to certificate to fingerprint
57
+
58
+ DESCRIPTION
59
+ Compute the fingerprint of a public key certificate for use with Adobe I/O
54
60
  ```
55
61
 
56
- _See code: [src/commands/certificate/fingerprint.js](https://github.com/adobe/aio-cli-plugin-certificate/blob/0.4.0/src/commands/certificate/fingerprint.js)_
62
+ _See code: [src/commands/certificate/fingerprint.ts](https://github.com/adobe/aio-cli-plugin-certificate/blob/1.0.1-pre.2024-01-08.sha-f2646ee4/src/commands/certificate/fingerprint.ts)_
57
63
 
58
- ## `aio certificate:generate`
64
+ ## `aio certificate generate`
59
65
 
60
66
  Generate a new private/public key pair
61
67
 
62
68
  ```
63
69
  USAGE
64
- $ aio certificate:generate
65
-
66
- OPTIONS
67
- -c, --country=country Country Name
68
- -l, --locality=locality Locality, or city name
69
-
70
- -n, --name=name [default: selfsign.localhost] Common Name: typically a host domain name, like
71
- www.mysite.com
72
-
73
- -o, --organization=organization Organization name
74
-
75
- -s, --state=state State or Province
76
-
77
- -u, --unit=unit Organizational unit or department
78
-
79
- --days=days [default: 365] Number of days the certificate should be valid for. (Max 365)
80
-
81
- --keyout=keyout [default: private.key] file to send the key to
82
-
83
- --out=out [default: certificate_pub.crt] output file
70
+ $ aio certificate generate [--keyout <value>] [--out <value>] [-n <value>] [-c <value>] [-s <value>] [-l <value>] [-o
71
+ <value>] [-u <value>] [--days <value>]
72
+
73
+ FLAGS
74
+ -c, --country=<value> Country Name
75
+ -l, --locality=<value> Locality, or city name
76
+ -n, --name=<value> [default: selfsign.localhost] Common Name: typically a host domain name, like
77
+ www.mysite.com
78
+ -o, --organization=<value> Organization name
79
+ -s, --state=<value> State or Province
80
+ -u, --unit=<value> Organizational unit or department
81
+ --days=<value> [default: 365] Number of days the certificate should be valid for. (Max 365)
82
+ --keyout=<value> [default: private.key] file to send the key to
83
+ --out=<value> [default: certificate_pub.crt] output file
84
84
 
85
85
  DESCRIPTION
86
- Generate a self-signed certificate to enable https:// on localhost or signing jwt payloads for interacting with Adobe
86
+ Generate a new private/public key pair
87
+ Generate a self-signed certificate to enable https:// on localhost or signing jwt payloads for interacting with Adobe
87
88
  services.
88
89
  ```
89
90
 
90
- _See code: [src/commands/certificate/generate.js](https://github.com/adobe/aio-cli-plugin-certificate/blob/0.4.0/src/commands/certificate/generate.js)_
91
+ _See code: [src/commands/certificate/generate.ts](https://github.com/adobe/aio-cli-plugin-certificate/blob/1.0.1-pre.2024-01-08.sha-f2646ee4/src/commands/certificate/generate.ts)_
91
92
 
92
- ## `aio certificate:verify FILE`
93
+ ## `aio certificate verify FILE`
93
94
 
94
95
  Verify a certificate for use with Adobe I/O
95
96
 
96
97
  ```
97
98
  USAGE
98
- $ aio certificate:verify FILE
99
+ $ aio certificate verify FILE [--days <value>]
99
100
 
100
101
  ARGUMENTS
101
102
  FILE file path to certificate to verify
102
103
 
103
- OPTIONS
104
- --days=days +- is certificate valid in --days
104
+ FLAGS
105
+ --days=<value> +- is certificate valid in --days
105
106
 
106
107
  DESCRIPTION
108
+ Verify a certificate for use with Adobe I/O
107
109
  Verifies that the certificate is valid, and/or will not expire in [--days] days from now.
108
110
  ```
109
111
 
110
- _See code: [src/commands/certificate/verify.js](https://github.com/adobe/aio-cli-plugin-certificate/blob/0.4.0/src/commands/certificate/verify.js)_
112
+ _See code: [src/commands/certificate/verify.ts](https://github.com/adobe/aio-cli-plugin-certificate/blob/1.0.1-pre.2024-01-08.sha-f2646ee4/src/commands/certificate/verify.ts)_
111
113
  <!-- commandsstop -->
112
114
 
113
115
  ## Contributing
@@ -1 +1,133 @@
1
- {"version":"0.4.0","commands":{"certificate:fingerprint":{"id":"certificate:fingerprint","description":"Compute the fingerprint of a public key certificate for use with Adobe I/O","pluginName":"@adobe/aio-cli-plugin-certificate","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"file","description":"file path to certificate to fingerprint","required":true}]},"certificate:generate":{"id":"certificate:generate","description":"Generate a new private/public key pair\nGenerate a self-signed certificate to enable https:// on localhost or signing jwt payloads for interacting with Adobe services.\n","pluginName":"@adobe/aio-cli-plugin-certificate","pluginType":"core","aliases":[],"flags":{"keyout":{"name":"keyout","type":"option","description":"file to send the key to","default":"private.key"},"out":{"name":"out","type":"option","description":"output file","default":"certificate_pub.crt"},"name":{"name":"name","type":"option","char":"n","description":"Common Name: typically a host domain name, like www.mysite.com","default":"selfsign.localhost"},"country":{"name":"country","type":"option","char":"c","description":"Country Name"},"state":{"name":"state","type":"option","char":"s","description":"State or Province"},"locality":{"name":"locality","type":"option","char":"l","description":"Locality, or city name"},"organization":{"name":"organization","type":"option","char":"o","description":"Organization name"},"unit":{"name":"unit","type":"option","char":"u","description":"Organizational unit or department"},"days":{"name":"days","type":"option","description":"Number of days the certificate should be valid for. (Max 365)","default":365}},"args":[]},"certificate":{"id":"certificate","description":"Generate or verify a certificate for use with Adobe I/O","pluginName":"@adobe/aio-cli-plugin-certificate","pluginType":"core","aliases":[],"flags":{},"args":[]},"certificate:verify":{"id":"certificate:verify","description":"Verify a certificate for use with Adobe I/O\nVerifies that the certificate is valid, and/or will not expire in [--days] days from now.\n","pluginName":"@adobe/aio-cli-plugin-certificate","pluginType":"core","aliases":[],"flags":{"days":{"name":"days","type":"option","description":"+- is certificate valid in --days"}},"args":[{"name":"file","description":"file path to certificate to verify","required":true}]}}}
1
+ {
2
+ "version": "1.0.1-pre.2024-01-08.sha-f2646ee4",
3
+ "commands": {
4
+ "certificate:fingerprint": {
5
+ "id": "certificate:fingerprint",
6
+ "description": "Compute the fingerprint of a public key certificate for use with Adobe I/O",
7
+ "strict": true,
8
+ "pluginName": "@adobe/aio-cli-plugin-certificate",
9
+ "pluginAlias": "@adobe/aio-cli-plugin-certificate",
10
+ "pluginType": "core",
11
+ "aliases": [],
12
+ "flags": {},
13
+ "args": {
14
+ "file": {
15
+ "name": "file",
16
+ "description": "file path to certificate to fingerprint",
17
+ "required": true
18
+ }
19
+ }
20
+ },
21
+ "certificate:generate": {
22
+ "id": "certificate:generate",
23
+ "description": "Generate a new private/public key pair\nGenerate a self-signed certificate to enable https:// on localhost or signing jwt payloads for interacting with Adobe services.\n",
24
+ "strict": true,
25
+ "pluginName": "@adobe/aio-cli-plugin-certificate",
26
+ "pluginAlias": "@adobe/aio-cli-plugin-certificate",
27
+ "pluginType": "core",
28
+ "aliases": [],
29
+ "flags": {
30
+ "keyout": {
31
+ "name": "keyout",
32
+ "type": "option",
33
+ "description": "file to send the key to",
34
+ "multiple": false,
35
+ "default": "private.key"
36
+ },
37
+ "out": {
38
+ "name": "out",
39
+ "type": "option",
40
+ "description": "output file",
41
+ "multiple": false,
42
+ "default": "certificate_pub.crt"
43
+ },
44
+ "name": {
45
+ "name": "name",
46
+ "type": "option",
47
+ "char": "n",
48
+ "description": "Common Name: typically a host domain name, like www.mysite.com",
49
+ "multiple": false,
50
+ "default": "selfsign.localhost"
51
+ },
52
+ "country": {
53
+ "name": "country",
54
+ "type": "option",
55
+ "char": "c",
56
+ "description": "Country Name",
57
+ "multiple": false
58
+ },
59
+ "state": {
60
+ "name": "state",
61
+ "type": "option",
62
+ "char": "s",
63
+ "description": "State or Province",
64
+ "multiple": false
65
+ },
66
+ "locality": {
67
+ "name": "locality",
68
+ "type": "option",
69
+ "char": "l",
70
+ "description": "Locality, or city name",
71
+ "multiple": false
72
+ },
73
+ "organization": {
74
+ "name": "organization",
75
+ "type": "option",
76
+ "char": "o",
77
+ "description": "Organization name",
78
+ "multiple": false
79
+ },
80
+ "unit": {
81
+ "name": "unit",
82
+ "type": "option",
83
+ "char": "u",
84
+ "description": "Organizational unit or department",
85
+ "multiple": false
86
+ },
87
+ "days": {
88
+ "name": "days",
89
+ "type": "option",
90
+ "description": "Number of days the certificate should be valid for. (Max 365)",
91
+ "multiple": false,
92
+ "default": 365
93
+ }
94
+ },
95
+ "args": {}
96
+ },
97
+ "certificate": {
98
+ "id": "certificate",
99
+ "description": "Generate, fingerprint, or verify a certificate for use with Adobe I/O",
100
+ "strict": true,
101
+ "pluginName": "@adobe/aio-cli-plugin-certificate",
102
+ "pluginAlias": "@adobe/aio-cli-plugin-certificate",
103
+ "pluginType": "core",
104
+ "aliases": [],
105
+ "flags": {},
106
+ "args": {}
107
+ },
108
+ "certificate:verify": {
109
+ "id": "certificate:verify",
110
+ "description": "Verify a certificate for use with Adobe I/O\nVerifies that the certificate is valid, and/or will not expire in [--days] days from now.\n",
111
+ "strict": true,
112
+ "pluginName": "@adobe/aio-cli-plugin-certificate",
113
+ "pluginAlias": "@adobe/aio-cli-plugin-certificate",
114
+ "pluginType": "core",
115
+ "aliases": [],
116
+ "flags": {
117
+ "days": {
118
+ "name": "days",
119
+ "type": "option",
120
+ "description": "+- is certificate valid in --days",
121
+ "multiple": false
122
+ }
123
+ },
124
+ "args": {
125
+ "file": {
126
+ "name": "file",
127
+ "description": "file path to certificate to verify",
128
+ "required": true
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
package/package.json CHANGED
@@ -1,37 +1,33 @@
1
1
  {
2
2
  "name": "@adobe/aio-cli-plugin-certificate",
3
- "version": "0.4.0",
4
- "description": "Generate and validate private certs, and public key pairs for use with Adobe IO Console",
3
+ "version": "1.0.1-pre.2024-01-08.sha-f2646ee4",
4
+ "description": "Generate and validate private certificates, and public key pairs for use with Adobe IO Console",
5
5
  "repository": "adobe/aio-cli-plugin-certificate",
6
6
  "homepage": "https://github.com/adobe/aio-cli-plugin-certificate",
7
7
  "dependencies": {
8
- "@oclif/command": "^1",
9
- "@oclif/config": "^1",
10
- "@oclif/errors": "^1.1.2",
11
- "debug": "^4.1.0",
8
+ "@oclif/core": "^1.9.0",
9
+ "debug": "^4.3.3",
12
10
  "fs-extra": "^9.0.0",
13
11
  "node-forge": "^1.3.0"
14
12
  },
15
13
  "devDependencies": {
16
- "@oclif/dev-cli": "^1.21.3",
17
- "@oclif/plugin-help": "^2.1.4",
18
- "@oclif/test": "^1",
19
- "codecov": "^3.2.0",
20
- "eslint": "^6.8.0",
21
- "eslint-config-oclif": "^3.1.0",
22
- "eslint-config-standard": "^14.1.0",
23
- "eslint-plugin-import": "^2.13.10",
24
- "eslint-plugin-jest": "^23.6.0",
25
- "eslint-plugin-node": "^11.0.0",
26
- "eslint-plugin-promise": "^4.0.0",
27
- "eslint-plugin-standard": "^4.0.0",
28
- "jest": "^24.1.0",
29
- "jest-junit": "^10.0.0",
30
- "jest-resolve": "^26.0.0",
31
- "stdout-stderr": "^0.1.9"
14
+ "@adobe/eslint-config-aio-lib-config": "^2.0.2",
15
+ "eslint": "^8.56.0",
16
+ "eslint-config-oclif": "^4.0.0",
17
+ "eslint-config-standard": "^17.1.0",
18
+ "eslint-plugin-import": "^2.29.1",
19
+ "eslint-plugin-jest": "^27.6.1",
20
+ "eslint-plugin-jsdoc": "^42.0.0",
21
+ "eslint-plugin-n": "^15.7.0",
22
+ "eslint-plugin-node": "^11.1.0",
23
+ "eslint-plugin-promise": "^6.1.1",
24
+ "jest": "^29",
25
+ "stdout-stderr": "^0.1.9",
26
+ "typescript": "^5.3.3",
27
+ "oclif": "^3.2.0"
32
28
  },
33
29
  "engines": {
34
- "node": ">=10.0.0"
30
+ "node": ">=18"
35
31
  },
36
32
  "files": [
37
33
  "/oclif.manifest.json",
@@ -46,9 +42,7 @@
46
42
  "oclif": {
47
43
  "commands": "./src/commands",
48
44
  "bin": "aio",
49
- "devPlugins": [
50
- "@oclif/plugin-help"
51
- ],
45
+ "topicSeparator": " ",
52
46
  "repositoryPrefix": "<%- repo %>/blob/<%- version %>/<%- commandPath %>"
53
47
  },
54
48
  "main": "src/certificate.js",
@@ -56,9 +50,9 @@
56
50
  "posttest": "eslint src test",
57
51
  "test": "npm run unit-tests",
58
52
  "unit-tests": "jest --ci",
59
- "prepack": "oclif-dev manifest && oclif-dev readme",
53
+ "prepack": "oclif manifest && oclif readme --no-aliases",
60
54
  "postpack": "rm -f oclif.manifest.json",
61
- "version": "oclif-dev readme && git add README.md"
55
+ "version": "oclif readme && git add README.md"
62
56
  },
63
57
  "jest": {
64
58
  "collectCoverage": true,
@@ -68,13 +62,10 @@
68
62
  "coveragePathIgnorePatterns": [
69
63
  "<rootDir>/tests/fixtures/"
70
64
  ],
71
- "reporters": [
72
- "default",
73
- "jest-junit"
74
- ],
75
65
  "testEnvironment": "node",
76
66
  "setupFilesAfterEnv": [
77
67
  "./test/jest.setup.js"
78
68
  ]
79
- }
80
- }
69
+ },
70
+ "prereleaseSha": "f2646ee441d27bb1ccdd7aadb018db619424f201"
71
+ }
@@ -41,20 +41,20 @@ function fingerprint (pemCert) {
41
41
  -newkey rsa:bits generate a new RSA key of 'bits' in size
42
42
  -keyout arg file to send the key to
43
43
  -out arg output file
44
- */
44
+ */
45
45
 
46
46
  /**
47
47
  * Generates a certificate and a private key pair
48
48
  * Similar to openssl req -x509 -sha256 -nodes -days 365 -subj "/C=US/" -newkey rsa:2048
49
49
  *
50
- * @param {string} commonName
50
+ * @param {string} commonName the common name of the cert
51
51
  * @param {number} days (integer)
52
52
  * @param {object} [attributes={}] optional certificate attributes
53
- * @param {string} [attributes.country]
54
- * @param {string} [attributes.state]
55
- * @param {string} [attributes.locality]
56
- * @param {string} [attributes.organization]
57
- * @param {string} [attributes.unit]
53
+ * @param {string} [attributes.country] the cert country
54
+ * @param {string} [attributes.state] the cert state
55
+ * @param {string} [attributes.locality] the cert locality
56
+ * @param {string} [attributes.organization] the cert organization
57
+ * @param {string} [attributes.unit] the cert unit (in the org)
58
58
  * @returns {{privateKey: string, cert: string}} key pair
59
59
  */
60
60
  function generate (commonName, days, /* istanbul ignore next */ attributes = {}) {
@@ -146,7 +146,7 @@ function generate (commonName, days, /* istanbul ignore next */ attributes = {})
146
146
  * Verifies a valid pem certificate and returns information about its validity
147
147
  * Throws if the input is not a valid pem certificate.
148
148
  *
149
- * @param {string|Buffer} pemCert
149
+ * @param {string|Buffer} pemCert the contents of the cert
150
150
  * @returns {{verified: boolean, validUntil: Date, validSince: Date}} key pair
151
151
  */
152
152
  function verify (pemCert) {
@@ -10,7 +10,7 @@ OF ANY KIND, either express or implied. See the License for the specific languag
10
10
  governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- const { Command } = require('@oclif/command')
13
+ const { Command } = require('@oclif/core')
14
14
  const fs = require('fs-extra')
15
15
  const debug = require('debug')('aio-cli-plugin-certificate:fingerprint')
16
16
 
@@ -18,7 +18,7 @@ const cert = require('../../certificate')
18
18
 
19
19
  class FingerprintCommand extends Command {
20
20
  async run () {
21
- const { args } = this.parse(FingerprintCommand)
21
+ const { args } = await this.parse(FingerprintCommand)
22
22
 
23
23
  if (!fs.existsSync(args.file)) {
24
24
  this.error('input file does not exist: ' + args.file)
@@ -10,7 +10,7 @@ OF ANY KIND, either express or implied. See the License for the specific languag
10
10
  governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- const { Command, flags } = require('@oclif/command')
13
+ const { Command, Flags } = require('@oclif/core')
14
14
  const fs = require('fs-extra')
15
15
  const debug = require('debug')('aio-cli-plugin-certificate:generate')
16
16
 
@@ -18,7 +18,7 @@ const cert = require('../../certificate')
18
18
 
19
19
  class GenerateCommand extends Command {
20
20
  async run () {
21
- const { flags } = this.parse(GenerateCommand)
21
+ const { flags } = await this.parse(GenerateCommand)
22
22
  if (fs.existsSync(flags.keyout)) {
23
23
  this.error('--keyout file exists: ' + flags.keyout)
24
24
  }
@@ -40,40 +40,40 @@ Generate a self-signed certificate to enable https:// on localhost or signing jw
40
40
  `
41
41
 
42
42
  GenerateCommand.flags = {
43
- keyout: flags.string({
43
+ keyout: Flags.string({
44
44
  description: 'file to send the key to',
45
45
  default: 'private.key'
46
46
  }),
47
- out: flags.string({
47
+ out: Flags.string({
48
48
  description: 'output file',
49
49
  default: 'certificate_pub.crt'
50
50
  }),
51
- name: flags.string({
51
+ name: Flags.string({
52
52
  char: 'n',
53
53
  description: 'Common Name: typically a host domain name, like www.mysite.com',
54
54
  default: 'selfsign.localhost'
55
55
  }),
56
- country: flags.string({
56
+ country: Flags.string({
57
57
  char: 'c',
58
58
  description: 'Country Name'
59
59
  }),
60
- state: flags.string({
60
+ state: Flags.string({
61
61
  char: 's',
62
62
  description: 'State or Province'
63
63
  }),
64
- locality: flags.string({
64
+ locality: Flags.string({
65
65
  char: 'l',
66
66
  description: 'Locality, or city name'
67
67
  }),
68
- organization: flags.string({
68
+ organization: Flags.string({
69
69
  char: 'o',
70
70
  description: 'Organization name'
71
71
  }),
72
- unit: flags.string({
72
+ unit: Flags.string({
73
73
  char: 'u',
74
74
  description: 'Organizational unit or department'
75
75
  }),
76
- days: flags.integer({
76
+ days: Flags.integer({
77
77
  description: 'Number of days the certificate should be valid for. (Max 365)',
78
78
  default: 365
79
79
  })
@@ -10,16 +10,15 @@ OF ANY KIND, either express or implied. See the License for the specific languag
10
10
  governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- const HHelp = require('@oclif/plugin-help').default
14
- const { Command } = require('@oclif/command')
13
+ const { Command, Help } = require('@oclif/core')
15
14
 
16
15
  class AIOCommand extends Command {
17
16
  async run () {
18
- const help = new HHelp(this.config)
19
- help.showHelp(['certificate:generate', '--help'])
17
+ const help = new Help(this.config)
18
+ return await help.showHelp(['certificate', '--help'])
20
19
  }
21
20
  }
22
21
 
23
- AIOCommand.description = 'Generate or verify a certificate for use with Adobe I/O'
22
+ AIOCommand.description = 'Generate, fingerprint, or verify a certificate for use with Adobe I/O'
24
23
 
25
24
  module.exports = AIOCommand
@@ -10,7 +10,7 @@ OF ANY KIND, either express or implied. See the License for the specific languag
10
10
  governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- const { Command, flags } = require('@oclif/command')
13
+ const { Command, Flags } = require('@oclif/core')
14
14
  const fs = require('fs-extra')
15
15
  const debug = require('debug')('aio-cli-plugin-certificate:verify')
16
16
 
@@ -18,7 +18,7 @@ const cert = require('../../certificate')
18
18
 
19
19
  class VerifyCommand extends Command {
20
20
  async run () {
21
- const { flags, args } = this.parse(VerifyCommand)
21
+ const { flags, args } = await this.parse(VerifyCommand)
22
22
 
23
23
  if (!fs.existsSync(args.file)) {
24
24
  this.error('input file does not exist: ' + args.file)
@@ -65,7 +65,7 @@ Verifies that the certificate is valid, and/or will not expire in [--days] days
65
65
  `
66
66
 
67
67
  VerifyCommand.flags = {
68
- days: flags.integer({
68
+ days: Flags.integer({
69
69
  description: '+- is certificate valid in --days'
70
70
  })
71
71
  }