Compare commits
67 Commits
Author | SHA1 | Date | |
---|---|---|---|
bf07bf27d4 | |||
5117d1e3c3 | |||
b8ecc0bca0 | |||
34299fa651 | |||
fd89e54295 | |||
7455891097 | |||
944fbc071b | |||
b6b06e6853 | |||
c4b72aebf8 | |||
b72f6dfac3 | |||
aa85d294c5 | |||
b03d8bfb65 | |||
4094834446 | |||
5c7bf24c56 | |||
738c249a3e | |||
b8656aa231 | |||
903b497525 | |||
2c9f19b2e5 | |||
1c63450213 | |||
1beceb21a8 | |||
ec40f43c9e | |||
a4d0654f28 | |||
3ca368755b | |||
86fedee9ed | |||
fc91384a76 | |||
2e8cfd00d2 | |||
6c67556756 | |||
8e892c14bc | |||
adcf49d729 | |||
22d79491ce | |||
1b23d1e435 | |||
1c2063ef82 | |||
d48a6c8315 | |||
1185480b91 | |||
afddfe5217 | |||
159ffe0728 | |||
3c3da30966 | |||
d4b249a59b | |||
|
06256f7a4d | ||
|
be6fc3adfd | ||
|
5ccf5b81e2 | ||
|
d06a2cee2f | ||
|
a7525184ef | ||
|
ae9865749a | ||
|
b2482b3cfd | ||
|
41988da3ed | ||
55d450be69 | |||
ae2ade8680 | |||
d7ec7e254e | |||
4bd7aee8ea | |||
bf711c2bb6 | |||
eb9e6679c4 | |||
96c801cdbd | |||
ee844fd348 | |||
d06c7059bb | |||
d36f2f0c33 | |||
4bcf925b28 | |||
484e75ac34 | |||
ad792f32dd | |||
05b7c7ab45 | |||
d94a097443 | |||
645e46dc01 | |||
5c87851ab8 | |||
0fd3bd262b | |||
732e35d295 | |||
e9135c42af | |||
a850243c59 |
7
.gitignore
vendored
7
.gitignore
vendored
@ -1,4 +1,9 @@
|
|||||||
node_modules
|
node_modules/
|
||||||
|
assets/
|
||||||
docs/
|
docs/
|
||||||
|
public/
|
||||||
|
pages/
|
||||||
coverage/
|
coverage/
|
||||||
.nogit/
|
.nogit/
|
||||||
|
dist/assets/
|
||||||
|
test/assets/
|
@ -5,6 +5,9 @@ stages:
|
|||||||
- test2
|
- test2
|
||||||
- release
|
- release
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- npmci prepare ssh
|
||||||
|
|
||||||
testLTS:
|
testLTS:
|
||||||
stage: test1
|
stage: test1
|
||||||
script:
|
script:
|
||||||
|
28
README.md
28
README.md
@ -1,6 +1,22 @@
|
|||||||
# Cert
|
# Cert
|
||||||
Easily obain SSL certificates from LetsEncrypt. Supports DNS-01 challenge. TypeScript ready.
|
Easily obain SSL certificates from LetsEncrypt. Supports DNS-01 challenge. TypeScript ready.
|
||||||
|
|
||||||
|
## Availabililty
|
||||||
|
[](https://www.npmjs.com/package/cert)
|
||||||
|
[](https://gitlab.com/pushrocks/cert)
|
||||||
|
[](https://github.com/pushrocks/cert)
|
||||||
|
[](https://pushrocks.gitlab.io/cert/)
|
||||||
|
|
||||||
|
## Status for master
|
||||||
|
[](https://gitlab.com/pushrocks/cert/commits/master)
|
||||||
|
[](https://gitlab.com/pushrocks/cert/commits/master)
|
||||||
|
[](https://david-dm.org/pushrocks/cert)
|
||||||
|
[](https://www.bithound.io/github/pushrocks/cert/master/dependencies/npm)
|
||||||
|
[](https://www.bithound.io/github/pushrocks/cert)
|
||||||
|
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
||||||
|
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
||||||
|
[](http://standardjs.com/)
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
@ -13,13 +29,17 @@ let myCert = new Cert({
|
|||||||
gitOriginRepo: "git@githhub.com/someuser/somereopo" // good for persistence in highly volatile environments like docker
|
gitOriginRepo: "git@githhub.com/someuser/somereopo" // good for persistence in highly volatile environments like docker
|
||||||
});
|
});
|
||||||
|
|
||||||
myCert.getDomainCert("example.com");
|
myCert.getDomainCert("example.com"); // returns promise
|
||||||
```
|
```
|
||||||
|
|
||||||
### sslDir
|
> **Note:** cert supports async parallel cert fetching.
|
||||||
|
However any subsequent calls will wait for the queue of the same dns zone to clear.
|
||||||
|
In other words: test1.domain1.tld and test2.domain2.tld will run in parallel, but test2.domain1.tld will wait for test1.domain1.tld !
|
||||||
|
|
||||||
|
## sslDir
|
||||||
to use the certificates it is important to understand what the structure of the ssl directory looks like.
|
to use the certificates it is important to understand what the structure of the ssl directory looks like.
|
||||||
|
|
||||||
### using a git origin repo.
|
## using a git origin repo.
|
||||||
Often times you want to keep track of certificates in order to keep them
|
Often times you want to keep track of certificates in order to keep them
|
||||||
even if the point of initial certificate request is gone. Imagine you have a dockerenvironement
|
even if the point of initial certificate request is gone. Imagine you have a dockerenvironement
|
||||||
and you keep starting new container versions for the same domain. YOu ideally want to use a proxy
|
and you keep starting new container versions for the same domain. YOu ideally want to use a proxy
|
||||||
@ -27,3 +47,5 @@ that handles SSL managemet for you. But even the proxy needs to be updated from
|
|||||||
|
|
||||||
So you need some kind of persistence between versions. This is why you can sync up all certificates to a git repo over ssh
|
So you need some kind of persistence between versions. This is why you can sync up all certificates to a git repo over ssh
|
||||||
Just make sure your id_rsa is in place for the node user and is allowed for the origin repo.
|
Just make sure your id_rsa is in place for the node user and is allowed for the origin repo.
|
||||||
|
|
||||||
|
[](https://push.rocks)
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
-----BEGIN RSA PRIVATE KEY-----
|
|
||||||
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
|
|
||||||
-----END RSA PRIVATE KEY-----
|
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"id": 2299055,
|
|
||||||
"key": {
|
|
||||||
"kty": "RSA",
|
|
||||||
"n": "0TfTunO8-B7kMI6lriNap3c-ACAk7qQXeRYXUbRoyZbU9hKI_BACk-4htPc-5pOICVT7gbaErhsOzIQRKrp1flC7JQSol1PNWe57cMD9IecdhtcxJq1HMFqyF5JQ9MZxSnyp03QdAUVVev23T7qA24Z0HK8jltt5K4TvAqid0M0nQ6sAM0LF7l6frQDckIoYcZ_3pxW5U7JewUBAyFSQpzKOSmf2GeyLZn0SZr0w82H5yO81NNx6FmR653zLXqj4CGjvC4uHvf-5lwSmnqlhCv2dlgtuLVm5j5YV8wmiWvElkrQrnCNaCEVYe1qhIHBASQtkmDGBztykIUatC4p7lVn0aUvUi9Qdzh_HcqbBuCBxZb57TWmWxiYXS9vTEM06fAYBlAuP-GN38v_IkJWRmJxDDTssfWCVVgotJQjQB2tzs301TG1RLu1moN-Qz27FaV-bGR8sV3l2eLY5K5Xp_QCt1j9Xm-4dDFfmS-eBf8l4XK7-Kx87UTLGDgQp-mMktmF0S9oYsZeHOwNsIhDlzz4QnTyEy-ihn26ctS67RcJmmyTPYEhBPh2Ajg7Hu8KsyKnJyzmcA8NeC9bEbeNdOwq6C8kMKiYks21oHkC2VeYkhTnRkan_RaG6L0xkHyiLwd-QbFDtE8vC763_V20y09syvj6nka2L3XpwT0nafJE",
|
|
||||||
"e": "AQAB"
|
|
||||||
},
|
|
||||||
"contact": [],
|
|
||||||
"agreement": "https://letsencrypt.org/documents/LE-SA-v1.0.1-July-27-2015.pdf",
|
|
||||||
"initialIp": "87.178.79.88",
|
|
||||||
"createdAt": "2016-06-22T11:05:47.509440404Z"
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE REQUEST-----
|
|
||||||
MIIEhjCCAm4CAQAwFzEVMBMGA1UEAwwMc3ViMi5ibGV1LmRlMIICIjANBgkqhkiG
|
|
||||||
9w0BAQEFAAOCAg8AMIICCgKCAgEAzNcXBGWjnR/m07vwYgjV5cm3foKZNM3MjYQP
|
|
||||||
0a7vmXN4Yd+1TrVyso18HNkjkia+pzYoTEuLYYZmqIXF/wKRc8E2joRYYr9m636d
|
|
||||||
8lbWjFZXC2GIOZfhgPghDWl8/okaExpqTcG7BRwffIbAqmgFIWSXMNlUbQuGCVPr
|
|
||||||
EkSMPODLuEukj14XpEIxiqMFQxTnXODKj/rJNZJDSJ1QHr5cCskgOO4NKmgmybyK
|
|
||||||
2K0CzNmaIjw4iTOSJL4vhmhKolFvsZoXpE41S1QZAc9dmafvs1yKYsKIjGfmDUlu
|
|
||||||
nOKL2o5eJuUaHiI54B7QRa1hBwaelXLUgiIRQpzv5m8/vpkMdq2jxeq68OlG8hyy
|
|
||||||
8Bm2+HkzgtHju8u+/nNKLEcF7fx4Irs6xKJdFJDwoVTckNOY10kGImVoy0HKo/8B
|
|
||||||
k34A/f16H7pS9hFDe5jUUiEIHY7ufoBZkOgEZn1WwdBw5Sb5gTJQq9qxfB9ai7+1
|
|
||||||
Th76dLq0okBoXR4d0ttn3oNyWEF2/nubd0lEw71PE4WJMXGYtpyV+hklipzHXS5w
|
|
||||||
dxQtkhZLgGr/RuIz/N4wiHsVZfxkIPzKfq4Nc9RoRllsSqG/7wl96gaLVwn/P9N6
|
|
||||||
GIXJ0TX+S0uuujBx/8KeZKnBNXN/FzTjBg4D9QQfKzL/50OqFkGvjax6EDACYh4/
|
|
||||||
WBybMocCAwEAAaAqMCgGCSqGSIb3DQEJDjEbMBkwFwYDVR0RBBAwDoIMc3ViMi5i
|
|
||||||
bGV1LmRlMA0GCSqGSIb3DQEBCwUAA4ICAQBWl8iKxLq+9YcL8q5adVUGQyLEJh5q
|
|
||||||
hTxNMQipIR3NzltQAjhp3QFLOMILWCb/4loOEC5CfeFjo6SqzkjnCSi4cljf3r5q
|
|
||||||
aYoJUujq62mrnm0L/kTSIWpo3jJXbSdnfZhVFDbTeykrB+SHwhRgRHTp2q7bsFRy
|
|
||||||
EovDb1m1pImwtULFNZ3xFaDCGRzs8tJTGlTD+dMxWeo47h2odnMYBH9eL1pPIVR9
|
|
||||||
ntFUwJ+XYgiMVvx2g6HrhhfLiOf3tp/HFuBtyWs+i7MONsLYoc/oKNvZyx7yL3/7
|
|
||||||
0w5daTAHdqrYUFXM/vKANqvmB3RKsOIJTtxAorEgVuo2ErtzCT8fPXYowpgT4wxi
|
|
||||||
aR1kQSJyn8kDkVkMz026BL12VpodDEJRSHb3wB0yg3Fkz1v4ECWA5C4c3Q/54avY
|
|
||||||
g+9ykjMZpSQWQs3XOYQ+YHxboUq8KY4El+M6FV/SGaED+wY7pxitXqP4AHaHMLxV
|
|
||||||
54VwUxYTFtQ/3m+QETdA6wXwmqd42of+CdQIipMHUea0aTS0k0ozGFMzmZJSlx1A
|
|
||||||
zJ0VTy2FqReucLe5nUFLO+8rdQI06aknfOdumuUL8guWLV9/bCDnIIxurkjGXs04
|
|
||||||
WiyUsQ9xA9tn51Gg8tRw8I0tBrXe4xCtrvHkV/Je/33NYqUVrAGXDILpG9WRlSPi
|
|
||||||
iy6iA5oEiT4CVg==
|
|
||||||
-----END CERTIFICATE REQUEST-----
|
|
@ -1,34 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIF/DCCBOSgAwIBAgISA7oA26pZemK7hGOH71u39RkMMA0GCSqGSIb3DQEBCwUA
|
|
||||||
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
|
|
||||||
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjA2MjIxMDA2MDBaFw0x
|
|
||||||
NjA5MjAxMDA2MDBaMBcxFTATBgNVBAMTDHN1YjIuYmxldS5kZTCCAiIwDQYJKoZI
|
|
||||||
hvcNAQEBBQADggIPADCCAgoCggIBAMzXFwRlo50f5tO78GII1eXJt36CmTTNzI2E
|
|
||||||
D9Gu75lzeGHftU61crKNfBzZI5Imvqc2KExLi2GGZqiFxf8CkXPBNo6EWGK/Zut+
|
|
||||||
nfJW1oxWVwthiDmX4YD4IQ1pfP6JGhMaak3BuwUcH3yGwKpoBSFklzDZVG0LhglT
|
|
||||||
6xJEjDzgy7hLpI9eF6RCMYqjBUMU51zgyo/6yTWSQ0idUB6+XArJIDjuDSpoJsm8
|
|
||||||
ititAszZmiI8OIkzkiS+L4ZoSqJRb7GaF6RONUtUGQHPXZmn77NcimLCiIxn5g1J
|
|
||||||
bpzii9qOXiblGh4iOeAe0EWtYQcGnpVy1IIiEUKc7+ZvP76ZDHato8XquvDpRvIc
|
|
||||||
svAZtvh5M4LR47vLvv5zSixHBe38eCK7OsSiXRSQ8KFU3JDTmNdJBiJlaMtByqP/
|
|
||||||
AZN+AP39eh+6UvYRQ3uY1FIhCB2O7n6AWZDoBGZ9VsHQcOUm+YEyUKvasXwfWou/
|
|
||||||
tU4e+nS6tKJAaF0eHdLbZ96DclhBdv57m3dJRMO9TxOFiTFxmLaclfoZJYqcx10u
|
|
||||||
cHcULZIWS4Bq/0biM/zeMIh7FWX8ZCD8yn6uDXPUaEZZbEqhv+8JfeoGi1cJ/z/T
|
|
||||||
ehiFydE1/ktLrrowcf/CnmSpwTVzfxc04wYOA/UEHysy/+dDqhZBr42sehAwAmIe
|
|
||||||
P1gcmzKHAgMBAAGjggINMIICCTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI
|
|
||||||
KwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPW5umA7
|
|
||||||
cYewAhF8NtPtXBzpxsYMMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyh
|
|
||||||
MHAGCCsGAQUFBwEBBGQwYjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgz
|
|
||||||
LmxldHNlbmNyeXB0Lm9yZy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14
|
|
||||||
My5sZXRzZW5jcnlwdC5vcmcvMBcGA1UdEQQQMA6CDHN1YjIuYmxldS5kZTCB/gYD
|
|
||||||
VR0gBIH2MIHzMAgGBmeBDAECATCB5gYLKwYBBAGC3xMBAQEwgdYwJgYIKwYBBQUH
|
|
||||||
AgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIGrBggrBgEFBQcCAjCBngyB
|
|
||||||
m1RoaXMgQ2VydGlmaWNhdGUgbWF5IG9ubHkgYmUgcmVsaWVkIHVwb24gYnkgUmVs
|
|
||||||
eWluZyBQYXJ0aWVzIGFuZCBvbmx5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgQ2Vy
|
|
||||||
dGlmaWNhdGUgUG9saWN5IGZvdW5kIGF0IGh0dHBzOi8vbGV0c2VuY3J5cHQub3Jn
|
|
||||||
L3JlcG9zaXRvcnkvMA0GCSqGSIb3DQEBCwUAA4IBAQBWqCXn4owhpx5uQqC0Cfu4
|
|
||||||
XsNzJGETrevfV51nMsw5YE3+dHW5B3Kx9Bea0gsc1eue7z0sPsIjGxJD1ZxIOJHj
|
|
||||||
b0I29ZxdCGUyG4mjYEQv/+l6iq8HSUYnhl1HTLOCV2zPrXd8YO8vmyqVNq04QgN/
|
|
||||||
SBedabrHK1nTf5Hi3vjIAx78/WgOYA6XayyX1Ef1wRtmSbNtsDP9EHh8zmMu67Yr
|
|
||||||
0D0OHCKMShVAkXtavi5ALAN28ZZTbhQ5iGlJZKP2o3Cp1tDc7491oqSQ0rATgSJi
|
|
||||||
vBRC8QGTE8igdo2oUT9Vo4orfWYw4U9/8kTQ3E1VOaMJNPa7esUUSuMrLFJ+xWeu
|
|
||||||
-----END CERTIFICATE-----
|
|
1
dist/assets/certs/sub2.bleu.de/cert.csr
vendored
1
dist/assets/certs/sub2.bleu.de/cert.csr
vendored
@ -1 +0,0 @@
|
|||||||
cert-1466593547.csr
|
|
1
dist/assets/certs/sub2.bleu.de/cert.pem
vendored
1
dist/assets/certs/sub2.bleu.de/cert.pem
vendored
@ -1 +0,0 @@
|
|||||||
cert-1466593547.pem
|
|
@ -1,27 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
|
|
||||||
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
|
|
||||||
DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
|
|
||||||
SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
|
|
||||||
GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
|
||||||
AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
|
|
||||||
q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
|
|
||||||
SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
|
|
||||||
Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
|
|
||||||
a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
|
|
||||||
/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
|
|
||||||
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
|
|
||||||
CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
|
|
||||||
bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
|
|
||||||
c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
|
|
||||||
VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
|
|
||||||
ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
|
|
||||||
MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
|
|
||||||
Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
|
|
||||||
AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
|
|
||||||
uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
|
|
||||||
wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
|
|
||||||
X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
|
|
||||||
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
|
|
||||||
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
|
|
||||||
-----END CERTIFICATE-----
|
|
1
dist/assets/certs/sub2.bleu.de/chain.pem
vendored
1
dist/assets/certs/sub2.bleu.de/chain.pem
vendored
@ -1 +0,0 @@
|
|||||||
chain-1466593547.pem
|
|
@ -1,61 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIF/DCCBOSgAwIBAgISA7oA26pZemK7hGOH71u39RkMMA0GCSqGSIb3DQEBCwUA
|
|
||||||
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
|
|
||||||
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjA2MjIxMDA2MDBaFw0x
|
|
||||||
NjA5MjAxMDA2MDBaMBcxFTATBgNVBAMTDHN1YjIuYmxldS5kZTCCAiIwDQYJKoZI
|
|
||||||
hvcNAQEBBQADggIPADCCAgoCggIBAMzXFwRlo50f5tO78GII1eXJt36CmTTNzI2E
|
|
||||||
D9Gu75lzeGHftU61crKNfBzZI5Imvqc2KExLi2GGZqiFxf8CkXPBNo6EWGK/Zut+
|
|
||||||
nfJW1oxWVwthiDmX4YD4IQ1pfP6JGhMaak3BuwUcH3yGwKpoBSFklzDZVG0LhglT
|
|
||||||
6xJEjDzgy7hLpI9eF6RCMYqjBUMU51zgyo/6yTWSQ0idUB6+XArJIDjuDSpoJsm8
|
|
||||||
ititAszZmiI8OIkzkiS+L4ZoSqJRb7GaF6RONUtUGQHPXZmn77NcimLCiIxn5g1J
|
|
||||||
bpzii9qOXiblGh4iOeAe0EWtYQcGnpVy1IIiEUKc7+ZvP76ZDHato8XquvDpRvIc
|
|
||||||
svAZtvh5M4LR47vLvv5zSixHBe38eCK7OsSiXRSQ8KFU3JDTmNdJBiJlaMtByqP/
|
|
||||||
AZN+AP39eh+6UvYRQ3uY1FIhCB2O7n6AWZDoBGZ9VsHQcOUm+YEyUKvasXwfWou/
|
|
||||||
tU4e+nS6tKJAaF0eHdLbZ96DclhBdv57m3dJRMO9TxOFiTFxmLaclfoZJYqcx10u
|
|
||||||
cHcULZIWS4Bq/0biM/zeMIh7FWX8ZCD8yn6uDXPUaEZZbEqhv+8JfeoGi1cJ/z/T
|
|
||||||
ehiFydE1/ktLrrowcf/CnmSpwTVzfxc04wYOA/UEHysy/+dDqhZBr42sehAwAmIe
|
|
||||||
P1gcmzKHAgMBAAGjggINMIICCTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI
|
|
||||||
KwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPW5umA7
|
|
||||||
cYewAhF8NtPtXBzpxsYMMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyh
|
|
||||||
MHAGCCsGAQUFBwEBBGQwYjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgz
|
|
||||||
LmxldHNlbmNyeXB0Lm9yZy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14
|
|
||||||
My5sZXRzZW5jcnlwdC5vcmcvMBcGA1UdEQQQMA6CDHN1YjIuYmxldS5kZTCB/gYD
|
|
||||||
VR0gBIH2MIHzMAgGBmeBDAECATCB5gYLKwYBBAGC3xMBAQEwgdYwJgYIKwYBBQUH
|
|
||||||
AgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIGrBggrBgEFBQcCAjCBngyB
|
|
||||||
m1RoaXMgQ2VydGlmaWNhdGUgbWF5IG9ubHkgYmUgcmVsaWVkIHVwb24gYnkgUmVs
|
|
||||||
eWluZyBQYXJ0aWVzIGFuZCBvbmx5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgQ2Vy
|
|
||||||
dGlmaWNhdGUgUG9saWN5IGZvdW5kIGF0IGh0dHBzOi8vbGV0c2VuY3J5cHQub3Jn
|
|
||||||
L3JlcG9zaXRvcnkvMA0GCSqGSIb3DQEBCwUAA4IBAQBWqCXn4owhpx5uQqC0Cfu4
|
|
||||||
XsNzJGETrevfV51nMsw5YE3+dHW5B3Kx9Bea0gsc1eue7z0sPsIjGxJD1ZxIOJHj
|
|
||||||
b0I29ZxdCGUyG4mjYEQv/+l6iq8HSUYnhl1HTLOCV2zPrXd8YO8vmyqVNq04QgN/
|
|
||||||
SBedabrHK1nTf5Hi3vjIAx78/WgOYA6XayyX1Ef1wRtmSbNtsDP9EHh8zmMu67Yr
|
|
||||||
0D0OHCKMShVAkXtavi5ALAN28ZZTbhQ5iGlJZKP2o3Cp1tDc7491oqSQ0rATgSJi
|
|
||||||
vBRC8QGTE8igdo2oUT9Vo4orfWYw4U9/8kTQ3E1VOaMJNPa7esUUSuMrLFJ+xWeu
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
|
|
||||||
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
|
|
||||||
DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
|
|
||||||
SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
|
|
||||||
GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
|
||||||
AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
|
|
||||||
q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
|
|
||||||
SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
|
|
||||||
Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
|
|
||||||
a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
|
|
||||||
/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
|
|
||||||
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
|
|
||||||
CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
|
|
||||||
bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
|
|
||||||
c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
|
|
||||||
VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
|
|
||||||
ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
|
|
||||||
MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
|
|
||||||
Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
|
|
||||||
AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
|
|
||||||
uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
|
|
||||||
wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
|
|
||||||
X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
|
|
||||||
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
|
|
||||||
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
|
|
||||||
-----END CERTIFICATE-----
|
|
1
dist/assets/certs/sub2.bleu.de/fullchain.pem
vendored
1
dist/assets/certs/sub2.bleu.de/fullchain.pem
vendored
@ -1 +0,0 @@
|
|||||||
fullchain-1466593547.pem
|
|
@ -1,51 +0,0 @@
|
|||||||
-----BEGIN RSA PRIVATE KEY-----
|
|
||||||
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
|
|
||||||
-----END RSA PRIVATE KEY-----
|
|
1
dist/assets/certs/sub2.bleu.de/privkey.pem
vendored
1
dist/assets/certs/sub2.bleu.de/privkey.pem
vendored
@ -1 +0,0 @@
|
|||||||
privkey-1466593547.pem
|
|
1
dist/assets/config.json
vendored
1
dist/assets/config.json
vendored
@ -1 +0,0 @@
|
|||||||
{"cfEmail":"sandbox@lossless.digital","cfKey":"5108a833dced8e8bd7186ae5833855b0dc138"}
|
|
1054
dist/assets/letsencrypt.sh
vendored
1054
dist/assets/letsencrypt.sh
vendored
File diff suppressed because it is too large
Load Diff
43
dist/cert.classes.cert.d.ts
vendored
Normal file
43
dist/cert.classes.cert.d.ts
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/// <reference types="q" />
|
||||||
|
import * as q from 'q';
|
||||||
|
import { Stringmap, Objectmap } from 'lik';
|
||||||
|
import { Certificate } from './cert.classes.certificate';
|
||||||
|
import { Letsencrypt, TLeEnv } from './cert.classes.letsencrypt';
|
||||||
|
export interface ICertConstructorOptions {
|
||||||
|
cfEmail: string;
|
||||||
|
cfKey: string;
|
||||||
|
sslDirPath?: string;
|
||||||
|
gitOriginRepo?: string;
|
||||||
|
leEnv?: TLeEnv;
|
||||||
|
}
|
||||||
|
export declare class Cert {
|
||||||
|
domainStringRequestMap: Stringmap;
|
||||||
|
certificateMap: Objectmap<Certificate>;
|
||||||
|
letsencrypt: Letsencrypt;
|
||||||
|
private _challengeHandler;
|
||||||
|
private _certRepo;
|
||||||
|
/**
|
||||||
|
* Constructor for Cert object
|
||||||
|
*/
|
||||||
|
constructor(optionsArg: ICertConstructorOptions);
|
||||||
|
/**
|
||||||
|
* setup the Cert instanceof
|
||||||
|
* @executes ASYNC
|
||||||
|
* @return Promise
|
||||||
|
*/
|
||||||
|
setup(): q.Promise<{}>;
|
||||||
|
/**
|
||||||
|
* adds a Certificate for a given domain
|
||||||
|
*/
|
||||||
|
addCertificate(domainNameArg: string, optionsArg?: {
|
||||||
|
force: boolean;
|
||||||
|
}): q.Promise<{}>;
|
||||||
|
/**
|
||||||
|
* cleans up old certificates
|
||||||
|
*/
|
||||||
|
cleanOldCertificates(): void;
|
||||||
|
/**
|
||||||
|
* executes the current batch of jobs
|
||||||
|
*/
|
||||||
|
deploy(): void;
|
||||||
|
}
|
75
dist/cert.classes.cert.js
vendored
Normal file
75
dist/cert.classes.cert.js
vendored
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
"use strict";
|
||||||
|
const q = require("q");
|
||||||
|
const lik_1 = require("lik");
|
||||||
|
// classes
|
||||||
|
const cert_classes_certificate_1 = require("./cert.classes.certificate");
|
||||||
|
const cert_classes_certrepo_1 = require("./cert.classes.certrepo");
|
||||||
|
const cert_classes_letsencrypt_1 = require("./cert.classes.letsencrypt");
|
||||||
|
const cert_classes_challengehandler_1 = require("./cert.classes.challengehandler");
|
||||||
|
class Cert {
|
||||||
|
/**
|
||||||
|
* Constructor for Cert object
|
||||||
|
*/
|
||||||
|
constructor(optionsArg) {
|
||||||
|
this.domainStringRequestMap = new lik_1.Stringmap();
|
||||||
|
this.certificateMap = new lik_1.Objectmap();
|
||||||
|
// set up challengehandler
|
||||||
|
this._challengeHandler = new cert_classes_challengehandler_1.ChallengeHandler({
|
||||||
|
cfEmail: optionsArg.cfEmail,
|
||||||
|
cfKey: optionsArg.cfKey
|
||||||
|
});
|
||||||
|
// setup Letsencrypt
|
||||||
|
this.letsencrypt = new cert_classes_letsencrypt_1.Letsencrypt({
|
||||||
|
leEnv: optionsArg.leEnv,
|
||||||
|
sslDir: optionsArg.sslDirPath,
|
||||||
|
challengeHandler: this._challengeHandler
|
||||||
|
});
|
||||||
|
this._certRepo = new cert_classes_certrepo_1.CertRepo({
|
||||||
|
sslDirPath: optionsArg.sslDirPath,
|
||||||
|
remoteGitUrl: optionsArg.gitOriginRepo,
|
||||||
|
certInstance: this
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* setup the Cert instanceof
|
||||||
|
* @executes ASYNC
|
||||||
|
* @return Promise
|
||||||
|
*/
|
||||||
|
setup() {
|
||||||
|
return this._certRepo.setup();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* adds a Certificate for a given domain
|
||||||
|
*/
|
||||||
|
addCertificate(domainNameArg, optionsArg = { force: false }) {
|
||||||
|
let done = q.defer();
|
||||||
|
let certificateForDomain = this.certificateMap.find((certificate) => {
|
||||||
|
return certificate.domainName === domainNameArg;
|
||||||
|
});
|
||||||
|
if (certificateForDomain instanceof cert_classes_certificate_1.Certificate) {
|
||||||
|
certificateForDomain.renew()
|
||||||
|
.then(done.resolve);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
certificateForDomain = new cert_classes_certificate_1.Certificate({
|
||||||
|
certInstance: this,
|
||||||
|
domainName: domainNameArg
|
||||||
|
});
|
||||||
|
certificateForDomain.renew()
|
||||||
|
.then(done.resolve);
|
||||||
|
}
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* cleans up old certificates
|
||||||
|
*/
|
||||||
|
cleanOldCertificates() {
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* executes the current batch of jobs
|
||||||
|
*/
|
||||||
|
deploy() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.Cert = Cert;
|
||||||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC5jbGFzc2VzLmNlcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jZXJ0LmNsYXNzZXMuY2VydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsdUJBQXNCO0FBQ3RCLDZCQUEwQztBQUsxQyxVQUFVO0FBQ1YseUVBQXdEO0FBQ3hELG1FQUFrRDtBQUNsRCx5RUFBZ0U7QUFDaEUsbUZBQWtFO0FBV2xFO0lBT0k7O09BRUc7SUFDSCxZQUFZLFVBQW1DO1FBVC9DLDJCQUFzQixHQUFHLElBQUksZUFBUyxFQUFFLENBQUE7UUFDeEMsbUJBQWMsR0FBRyxJQUFJLGVBQVMsRUFBZSxDQUFBO1FBVXpDLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxnREFBZ0IsQ0FBQztZQUMxQyxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87WUFDM0IsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1NBQzFCLENBQUMsQ0FBQTtRQUVGLG9CQUFvQjtRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksc0NBQVcsQ0FBQztZQUMvQixLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7WUFDdkIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxVQUFVO1lBQzdCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7U0FDM0MsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGdDQUFRLENBQUM7WUFDMUIsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVO1lBQ2pDLFlBQVksRUFBRSxVQUFVLENBQUMsYUFBYTtZQUN0QyxZQUFZLEVBQUUsSUFBSTtTQUNyQixDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUs7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsYUFBcUIsRUFBRSxhQUFpQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7UUFDbkYsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3BCLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXO1lBQzVELE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxLQUFLLGFBQWEsQ0FBQTtRQUNuRCxDQUFDLENBQUMsQ0FBQTtRQUNGLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixZQUFZLHNDQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzlDLG9CQUFvQixDQUFDLEtBQUssRUFBRTtpQkFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMzQixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixvQkFBb0IsR0FBRyxJQUFJLHNDQUFXLENBQUM7Z0JBQ25DLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsYUFBYTthQUM1QixDQUFDLENBQUE7WUFDRixvQkFBb0IsQ0FBQyxLQUFLLEVBQUU7aUJBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0IsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQjtJQUVwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO0lBRU4sQ0FBQztDQUNKO0FBNUVELG9CQTRFQyJ9
|
48
dist/cert.classes.certificate.d.ts
vendored
Normal file
48
dist/cert.classes.certificate.d.ts
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/// <reference types="q" />
|
||||||
|
import * as q from 'q';
|
||||||
|
import * as plugins from './cert.plugins';
|
||||||
|
import { Cert } from './cert.classes.cert';
|
||||||
|
export interface ICertificateFsConfig {
|
||||||
|
domainName: string;
|
||||||
|
creationTime: number;
|
||||||
|
expiryTime: number;
|
||||||
|
}
|
||||||
|
export interface ICertificateConstructorOptions {
|
||||||
|
domainName: string;
|
||||||
|
certInstance: Cert;
|
||||||
|
}
|
||||||
|
export declare type TCertificateStatus = 'unregistered' | 'valid' | 'expiring' | 'expired';
|
||||||
|
export declare class Certificate {
|
||||||
|
domainName: string;
|
||||||
|
certInstance: Cert;
|
||||||
|
domainData: plugins.smartstring.Domain;
|
||||||
|
creationDate: Date;
|
||||||
|
expiryDate: Date;
|
||||||
|
publicKey: string;
|
||||||
|
privKey: string;
|
||||||
|
/**
|
||||||
|
* run when creating a new instance of Certificate
|
||||||
|
*/
|
||||||
|
constructor(optionsArg: ICertificateConstructorOptions);
|
||||||
|
/**
|
||||||
|
* the status of the Certificate
|
||||||
|
*/
|
||||||
|
readonly status: TCertificateStatus;
|
||||||
|
readonly sameZoneRequesting: boolean;
|
||||||
|
/**
|
||||||
|
* schedule a retry of certificate request
|
||||||
|
*/
|
||||||
|
scheduleRetry(): q.Promise<{}>;
|
||||||
|
/**
|
||||||
|
* renew certificate if needed
|
||||||
|
*/
|
||||||
|
renew(force?: boolean): q.Promise<{}>;
|
||||||
|
/**
|
||||||
|
* syncFs syncs the certificate with disk
|
||||||
|
*/
|
||||||
|
syncFs(): void;
|
||||||
|
/**
|
||||||
|
* deletes the certificate
|
||||||
|
*/
|
||||||
|
delete(): void;
|
||||||
|
}
|
103
dist/cert.classes.certificate.js
vendored
Normal file
103
dist/cert.classes.certificate.js
vendored
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
"use strict";
|
||||||
|
const q = require("q");
|
||||||
|
const plugins = require("./cert.plugins");
|
||||||
|
class Certificate {
|
||||||
|
/**
|
||||||
|
* run when creating a new instance of Certificate
|
||||||
|
*/
|
||||||
|
constructor(optionsArg) {
|
||||||
|
this.creationDate = null;
|
||||||
|
this.expiryDate = null;
|
||||||
|
this.publicKey = null;
|
||||||
|
this.privKey = null;
|
||||||
|
this.domainName = optionsArg.domainName;
|
||||||
|
this.domainData = new plugins.smartstring.Domain(this.domainName);
|
||||||
|
this.certInstance = optionsArg.certInstance;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* the status of the Certificate
|
||||||
|
*/
|
||||||
|
get status() {
|
||||||
|
let validTimeRemaining = 0;
|
||||||
|
if (this.creationDate !== null && this.expiryDate !== null) {
|
||||||
|
validTimeRemaining = this.expiryDate.getTime() - Date.now();
|
||||||
|
}
|
||||||
|
let MonthMilliseconds = 2629746000;
|
||||||
|
if (this.publicKey === null || this.privKey === null) {
|
||||||
|
return 'unregistered';
|
||||||
|
}
|
||||||
|
else if (validTimeRemaining >= MonthMilliseconds) {
|
||||||
|
return 'valid';
|
||||||
|
}
|
||||||
|
else if (validTimeRemaining < MonthMilliseconds && validTimeRemaining >= 0) {
|
||||||
|
return 'expiring';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 'expired';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
get sameZoneRequesting() {
|
||||||
|
return this.certInstance.domainStringRequestMap.checkMinimatch('*' + this.domainData.zoneName);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* schedule a retry of certificate request
|
||||||
|
*/
|
||||||
|
scheduleRetry() {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
setTimeout(() => {
|
||||||
|
this.renew()
|
||||||
|
.then(done.resolve);
|
||||||
|
}, 60000);
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* renew certificate if needed
|
||||||
|
*/
|
||||||
|
renew(force = false) {
|
||||||
|
let done = q.defer();
|
||||||
|
if (this.status === 'valid') {
|
||||||
|
plugins.beautylog.log('Certificate still valid for more than 1 month, so it is not renewed now');
|
||||||
|
done.resolve();
|
||||||
|
}
|
||||||
|
else if (this.status === 'expiring' || this.status === 'expired' || this.status === 'unregistered') {
|
||||||
|
plugins.beautylog.info('Certificate not valid currently, going to renew now!');
|
||||||
|
if (this.sameZoneRequesting) {
|
||||||
|
this.certInstance.domainStringRequestMap.registerUntilTrue(() => {
|
||||||
|
return !this.sameZoneRequesting;
|
||||||
|
}, () => {
|
||||||
|
this.renew().then(done.resolve);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.certInstance.letsencrypt.registerDomain(this.domainName)
|
||||||
|
.then(() => {
|
||||||
|
return this.syncFs();
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
done.resolve();
|
||||||
|
}).catch((err) => { console.log(err); });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw Error(`weird status for certificate with domain name ${this.domainName}`);
|
||||||
|
}
|
||||||
|
done.resolve();
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* syncFs syncs the certificate with disk
|
||||||
|
*/
|
||||||
|
syncFs() {
|
||||||
|
let configJsonMemory = {
|
||||||
|
domainName: this.domainName,
|
||||||
|
creationTime: this.creationDate.getTime(),
|
||||||
|
expiryTime: this.expiryDate.getTime()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* deletes the certificate
|
||||||
|
*/
|
||||||
|
delete() { }
|
||||||
|
}
|
||||||
|
exports.Certificate = Certificate;
|
||||||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC5jbGFzc2VzLmNlcnRpZmljYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2VydC5jbGFzc2VzLmNlcnRpZmljYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1QkFBc0I7QUFFdEIsMENBQXlDO0FBcUJ6QztJQVNJOztPQUVHO0lBQ0gsWUFBWSxVQUEwQztRQVJ0RCxpQkFBWSxHQUFTLElBQUksQ0FBQTtRQUN6QixlQUFVLEdBQVMsSUFBSSxDQUFBO1FBQ3ZCLGNBQVMsR0FBVyxJQUFJLENBQUE7UUFDeEIsWUFBTyxHQUFXLElBQUksQ0FBQTtRQU1sQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUE7UUFDdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNqRSxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUE7SUFDL0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxNQUFNO1FBQ04sSUFBSSxrQkFBa0IsR0FBVyxDQUFDLENBQUE7UUFDbEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3hELGtCQUFrQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ2hFLENBQUM7UUFDRCxJQUFJLGlCQUFpQixHQUFHLFVBQVUsQ0FBQTtRQUNsQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLGNBQWMsQ0FBQTtRQUN6QixDQUFDO1FBQUMsSUFBSSxD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
|
31
dist/cert.classes.certrepo.d.ts
vendored
Normal file
31
dist/cert.classes.certrepo.d.ts
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/// <reference types="q" />
|
||||||
|
import * as q from 'q';
|
||||||
|
import { Cert } from './cert.classes.cert';
|
||||||
|
export interface ICertRepoConstructorOptions {
|
||||||
|
sslDirPath: string;
|
||||||
|
remoteGitUrl: string;
|
||||||
|
certInstance: Cert;
|
||||||
|
}
|
||||||
|
export declare class CertRepo {
|
||||||
|
private _sslDirPath;
|
||||||
|
private _remoteGitUrl;
|
||||||
|
private gitRepo;
|
||||||
|
private _certInstance;
|
||||||
|
constructor(optionsArg: ICertRepoConstructorOptions);
|
||||||
|
/**
|
||||||
|
* setup the Cert instance
|
||||||
|
*/
|
||||||
|
setup(): q.Promise<{}>;
|
||||||
|
/**
|
||||||
|
* syncs an objectmap of Certificates with repo
|
||||||
|
*/
|
||||||
|
syncFs(): q.Promise<{}>;
|
||||||
|
/**
|
||||||
|
* Pulls already requested certificates from git origin
|
||||||
|
*/
|
||||||
|
sslGitOriginPull: () => void;
|
||||||
|
/**
|
||||||
|
* Pushes all new requested certificates to git origin
|
||||||
|
*/
|
||||||
|
sslGitOriginAddCommitPush: () => void;
|
||||||
|
}
|
59
dist/cert.classes.certrepo.js
vendored
Normal file
59
dist/cert.classes.certrepo.js
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
"use strict";
|
||||||
|
const q = require("q");
|
||||||
|
const plugins = require("./cert.plugins");
|
||||||
|
const paths = require("./cert.paths");
|
||||||
|
class CertRepo {
|
||||||
|
constructor(optionsArg) {
|
||||||
|
/**
|
||||||
|
* Pulls already requested certificates from git origin
|
||||||
|
*/
|
||||||
|
this.sslGitOriginPull = () => {
|
||||||
|
if (this.gitRepo) {
|
||||||
|
this.gitRepo.pull('origin', 'master');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* Pushes all new requested certificates to git origin
|
||||||
|
*/
|
||||||
|
this.sslGitOriginAddCommitPush = () => {
|
||||||
|
if (this._remoteGitUrl) {
|
||||||
|
this.gitRepo.addAll();
|
||||||
|
this.gitRepo.commit('added new SSL certificates and deleted obsolete ones.');
|
||||||
|
this.gitRepo.push('origin', 'master');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this._sslDirPath = optionsArg.sslDirPath;
|
||||||
|
this._remoteGitUrl = optionsArg.remoteGitUrl;
|
||||||
|
this._certInstance = optionsArg.certInstance;
|
||||||
|
// setup sslDir
|
||||||
|
if (!this._sslDirPath) {
|
||||||
|
this._sslDirPath = paths.defaultSslDir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* setup the Cert instance
|
||||||
|
*/
|
||||||
|
setup() {
|
||||||
|
// setup Git
|
||||||
|
let done = q.defer();
|
||||||
|
if (this._remoteGitUrl) {
|
||||||
|
plugins.smartfile.fs.ensureEmptyDirSync(paths.defaultSslDir);
|
||||||
|
plugins.smartgit.createRepoFromClone(this._remoteGitUrl, paths.defaultSslDir)
|
||||||
|
.then(gitRepoArg => {
|
||||||
|
this.gitRepo = gitRepoArg;
|
||||||
|
done.resolve();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* syncs an objectmap of Certificates with repo
|
||||||
|
*/
|
||||||
|
syncFs() {
|
||||||
|
let done = q.defer();
|
||||||
|
done.resolve();
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.CertRepo = CertRepo;
|
||||||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC5jbGFzc2VzLmNlcnRyZXBvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2VydC5jbGFzc2VzLmNlcnRyZXBvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1QkFBc0I7QUFHdEIsMENBQXlDO0FBQ3pDLHNDQUFxQztBQVdyQztJQUtJLFlBQVksVUFBdUM7UUFxQ25EOztXQUVHO1FBQ0gscUJBQWdCLEdBQUc7WUFDZixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFDekMsQ0FBQztRQUNMLENBQUMsQ0FBQTtRQUVEOztXQUVHO1FBQ0gsOEJBQXlCLEdBQUc7WUFDeEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUE7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHVEQUF1RCxDQUFDLENBQUE7Z0JBQzVFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUN6QyxDQUFDO1FBQ0wsQ0FBQyxDQUFBO1FBdERHLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQTtRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUE7UUFDNUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFBO1FBRTVDLGVBQWU7UUFDZixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQTtRQUMxQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSztRQUNELFlBQVk7UUFDWixJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDcEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQzVELE9BQU8sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDO2lCQUN4RSxJQUFJLENBQUMsVUFBVTtnQkFDWixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQTtnQkFDekIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ2xCLENBQUMsQ0FBQyxDQUFBO1FBQ1YsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDRixJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztDQXFCSjtBQTdERCw0QkE2REMifQ==
|
20
dist/cert.classes.challengehandler.d.ts
vendored
Normal file
20
dist/cert.classes.challengehandler.d.ts
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/// <reference types="q" />
|
||||||
|
export interface IChallengehandlerConstructorOptions {
|
||||||
|
cfEmail: string;
|
||||||
|
cfKey: string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* class ChallengeHandler handles challenges
|
||||||
|
*/
|
||||||
|
export declare class ChallengeHandler {
|
||||||
|
private _cfInstance;
|
||||||
|
constructor(optionsArg: IChallengehandlerConstructorOptions);
|
||||||
|
/**
|
||||||
|
* set a challenge
|
||||||
|
*/
|
||||||
|
setChallenge(domainNameArg: string, challengeArg: string): Q.Promise<{}>;
|
||||||
|
/**
|
||||||
|
* cleans a challenge
|
||||||
|
*/
|
||||||
|
cleanChallenge(domainNameArg: any): Q.Promise<{}>;
|
||||||
|
}
|
75
dist/cert.classes.challengehandler.js
vendored
Normal file
75
dist/cert.classes.challengehandler.js
vendored
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
"use strict";
|
||||||
|
const plugins = require("./cert.plugins");
|
||||||
|
/**
|
||||||
|
* class ChallengeHandler handles challenges
|
||||||
|
*/
|
||||||
|
class ChallengeHandler {
|
||||||
|
constructor(optionsArg) {
|
||||||
|
this._cfInstance = new plugins.cflare.CflareAccount();
|
||||||
|
this._cfInstance.auth({
|
||||||
|
email: optionsArg.cfEmail,
|
||||||
|
key: optionsArg.cfKey
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* set a challenge
|
||||||
|
*/
|
||||||
|
setChallenge(domainNameArg, challengeArg) {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
plugins.beautylog.log('setting challenge for ' + domainNameArg);
|
||||||
|
this._cfInstance.createRecord(prefixName(domainNameArg), 'TXT', challengeArg).then(() => {
|
||||||
|
plugins.beautylog.ok('Challenge has been set!');
|
||||||
|
plugins.beautylog.info('We need to cool down to let DNS propagate to edge locations!');
|
||||||
|
cooldown().then(() => {
|
||||||
|
done.resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* cleans a challenge
|
||||||
|
*/
|
||||||
|
cleanChallenge(domainNameArg) {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
plugins.beautylog.log('cleaning challenge for ' + domainNameArg);
|
||||||
|
this._cfInstance.removeRecord(prefixName(domainNameArg), 'TXT');
|
||||||
|
cooldown().then(() => {
|
||||||
|
done.resolve();
|
||||||
|
});
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.ChallengeHandler = ChallengeHandler;
|
||||||
|
/**
|
||||||
|
* cooldown timer for letting DNS settle before answering the challengerequest
|
||||||
|
*/
|
||||||
|
let cooldown = () => {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
let cooldowntime = 60000;
|
||||||
|
let passedTime = 0;
|
||||||
|
plugins.beautylog.log('Cooling down! ' + (cooldowntime / 1000).toString() + ' seconds left');
|
||||||
|
let coolDownCounter = () => {
|
||||||
|
setTimeout(() => {
|
||||||
|
if (cooldowntime <= passedTime) {
|
||||||
|
plugins.beautylog.ok('Cooled down!');
|
||||||
|
done.resolve();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
passedTime = passedTime + 5000;
|
||||||
|
plugins.beautylog.log('Cooling down! '
|
||||||
|
+ ((cooldowntime - passedTime) / 1000).toString()
|
||||||
|
+ ' seconds left');
|
||||||
|
coolDownCounter();
|
||||||
|
}
|
||||||
|
}, 5000);
|
||||||
|
};
|
||||||
|
coolDownCounter();
|
||||||
|
return done.promise;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* prefix a domain name to make sure it complies with letsencrypt
|
||||||
|
*/
|
||||||
|
let prefixName = (domainNameArg) => {
|
||||||
|
return '_acme-challenge.' + domainNameArg;
|
||||||
|
};
|
||||||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC5jbGFzc2VzLmNoYWxsZW5nZWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jZXJ0LmNsYXNzZXMuY2hhbGxlbmdlaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMENBQXlDO0FBUXpDOztHQUVHO0FBQ0g7SUFFSSxZQUFZLFVBQStDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3JELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ2xCLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTztZQUN6QixHQUFHLEVBQUUsVUFBVSxDQUFDLEtBQUs7U0FDeEIsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLGFBQXFCLEVBQUUsWUFBb0I7UUFDcEQsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUM1QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsR0FBRyxhQUFhLENBQUMsQ0FBQTtRQUMvRCxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMvRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO1lBQy9DLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUE7WUFDdEYsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDO2dCQUNaLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUNsQixDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLGFBQWE7UUFDeEIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUM1QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsR0FBRyxhQUFhLENBQUMsQ0FBQTtRQUNoRSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDL0QsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ1osSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ2xCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztDQUNKO0FBdENELDRDQXNDQztBQUVEOztHQUVHO0FBQ0gsSUFBSSxRQUFRLEdBQUc7SUFDWCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzVCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQTtJQUN4QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUE7SUFDbEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUE7SUFDNUYsSUFBSSxlQUFlLEdBQUc7UUFDbEIsVUFBVSxDQUFDO1lBQ1AsRUFBRSxDQUFDLENBQUMsWUFBWSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUNwQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7WUFDbEIsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNKLFVBQVUsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFBO2dCQUM5QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0I7c0JBQ2hDLENBQUMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO3NCQUMvQyxlQUFlLENBQ3BCLENBQUE7Z0JBQ0QsZUFBZSxFQUFFLENBQUE7WUFDckIsQ0FBQztRQUNMLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNaLENBQUMsQ0FBQTtJQUNELGVBQWUsRUFBRSxDQUFBO0lBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3ZCLENBQUMsQ0FBQTtBQUVEOztHQUVHO0FBQ0gsSUFBSSxVQUFVLEdBQUcsQ0FBQyxhQUFxQjtJQUNuQyxNQUFNLENBQUMsa0JBQWtCLEdBQUcsYUFBYSxDQUFBO0FBQzdDLENBQUMsQ0FBQSJ9
|
26
dist/cert.classes.letsencrypt.d.ts
vendored
Normal file
26
dist/cert.classes.letsencrypt.d.ts
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/// <reference types="q" />
|
||||||
|
import * as q from 'q';
|
||||||
|
import { ChallengeHandler } from './cert.classes.challengehandler';
|
||||||
|
export declare type TLeEnv = 'production' | 'staging';
|
||||||
|
export interface ILetsencryptConstructorOptions {
|
||||||
|
leEnv: TLeEnv;
|
||||||
|
challengeHandler: ChallengeHandler;
|
||||||
|
sslDir: string;
|
||||||
|
}
|
||||||
|
export declare class Letsencrypt {
|
||||||
|
leEnv: TLeEnv;
|
||||||
|
challengeHandler: ChallengeHandler;
|
||||||
|
sslDir: string;
|
||||||
|
private _leInstance;
|
||||||
|
private _leServerUrl;
|
||||||
|
constructor(optionsArg: ILetsencryptConstructorOptions);
|
||||||
|
/**
|
||||||
|
* register a domain
|
||||||
|
*/
|
||||||
|
registerDomain(domainNameArg: string): q.Promise<{}>;
|
||||||
|
private _leCopyToDestination(domainNameArg);
|
||||||
|
/**
|
||||||
|
* translates to the format expected by letsencrypt node implementation
|
||||||
|
*/
|
||||||
|
private _leChallengeHandler();
|
||||||
|
}
|
136
dist/cert.classes.letsencrypt.js
vendored
Normal file
136
dist/cert.classes.letsencrypt.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/cert.hook.d.ts
vendored
1
dist/cert.hook.d.ts
vendored
@ -1 +0,0 @@
|
|||||||
import "typings-global";
|
|
51
dist/cert.hook.js
vendored
51
dist/cert.hook.js
vendored
@ -1,51 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
"use strict";
|
|
||||||
require("typings-global");
|
|
||||||
var plugins = require("./cert.plugins");
|
|
||||||
var paths = require("./cert.paths");
|
|
||||||
var smartcli = new plugins.smartcli.Smartcli();
|
|
||||||
var config = plugins.smartfile.local.toObjectSync(paths.config);
|
|
||||||
var cflare = new plugins.cflare.CflareAccount();
|
|
||||||
cflare.auth({
|
|
||||||
email: config.cfEmail,
|
|
||||||
key: config.cfKey
|
|
||||||
});
|
|
||||||
var setChallenge = function (domainNameArg, challengeArg) {
|
|
||||||
var done = plugins.q.defer();
|
|
||||||
cflare.createRecord(prefixName(domainNameArg), "TXT", challengeArg).then(function () {
|
|
||||||
cooldown().then(function () {
|
|
||||||
done.resolve();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
var cleanChallenge = function (domainNameArg) {
|
|
||||||
var done = plugins.q.defer();
|
|
||||||
cflare.removeRecord(prefixName(domainNameArg), "TXT");
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
var cooldown = function () {
|
|
||||||
var done = plugins.q.defer();
|
|
||||||
console.log("Cooling down!");
|
|
||||||
setTimeout(function () {
|
|
||||||
done.resolve();
|
|
||||||
}, 20000);
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
var prefixName = function (domainNameArg) {
|
|
||||||
return "_acme-challenge." + domainNameArg;
|
|
||||||
};
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: "deploy_challenge"
|
|
||||||
}).then(function (argv) {
|
|
||||||
console.log(argv);
|
|
||||||
setChallenge(argv._[1], argv._[3]);
|
|
||||||
});
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: "clean_challenge"
|
|
||||||
}).then(function (argv) {
|
|
||||||
cleanChallenge(argv._[1]);
|
|
||||||
});
|
|
||||||
smartcli.startParse();
|
|
||||||
|
|
||||||
//# sourceMappingURL=data:application/json;charset=utf8;base64,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cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuLy8gdGhlIHNoZWJhbmcgbGluZSBhYm92ZSBtYWtlcyBzdXJlIHRoaXMgc2NyaXB0IHdpbGwgZ2V0IGludGVycHJldGVkIGJ5IG5vZGVcblxuaW1wb3J0IFwidHlwaW5ncy1nbG9iYWxcIjtcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vY2VydC5wbHVnaW5zXCI7XG5pbXBvcnQgKiBhcyBwYXRocyBmcm9tIFwiLi9jZXJ0LnBhdGhzXCI7XG5cbmxldCBzbWFydGNsaSA9IG5ldyBwbHVnaW5zLnNtYXJ0Y2xpLlNtYXJ0Y2xpKCk7XG5cbmxldCBjb25maWcgPSBwbHVnaW5zLnNtYXJ0ZmlsZS5sb2NhbC50b09iamVjdFN5bmMocGF0aHMuY29uZmlnKTtcbmxldCBjZmxhcmUgPSBuZXcgcGx1Z2lucy5jZmxhcmUuQ2ZsYXJlQWNjb3VudCgpO1xuY2ZsYXJlLmF1dGgoe1xuICAgIGVtYWlsOiBjb25maWcuY2ZFbWFpbCxcbiAgICBrZXk6IGNvbmZpZy5jZktleVxufSk7XG5cbmxldCBzZXRDaGFsbGVuZ2UgPSAoZG9tYWluTmFtZUFyZzogc3RyaW5nLCBjaGFsbGVuZ2VBcmc6IHN0cmluZykgPT4ge1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgY2ZsYXJlLmNyZWF0ZVJlY29yZChwcmVmaXhOYW1lKGRvbWFpbk5hbWVBcmcpLCBcIlRYVFwiLCBjaGFsbGVuZ2VBcmcpLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb29sZG93bigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59XG5cbmxldCBjbGVhbkNoYWxsZW5nZSA9IChkb21haW5OYW1lQXJnKSA9PiB7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBjZmxhcmUucmVtb3ZlUmVjb3JkKHByZWZpeE5hbWUoZG9tYWluTmFtZUFyZyksIFwiVFhUXCIpO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59XG5cbmxldCBjb29sZG93biA9ICgpID0+IHtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIGNvbnNvbGUubG9nKFwiQ29vbGluZyBkb3duIVwiKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgfSwgMjAwMDApXG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn1cblxubGV0IHByZWZpeE5hbWUgPSAoZG9tYWluTmFtZUFyZzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gXCJfYWNtZS1jaGFsbGVuZ2UuXCIgKyBkb21haW5OYW1lQXJnO1xufVxuXG5zbWFydGNsaS5hZGRDb21tYW5kKHtcbiAgICBjb21tYW5kTmFtZTogXCJkZXBsb3lfY2hhbGxlbmdlXCJcbn0pLnRoZW4oKGFyZ3YpID0+IHtcbiAgICBjb25zb2xlLmxvZyhhcmd2KVxuICAgIHNldENoYWxsZW5nZShhcmd2Ll9bMV0sIGFyZ3YuX1szXSk7XG59KTtcblxuc21hcnRjbGkuYWRkQ29tbWFuZCh7XG4gICAgY29tbWFuZE5hbWU6IFwiY2xlYW5fY2hhbGxlbmdlXCJcbn0pLnRoZW4oKGFyZ3YpID0+IHtcbiAgICBjbGVhbkNoYWxsZW5nZShhcmd2Ll9bMV0pO1xufSk7XG5cbnNtYXJ0Y2xpLnN0YXJ0UGFyc2UoKTtcbiJdfQ==
|
|
9
dist/cert.paths.d.ts
vendored
9
dist/cert.paths.d.ts
vendored
@ -1,5 +1,4 @@
|
|||||||
import "typings-global";
|
export declare let projectDir: string;
|
||||||
export declare let certHook: string;
|
export declare let assetDir: string;
|
||||||
export declare let config: string;
|
export declare let defaultSslDir: string;
|
||||||
export declare let letsencryptSh: string;
|
export declare let leConfigDir: string;
|
||||||
export declare let sslDir: string;
|
|
||||||
|
17
dist/cert.paths.js
vendored
17
dist/cert.paths.js
vendored
@ -1,9 +1,10 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
require("typings-global");
|
const plugins = require("./cert.plugins");
|
||||||
var plugins = require("./cert.plugins");
|
// dirs
|
||||||
exports.certHook = plugins.path.join(__dirname, "cert.hook.js");
|
exports.projectDir = plugins.path.join(__dirname, '../');
|
||||||
exports.config = plugins.path.join(__dirname, "assets/config.json");
|
exports.assetDir = plugins.path.join(exports.projectDir, 'assets');
|
||||||
exports.letsencryptSh = plugins.path.join(__dirname, "assets/letsencrypt.sh");
|
exports.defaultSslDir = plugins.path.join(exports.assetDir, 'defaultSslDir');
|
||||||
exports.sslDir = plugins.path.join(__dirname, "/assets/certs");
|
exports.leConfigDir = plugins.path.join(exports.assetDir, 'letsencrypt');
|
||||||
|
plugins.smartfile.fs.ensureDirSync(exports.leConfigDir);
|
||||||
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNlcnQucGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sZ0JBQWdCLENBQUMsQ0FBQTtBQUN4QixJQUFZLE9BQU8sV0FBTSxnQkFBZ0IsQ0FBQyxDQUFBO0FBRS9CLGdCQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZELGNBQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUMzRCxxQkFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3JFLGNBQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsZUFBZSxDQUFDLENBQUMiLCJmaWxlIjoiY2VydC5wYXRocy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCI7XG5pbXBvcnQgKiBhcyBwbHVnaW5zIGZyb20gXCIuL2NlcnQucGx1Z2luc1wiO1xuXG5leHBvcnQgbGV0IGNlcnRIb29rID0gcGx1Z2lucy5wYXRoLmpvaW4oX19kaXJuYW1lLFwiY2VydC5ob29rLmpzXCIpO1xuZXhwb3J0IGxldCBjb25maWcgPSBwbHVnaW5zLnBhdGguam9pbihfX2Rpcm5hbWUsXCJhc3NldHMvY29uZmlnLmpzb25cIik7XG5leHBvcnQgbGV0IGxldHNlbmNyeXB0U2ggPSBwbHVnaW5zLnBhdGguam9pbihfX2Rpcm5hbWUsXCJhc3NldHMvbGV0c2VuY3J5cHQuc2hcIik7XG5leHBvcnQgbGV0IHNzbERpciA9IHBsdWdpbnMucGF0aC5qb2luKF9fZGlybmFtZSxcIi9hc3NldHMvY2VydHNcIik7Il19
|
plugins.smartfile.fs.ensureDirSync(exports.defaultSslDir);
|
||||||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC5wYXRocy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NlcnQucGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBDQUF5QztBQUV6QyxPQUFPO0FBQ0ksUUFBQSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLEtBQUssQ0FBQyxDQUFBO0FBQy9DLFFBQUEsUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFVLEVBQUMsUUFBUSxDQUFDLENBQUE7QUFDakQsUUFBQSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQVEsRUFBQyxlQUFlLENBQUMsQ0FBQTtBQUMzRCxRQUFBLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBUSxFQUFDLGFBQWEsQ0FBQyxDQUFBO0FBQ2xFLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxtQkFBVyxDQUFDLENBQUE7QUFDL0MsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLHFCQUFhLENBQUMsQ0FBQSJ9
|
23
dist/cert.plugins.d.ts
vendored
23
dist/cert.plugins.d.ts
vendored
@ -1,10 +1,13 @@
|
|||||||
import "typings-global";
|
import 'typings-global';
|
||||||
export import beautylog = require("beautylog");
|
import * as beautylog from 'beautylog';
|
||||||
export import cflare = require("cflare");
|
import * as cflare from 'cflare';
|
||||||
export declare let fs: any;
|
declare let fs: any;
|
||||||
export import path = require("path");
|
import * as lik from 'lik';
|
||||||
export declare let q: any;
|
import * as path from 'path';
|
||||||
export declare let shelljs: any;
|
import * as q from 'q';
|
||||||
export import smartcli = require("smartcli");
|
import * as shelljs from 'shelljs';
|
||||||
export import smartfile = require("smartfile");
|
import * as smartcli from 'smartcli';
|
||||||
export import smartstring = require("smartstring");
|
import * as smartfile from 'smartfile';
|
||||||
|
import * as smartgit from 'smartgit';
|
||||||
|
import * as smartstring from 'smartstring';
|
||||||
|
export { beautylog, cflare, fs, lik, path, q, shelljs, smartcli, smartfile, smartgit, smartstring };
|
||||||
|
34
dist/cert.plugins.js
vendored
34
dist/cert.plugins.js
vendored
@ -1,13 +1,25 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
require("typings-global");
|
require("typings-global");
|
||||||
exports.beautylog = require("beautylog");
|
const beautylog = require("beautylog");
|
||||||
exports.cflare = require("cflare");
|
exports.beautylog = beautylog;
|
||||||
exports.fs = require("fs-extra");
|
const cflare = require("cflare");
|
||||||
exports.path = require("path");
|
exports.cflare = cflare;
|
||||||
exports.q = require("q");
|
let fs = require('fs-extra');
|
||||||
exports.shelljs = require("shelljs");
|
exports.fs = fs;
|
||||||
exports.smartcli = require("smartcli");
|
const lik = require("lik");
|
||||||
exports.smartfile = require("smartfile");
|
exports.lik = lik;
|
||||||
exports.smartstring = require("smartstring");
|
const path = require("path");
|
||||||
|
exports.path = path;
|
||||||
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNlcnQucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsUUFBTyxnQkFBZ0IsQ0FBQyxDQUFBO0FBQ1YsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNqQyxjQUFNLFdBQVcsUUFBUSxDQUFDLENBQUM7QUFDOUIsVUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0QixZQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDMUIsU0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixlQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzFCLGdCQUFRLFdBQVcsVUFBVSxDQUFDLENBQUM7QUFDL0IsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNqQyxtQkFBVyxXQUFXLGFBQWEsQ0FBQyxDQUFDIiwiZmlsZSI6ImNlcnQucGx1Z2lucy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCI7XG5leHBvcnQgaW1wb3J0IGJlYXV0eWxvZyA9IHJlcXVpcmUoXCJiZWF1dHlsb2dcIik7XG5leHBvcnQgaW1wb3J0IGNmbGFyZSA9IHJlcXVpcmUoXCJjZmxhcmVcIik7XG5leHBvcnQgbGV0IGZzID0gcmVxdWlyZShcImZzLWV4dHJhXCIpO1xuZXhwb3J0IGltcG9ydCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5leHBvcnQgbGV0IHEgPSByZXF1aXJlKFwicVwiKTtcbmV4cG9ydCBsZXQgc2hlbGxqcyA9IHJlcXVpcmUoXCJzaGVsbGpzXCIpO1xuZXhwb3J0IGltcG9ydCBzbWFydGNsaSA9IHJlcXVpcmUoXCJzbWFydGNsaVwiKTtcbmV4cG9ydCBpbXBvcnQgc21hcnRmaWxlID0gcmVxdWlyZShcInNtYXJ0ZmlsZVwiKTtcbmV4cG9ydCBpbXBvcnQgc21hcnRzdHJpbmcgPSByZXF1aXJlKFwic21hcnRzdHJpbmdcIik7XG5cbiJdfQ==
|
const q = require("q");
|
||||||
|
exports.q = q;
|
||||||
|
const shelljs = require("shelljs");
|
||||||
|
exports.shelljs = shelljs;
|
||||||
|
const smartcli = require("smartcli");
|
||||||
|
exports.smartcli = smartcli;
|
||||||
|
const smartfile = require("smartfile");
|
||||||
|
exports.smartfile = smartfile;
|
||||||
|
const smartgit = require("smartgit");
|
||||||
|
exports.smartgit = smartgit;
|
||||||
|
const smartstring = require("smartstring");
|
||||||
|
exports.smartstring = smartstring;
|
||||||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC5wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2VydC5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwwQkFBdUI7QUFDdkIsdUNBQXNDO0FBYWxDLDhCQUFTO0FBWmIsaUNBQWdDO0FBYTVCLHdCQUFNO0FBWlYsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0FBYXhCLGdCQUFFO0FBWk4sMkJBQTBCO0FBYXRCLGtCQUFHO0FBWlAsNkJBQTRCO0FBYXhCLG9CQUFJO0FBWlIsdUJBQXNCO0FBYWxCLGNBQUM7QUFaTCxtQ0FBa0M7QUFhOUIsMEJBQU87QUFaWCxxQ0FBb0M7QUFhaEMsNEJBQVE7QUFaWix1Q0FBc0M7QUFhbEMsOEJBQVM7QUFaYixxQ0FBb0M7QUFhaEMsNEJBQVE7QUFaWiwyQ0FBMEM7QUFhdEMsa0NBQVcifQ==
|
22
dist/index.d.ts
vendored
22
dist/index.d.ts
vendored
@ -1,21 +1 @@
|
|||||||
export declare class Cert {
|
export * from './cert.classes.cert';
|
||||||
cfEmail: string;
|
|
||||||
cfKey: string;
|
|
||||||
sslDir: string;
|
|
||||||
certificatesPresent: any;
|
|
||||||
certificatesValid: any;
|
|
||||||
gitOriginRepo: any;
|
|
||||||
constructor(optionsArg: {
|
|
||||||
cfEmail: string;
|
|
||||||
cfKey: string;
|
|
||||||
sslDir: string;
|
|
||||||
gitOriginRepo?: string;
|
|
||||||
});
|
|
||||||
getDomainCert(domainNameArg: string): any;
|
|
||||||
}
|
|
||||||
export declare class Certificate {
|
|
||||||
domainName: string;
|
|
||||||
creationDate: Date;
|
|
||||||
expiryDate: Date;
|
|
||||||
constructor();
|
|
||||||
}
|
|
||||||
|
38
dist/index.js
vendored
38
dist/index.js
vendored
@ -1,36 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
var plugins = require("./cert.plugins");
|
function __export(m) {
|
||||||
var paths = require("./cert.paths");
|
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||||||
var Cert = (function () {
|
|
||||||
function Cert(optionsArg) {
|
|
||||||
this.cfEmail = optionsArg.cfEmail;
|
|
||||||
this.cfKey = optionsArg.cfKey;
|
|
||||||
this.sslDir = optionsArg.sslDir;
|
|
||||||
this.gitOriginRepo = optionsArg.gitOriginRepo;
|
|
||||||
var config = {
|
|
||||||
cfEmail: this.cfEmail,
|
|
||||||
cfKey: this.cfKey
|
|
||||||
};
|
|
||||||
plugins.smartfile.memory.toFsSync(JSON.stringify(config), { fileName: "config.json", filePath: plugins.path.join(__dirname, "assets/") });
|
|
||||||
}
|
}
|
||||||
;
|
__export(require("./cert.classes.cert"));
|
||||||
Cert.prototype.getDomainCert = function (domainNameArg) {
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEseUNBQW1DIn0=
|
||||||
var done = plugins.q.defer();
|
|
||||||
plugins.shelljs.exec("chmod 700 " + paths.letsencryptSh);
|
|
||||||
plugins.shelljs.exec("chmod 700 " + paths.certHook);
|
|
||||||
plugins.shelljs.exec("bash -c \"" + paths.letsencryptSh + " -c -d " + domainNameArg + " -t dns-01 -k " + paths.certHook + " -o " + paths.sslDir + "\"");
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
;
|
|
||||||
return Cert;
|
|
||||||
}());
|
|
||||||
exports.Cert = Cert;
|
|
||||||
var Certificate = (function () {
|
|
||||||
function Certificate() {
|
|
||||||
}
|
|
||||||
;
|
|
||||||
return Certificate;
|
|
||||||
}());
|
|
||||||
exports.Certificate = Certificate;
|
|
||||||
|
|
||||||
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxJQUFZLE9BQU8sV0FBTSxnQkFBZ0IsQ0FBQyxDQUFBO0FBQzFDLElBQVksS0FBSyxXQUFNLGNBQWMsQ0FBQyxDQUFBO0FBRXRDO0lBT0ksY0FBWSxVQUtYO1FBQ0csSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLElBQUksTUFBTSxHQUFHO1lBQ1QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNwQixDQUFBO1FBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUMsRUFBQyxRQUFRLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQ3ZJLENBQUM7O0lBQ0QsNEJBQWEsR0FBYixVQUFjLGFBQW9CO1FBQzlCLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsYUFBYSxHQUFHLFNBQVMsR0FBRyxhQUFhLEdBQUcsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLEdBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN2SixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDOztJQUNMLFdBQUM7QUFBRCxDQTlCQSxBQThCQyxJQUFBO0FBOUJZLFlBQUksT0E4QmhCLENBQUE7QUFFRDtJQUlJO0lBRUEsQ0FBQzs7SUFDTCxrQkFBQztBQUFELENBUEEsQUFPQyxJQUFBO0FBUFksbUJBQVcsY0FPdkIsQ0FBQSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vY2VydC5wbHVnaW5zXCI7XG5pbXBvcnQgKiBhcyBwYXRocyBmcm9tIFwiLi9jZXJ0LnBhdGhzXCI7XG5cbmV4cG9ydCBjbGFzcyBDZXJ0IHtcbiAgICBjZkVtYWlsOnN0cmluZztcbiAgICBjZktleTpzdHJpbmc7XG4gICAgc3NsRGlyOnN0cmluZztcbiAgICBjZXJ0aWZpY2F0ZXNQcmVzZW50O1xuICAgIGNlcnRpZmljYXRlc1ZhbGlkO1xuICAgIGdpdE9yaWdpblJlcG87XG4gICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZzp7XG4gICAgICAgIGNmRW1haWw6c3RyaW5nLFxuICAgICAgICBjZktleTpzdHJpbmcsXG4gICAgICAgIHNzbERpcjpzdHJpbmcsXG4gICAgICAgIGdpdE9yaWdpblJlcG8/OnN0cmluZ1xuICAgIH0pe1xuICAgICAgICB0aGlzLmNmRW1haWwgPSBvcHRpb25zQXJnLmNmRW1haWw7XG4gICAgICAgIHRoaXMuY2ZLZXkgPSBvcHRpb25zQXJnLmNmS2V5O1xuICAgICAgICB0aGlzLnNzbERpciA9IG9wdGlvbnNBcmcuc3NsRGlyO1xuICAgICAgICB0aGlzLmdpdE9yaWdpblJlcG8gPSBvcHRpb25zQXJnLmdpdE9yaWdpblJlcG87XG4gICAgICAgIGxldCBjb25maWcgPSB7XG4gICAgICAgICAgICBjZkVtYWlsOiB0aGlzLmNmRW1haWwsXG4gICAgICAgICAgICBjZktleTogdGhpcy5jZktleVxuICAgICAgICB9XG4gICAgICAgIHBsdWdpbnMuc21hcnRmaWxlLm1lbW9yeS50b0ZzU3luYyhKU09OLnN0cmluZ2lmeShjb25maWcpLHtmaWxlTmFtZTpcImNvbmZpZy5qc29uXCIsZmlsZVBhdGg6cGx1Z2lucy5wYXRoLmpvaW4oX19kaXJuYW1lLFwiYXNzZXRzL1wiKX0pO1xuICAgIH07XG4gICAgZ2V0RG9tYWluQ2VydChkb21haW5OYW1lQXJnOnN0cmluZyl7XG4gICAgICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgICAgIHBsdWdpbnMuc2hlbGxqcy5leGVjKFwiY2htb2QgNzAwIFwiICsgcGF0aHMubGV0c2VuY3J5cHRTaCk7XG4gICAgICAgIHBsdWdpbnMuc2hlbGxqcy5leGVjKFwiY2htb2QgNzAwIFwiICsgcGF0aHMuY2VydEhvb2spO1xuICAgICAgICBwbHVnaW5zLnNoZWxsanMuZXhlYyhcImJhc2ggLWMgXFxcIlwiICsgcGF0aHMubGV0c2VuY3J5cHRTaCArIFwiIC1jIC1kIFwiICsgZG9tYWluTmFtZUFyZyArIFwiIC10IGRucy0wMSAtayBcIiArIHBhdGhzLmNlcnRIb29rICsgXCIgLW8gXCIrIHBhdGhzLnNzbERpciArIFwiXFxcIlwiKTtcbiAgICAgICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgQ2VydGlmaWNhdGUge1xuICAgIGRvbWFpbk5hbWU6c3RyaW5nO1xuICAgIGNyZWF0aW9uRGF0ZTpEYXRlO1xuICAgIGV4cGlyeURhdGU6RGF0ZTtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuXG4gICAgfTtcbn0iXX0=
|
|
1
dist/install.d.ts
vendored
1
dist/install.d.ts
vendored
@ -1 +0,0 @@
|
|||||||
export declare let startInstall: () => any;
|
|
20
dist/install.js
vendored
20
dist/install.js
vendored
@ -1,20 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var plugins = require("./cert.plugins");
|
|
||||||
var paths = require("./cert.paths");
|
|
||||||
exports.startInstall = function () {
|
|
||||||
var done = plugins.q.defer();
|
|
||||||
plugins.beautylog.info("installing letsencrypt.sh locally...");
|
|
||||||
plugins.fs.ensureDir(plugins.path.join(__dirname, "assets/"));
|
|
||||||
plugins.smartfile.remote.toFs("https://raw.githubusercontent.com/lukas2511/letsencrypt.sh/master/letsencrypt.sh", paths.letsencryptSh).then(function () {
|
|
||||||
plugins.beautylog.success("Done!");
|
|
||||||
done.resolve();
|
|
||||||
});
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
var smartcli = new plugins.smartcli.Smartcli();
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: "install"
|
|
||||||
}).then(exports.startInstall);
|
|
||||||
smartcli.startParse();
|
|
||||||
|
|
||||||
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluc3RhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLElBQVksT0FBTyxXQUFNLGdCQUFnQixDQUFDLENBQUE7QUFDMUMsSUFBWSxLQUFLLFdBQU0sY0FBYyxDQUFDLENBQUE7QUFFM0Isb0JBQVksR0FBRztJQUN0QixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFFL0QsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixrRkFBa0YsRUFDbEYsS0FBSyxDQUFDLGFBQWEsQ0FDdEIsQ0FBQyxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUM7QUFFRixJQUFJLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDL0MsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUMsU0FBUztDQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFZLENBQUMsQ0FBQztBQUN0QixRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMiLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vY2VydC5wbHVnaW5zXCI7XG5pbXBvcnQgKiBhcyBwYXRocyBmcm9tIFwiLi9jZXJ0LnBhdGhzXCI7XG5cbmV4cG9ydCBsZXQgc3RhcnRJbnN0YWxsID0gKCkgPT4ge1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgcGx1Z2lucy5iZWF1dHlsb2cuaW5mbyhcImluc3RhbGxpbmcgbGV0c2VuY3J5cHQuc2ggbG9jYWxseS4uLlwiKTtcblxuICAgIHBsdWdpbnMuZnMuZW5zdXJlRGlyKHBsdWdpbnMucGF0aC5qb2luKF9fZGlybmFtZSwgXCJhc3NldHMvXCIpKTtcbiAgICBwbHVnaW5zLnNtYXJ0ZmlsZS5yZW1vdGUudG9GcyhcbiAgICAgICAgXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbHVrYXMyNTExL2xldHNlbmNyeXB0LnNoL21hc3Rlci9sZXRzZW5jcnlwdC5zaFwiLFxuICAgICAgICBwYXRocy5sZXRzZW5jcnlwdFNoXG4gICAgKS50aGVuKCgpID0+IHtcbiAgICAgICAgcGx1Z2lucy5iZWF1dHlsb2cuc3VjY2VzcyhcIkRvbmUhXCIpO1xuICAgICAgICBkb25lLnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufTtcblxubGV0IHNtYXJ0Y2xpID0gbmV3IHBsdWdpbnMuc21hcnRjbGkuU21hcnRjbGkoKTtcbnNtYXJ0Y2xpLmFkZENvbW1hbmQoe1xuICAgIGNvbW1hbmROYW1lOlwiaW5zdGFsbFwiXG59KS50aGVuKHN0YXJ0SW5zdGFsbCk7XG5zbWFydGNsaS5zdGFydFBhcnNlKCk7Il19
|
|
5
npmextra.json
Normal file
5
npmextra.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"npmts": {
|
||||||
|
"mode": "default"
|
||||||
|
}
|
||||||
|
}
|
39
package.json
39
package.json
@ -1,11 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "cert",
|
"name": "cert",
|
||||||
"version": "0.0.8",
|
"version": "1.0.8",
|
||||||
"description": "Easily obain SSL certificates from LetsEncrypt. Supports DNS-01 challenge. TypeScript ready.",
|
"description": "Easily obain SSL certificates from LetsEncrypt. Supports DNS-01 challenge. TypeScript ready.",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
|
"typings": "dist/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(npmts)",
|
"test": "(npm run cleanTest && npmts --nodocs)",
|
||||||
"install": "node dist/install.js install"
|
"cleanTest": "(rm -rf ./test/assets)",
|
||||||
|
"compile": "(npmts --notest)"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -24,22 +26,25 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://gitlab.com/pushrocks/cert#readme",
|
"homepage": "https://gitlab.com/pushrocks/cert#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"beautylog": "^5.0.12",
|
"@types/minimatch": "2.x.x",
|
||||||
"cflare": "0.0.7",
|
"@types/q": "0.0.32",
|
||||||
"fs-extra": "^0.30.0",
|
"beautylog": "^6.0.0",
|
||||||
"letsencrypt": "^1.4.4",
|
"cflare": "0.0.10",
|
||||||
|
"fs-extra": "^1.0.0",
|
||||||
|
"lik": "^1.0.27",
|
||||||
"q": "^1.4.1",
|
"q": "^1.4.1",
|
||||||
"shelljs": "^0.7.0",
|
"smartacme": "^1.0.2",
|
||||||
"smartcli": "^1.0.4",
|
"smartcli": "^2.0.1",
|
||||||
"smartfile": "^3.0.10",
|
"smartfile": "^4.1.1",
|
||||||
"smartgit": "0.0.10",
|
"smartgit": "1.0.5",
|
||||||
"smartstring": "^2.0.10",
|
"smartstring": "^2.0.22",
|
||||||
"typings-global": "^1.0.3"
|
"typings-global": "^1.0.14"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"npmts-g": "^5.2.6",
|
"@types/should": "^8.1.30",
|
||||||
"qenv": "^1.0.8",
|
"npmts-g": "^5.2.10",
|
||||||
"should": "^9.0.2",
|
"qenv": "^1.1.1",
|
||||||
"typings-test": "^1.0.1"
|
"should": "^11.1.2",
|
||||||
|
"typings-test": "^1.0.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1656
pnpm-lock.yaml
generated
Normal file
1656
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
3
test/test.d.ts
vendored
3
test/test.d.ts
vendored
@ -1,2 +1 @@
|
|||||||
import "typings-test";
|
import 'typings-test';
|
||||||
import "should";
|
|
||||||
|
55
test/test.js
55
test/test.js
@ -1,36 +1,43 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
require("typings-test");
|
require("typings-test");
|
||||||
require("should");
|
const should = require("should");
|
||||||
var qenv_1 = require("qenv");
|
const qenv_1 = require("qenv");
|
||||||
var install_1 = require("../dist/install");
|
const path = require("path");
|
||||||
var cert = require("../dist/index");
|
const q = require("q");
|
||||||
var testQenv = new qenv_1.Qenv(process.cwd(), process.cwd() + "/.nogit");
|
const cert = require("../dist/index");
|
||||||
var testCert;
|
let testQenv = new qenv_1.Qenv(process.cwd(), process.cwd() + '/.nogit');
|
||||||
describe("cert", function () {
|
let testCert;
|
||||||
describe("install", function () {
|
describe('cert', function () {
|
||||||
it("should download letsencrypt.sh", function (done) {
|
describe('Cert', function () {
|
||||||
this.timeout(5000);
|
it('should create a new Cert object from class', function () {
|
||||||
install_1.startInstall().then(function () {
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe("Cert", function () {
|
|
||||||
it("should create a new cert", function () {
|
|
||||||
testCert = new cert.Cert({
|
testCert = new cert.Cert({
|
||||||
cfEmail: process.env.CF_EMAIL,
|
cfEmail: process.env.CF_EMAIL,
|
||||||
cfKey: process.env.CF_KEY,
|
cfKey: process.env.CF_KEY,
|
||||||
sslDir: ""
|
sslDirPath: path.join(process.cwd(), 'test/assets'),
|
||||||
|
gitOriginRepo: 'git@gitlab.com:sandboxzone/sandbox-sslorigin.git',
|
||||||
|
leEnv: 'staging'
|
||||||
});
|
});
|
||||||
testCert.should.be.instanceof(cert.Cert);
|
should(testCert).be.instanceof(cert.Cert);
|
||||||
});
|
});
|
||||||
it("should get a valid certificate", function (done) {
|
it('should run class Cert.setup() successful', function (done) {
|
||||||
this.timeout(120000);
|
this.timeout(40000);
|
||||||
testCert.getDomainCert("sub2.bleu.de").then(function () {
|
testCert.setup().then(() => {
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should get a valid certificate', function (done) {
|
||||||
|
this.timeout(1200000);
|
||||||
|
let promiseArray = [];
|
||||||
|
function getRandomArbitrary(min, max) {
|
||||||
|
return Math.floor(Math.random() * (max - min) + min);
|
||||||
|
}
|
||||||
|
promiseArray.push(testCert.addCertificate(`testing${getRandomArbitrary(1, 100000)}.bleu.de`));
|
||||||
|
// promiseArray.push(testCert.addCertificate(`testing${getRandomArbitrary(1,100000)}.bleu.de`))
|
||||||
|
// promiseArray.push(testCert.addCertificate(`testing${getRandomArbitrary(1,100000)}.bleu.de`))
|
||||||
|
q.all(promiseArray).then(() => {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFDaEMsK0JBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qix1QkFBdUI7QUFDdkIsc0NBQXFDO0FBR3JDLElBQUksUUFBUSxHQUFHLElBQUksV0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUE7QUFFakUsSUFBSSxRQUFtQixDQUFBO0FBRXZCLFFBQVEsQ0FBQyxNQUFNLEVBQUM7SUFDWixRQUFRLENBQUMsTUFBTSxFQUFDO1FBQ1osRUFBRSxDQUFDLDRDQUE0QyxFQUFDO1lBQzVDLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7Z0JBQzdCLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU07Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBQyxhQUFhLENBQUM7Z0JBQ2xELGFBQWEsRUFBRSxrREFBa0Q7Z0JBQ2pFLEtBQUssRUFBRSxTQUFTO2FBQ25CLENBQUMsQ0FBQTtZQUNGLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM3QyxDQUFDLENBQUMsQ0FBQTtRQUNGLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxVQUFTLElBQUk7WUFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNuQixRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO2dCQUNsQixJQUFJLEVBQUUsQ0FBQTtZQUNWLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFDLENBQUE7UUFDRixFQUFFLENBQUMsZ0NBQWdDLEVBQUMsVUFBUyxJQUFJO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDckIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFBO1lBQ3JCLDRCQUE0QixHQUFHLEVBQUUsR0FBRztnQkFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFBO1lBQ3hELENBQUM7WUFDRCxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsVUFBVSxrQkFBa0IsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7WUFDNUYsK0ZBQStGO1lBQy9GLCtGQUErRjtZQUMvRixDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDckIsSUFBSSxFQUFFLENBQUE7WUFDVixDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9
|
||||||
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFDdEIsUUFBTyxRQUFRLENBQUMsQ0FBQTtBQUNoQixxQkFBbUIsTUFBTSxDQUFDLENBQUE7QUFFMUIsd0JBQTJCLGlCQUFpQixDQUFDLENBQUE7QUFDN0MsSUFBWSxJQUFJLFdBQU0sZUFBZSxDQUFDLENBQUE7QUFHdEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxXQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUVsRSxJQUFJLFFBQWtCLENBQUM7QUFFdkIsUUFBUSxDQUFDLE1BQU0sRUFBQztJQUNaLFFBQVEsQ0FBQyxTQUFTLEVBQUM7UUFDZixFQUFFLENBQUMsZ0NBQWdDLEVBQUMsVUFBUyxJQUFJO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsc0JBQVksRUFBRSxDQUFDLElBQUksQ0FBQztnQkFDaEIsSUFBSSxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsTUFBTSxFQUFDO1FBQ1osRUFBRSxDQUFDLDBCQUEwQixFQUFDO1lBQzFCLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7Z0JBQzdCLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU07Z0JBQ3pCLE1BQU0sRUFBRSxFQUFFO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQTtRQUNGLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBQyxVQUFTLElBQUk7WUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQixRQUFRLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDeEMsSUFBSSxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQyIsImZpbGUiOiJ0ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy10ZXN0XCI7XG5pbXBvcnQgXCJzaG91bGRcIjtcbmltcG9ydCB7UWVudn0gZnJvbSBcInFlbnZcIjtcblxuaW1wb3J0IHtzdGFydEluc3RhbGx9IGZyb20gXCIuLi9kaXN0L2luc3RhbGxcIjtcbmltcG9ydCAqIGFzIGNlcnQgZnJvbSBcIi4uL2Rpc3QvaW5kZXhcIjtcblxuXG5sZXQgdGVzdFFlbnYgPSBuZXcgUWVudihwcm9jZXNzLmN3ZCgpLCBwcm9jZXNzLmN3ZCgpICsgXCIvLm5vZ2l0XCIpO1xuXG5sZXQgdGVzdENlcnQ6Y2VydC5DZXJ0O1xuXG5kZXNjcmliZShcImNlcnRcIixmdW5jdGlvbigpe1xuICAgIGRlc2NyaWJlKFwiaW5zdGFsbFwiLGZ1bmN0aW9uKCl7XG4gICAgICAgIGl0KFwic2hvdWxkIGRvd25sb2FkIGxldHNlbmNyeXB0LnNoXCIsZnVuY3Rpb24oZG9uZSl7XG4gICAgICAgICAgICB0aGlzLnRpbWVvdXQoNTAwMCk7XG4gICAgICAgICAgICBzdGFydEluc3RhbGwoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgZGVzY3JpYmUoXCJDZXJ0XCIsZnVuY3Rpb24oKXtcbiAgICAgICAgaXQoXCJzaG91bGQgY3JlYXRlIGEgbmV3IGNlcnRcIixmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGVzdENlcnQgPSBuZXcgY2VydC5DZXJ0KHtcbiAgICAgICAgICAgICAgICBjZkVtYWlsOiBwcm9jZXNzLmVudi5DRl9FTUFJTCxcbiAgICAgICAgICAgICAgICBjZktleTogcHJvY2Vzcy5lbnYuQ0ZfS0VZLFxuICAgICAgICAgICAgICAgIHNzbERpcjogXCJcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0ZXN0Q2VydC5zaG91bGQuYmUuaW5zdGFuY2VvZihjZXJ0LkNlcnQpO1xuICAgICAgICB9KVxuICAgICAgICBpdChcInNob3VsZCBnZXQgYSB2YWxpZCBjZXJ0aWZpY2F0ZVwiLGZ1bmN0aW9uKGRvbmUpe1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0KDEyMDAwMCk7XG4gICAgICAgICAgICB0ZXN0Q2VydC5nZXREb21haW5DZXJ0KFwic3ViMi5ibGV1LmRlXCIpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH0pXG59KTsiXX0=
|
|
63
test/test.ts
63
test/test.ts
@ -1,38 +1,45 @@
|
|||||||
import "typings-test";
|
import 'typings-test'
|
||||||
import "should";
|
import * as should from 'should'
|
||||||
import {Qenv} from "qenv";
|
import {Qenv} from 'qenv'
|
||||||
|
import path = require('path')
|
||||||
import {startInstall} from "../dist/install";
|
import q = require('q')
|
||||||
import * as cert from "../dist/index";
|
import * as cert from '../dist/index'
|
||||||
|
|
||||||
|
|
||||||
let testQenv = new Qenv(process.cwd(), process.cwd() + "/.nogit");
|
let testQenv = new Qenv(process.cwd(), process.cwd() + '/.nogit')
|
||||||
|
|
||||||
let testCert:cert.Cert;
|
let testCert: cert.Cert
|
||||||
|
|
||||||
describe("cert",function(){
|
describe('cert',function(){
|
||||||
describe("install",function(){
|
describe('Cert',function(){
|
||||||
it("should download letsencrypt.sh",function(done){
|
it('should create a new Cert object from class',function(){
|
||||||
this.timeout(5000);
|
|
||||||
startInstall().then(() => {
|
|
||||||
done();
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
describe("Cert",function(){
|
|
||||||
it("should create a new cert",function(){
|
|
||||||
testCert = new cert.Cert({
|
testCert = new cert.Cert({
|
||||||
cfEmail: process.env.CF_EMAIL,
|
cfEmail: process.env.CF_EMAIL,
|
||||||
cfKey: process.env.CF_KEY,
|
cfKey: process.env.CF_KEY,
|
||||||
sslDir: ""
|
sslDirPath: path.join(process.cwd(),'test/assets'),
|
||||||
});
|
gitOriginRepo: 'git@gitlab.com:sandboxzone/sandbox-sslorigin.git',
|
||||||
testCert.should.be.instanceof(cert.Cert);
|
leEnv: 'staging'
|
||||||
|
})
|
||||||
|
should(testCert).be.instanceof(cert.Cert)
|
||||||
|
})
|
||||||
|
it('should run class Cert.setup() successful', function(done){
|
||||||
|
this.timeout(40000)
|
||||||
|
testCert.setup().then(() => {
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
it('should get a valid certificate',function(done){
|
||||||
|
this.timeout(1200000)
|
||||||
|
let promiseArray = []
|
||||||
|
function getRandomArbitrary(min, max) {
|
||||||
|
return Math.floor(Math.random() * (max - min) + min)
|
||||||
|
}
|
||||||
|
promiseArray.push(testCert.addCertificate(`testing${getRandomArbitrary(1,100000)}.bleu.de`))
|
||||||
|
// promiseArray.push(testCert.addCertificate(`testing${getRandomArbitrary(1,100000)}.bleu.de`))
|
||||||
|
// promiseArray.push(testCert.addCertificate(`testing${getRandomArbitrary(1,100000)}.bleu.de`))
|
||||||
|
q.all(promiseArray).then(() => {
|
||||||
|
done()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
it("should get a valid certificate",function(done){
|
|
||||||
this.timeout(120000);
|
|
||||||
testCert.getDomainCert("sub2.bleu.de").then(() => {
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
});
|
|
98
ts/cert.classes.cert.ts
Normal file
98
ts/cert.classes.cert.ts
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
import * as q from 'q'
|
||||||
|
import { Stringmap, Objectmap } from 'lik'
|
||||||
|
|
||||||
|
import * as plugins from './cert.plugins'
|
||||||
|
import * as paths from './cert.paths'
|
||||||
|
|
||||||
|
// classes
|
||||||
|
import { Certificate } from './cert.classes.certificate'
|
||||||
|
import { CertRepo } from './cert.classes.certrepo'
|
||||||
|
import { Letsencrypt, TLeEnv } from './cert.classes.letsencrypt'
|
||||||
|
import { ChallengeHandler } from './cert.classes.challengehandler'
|
||||||
|
|
||||||
|
|
||||||
|
export interface ICertConstructorOptions {
|
||||||
|
cfEmail: string,
|
||||||
|
cfKey: string,
|
||||||
|
sslDirPath?: string,
|
||||||
|
gitOriginRepo?: string,
|
||||||
|
leEnv?: TLeEnv
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Cert {
|
||||||
|
domainStringRequestMap = new Stringmap()
|
||||||
|
certificateMap = new Objectmap<Certificate>()
|
||||||
|
letsencrypt: Letsencrypt
|
||||||
|
private _challengeHandler: ChallengeHandler
|
||||||
|
private _certRepo: CertRepo
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for Cert object
|
||||||
|
*/
|
||||||
|
constructor(optionsArg: ICertConstructorOptions) {
|
||||||
|
|
||||||
|
// set up challengehandler
|
||||||
|
this._challengeHandler = new ChallengeHandler({
|
||||||
|
cfEmail: optionsArg.cfEmail,
|
||||||
|
cfKey: optionsArg.cfKey
|
||||||
|
})
|
||||||
|
|
||||||
|
// setup Letsencrypt
|
||||||
|
this.letsencrypt = new Letsencrypt({
|
||||||
|
leEnv: optionsArg.leEnv,
|
||||||
|
sslDir: optionsArg.sslDirPath,
|
||||||
|
challengeHandler: this._challengeHandler
|
||||||
|
})
|
||||||
|
|
||||||
|
this._certRepo = new CertRepo({
|
||||||
|
sslDirPath: optionsArg.sslDirPath,
|
||||||
|
remoteGitUrl: optionsArg.gitOriginRepo,
|
||||||
|
certInstance: this
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* setup the Cert instanceof
|
||||||
|
* @executes ASYNC
|
||||||
|
* @return Promise
|
||||||
|
*/
|
||||||
|
setup() {
|
||||||
|
return this._certRepo.setup()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* adds a Certificate for a given domain
|
||||||
|
*/
|
||||||
|
addCertificate(domainNameArg: string, optionsArg: { force: boolean } = { force: false }) {
|
||||||
|
let done = q.defer()
|
||||||
|
let certificateForDomain = this.certificateMap.find((certificate) => {
|
||||||
|
return certificate.domainName === domainNameArg
|
||||||
|
})
|
||||||
|
if (certificateForDomain instanceof Certificate) {
|
||||||
|
certificateForDomain.renew()
|
||||||
|
.then(done.resolve)
|
||||||
|
} else {
|
||||||
|
certificateForDomain = new Certificate({
|
||||||
|
certInstance: this,
|
||||||
|
domainName: domainNameArg
|
||||||
|
})
|
||||||
|
certificateForDomain.renew()
|
||||||
|
.then(done.resolve)
|
||||||
|
}
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cleans up old certificates
|
||||||
|
*/
|
||||||
|
cleanOldCertificates() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* executes the current batch of jobs
|
||||||
|
*/
|
||||||
|
deploy() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
129
ts/cert.classes.certificate.ts
Normal file
129
ts/cert.classes.certificate.ts
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
import * as q from 'q'
|
||||||
|
|
||||||
|
import * as plugins from './cert.plugins'
|
||||||
|
import * as paths from './cert.paths'
|
||||||
|
|
||||||
|
// import classes
|
||||||
|
import { Cert } from './cert.classes.cert'
|
||||||
|
import { Letsencrypt } from './cert.classes.letsencrypt'
|
||||||
|
import { CertRepo } from './cert.classes.certrepo'
|
||||||
|
|
||||||
|
export interface ICertificateFsConfig {
|
||||||
|
domainName: string
|
||||||
|
creationTime: number
|
||||||
|
expiryTime: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ICertificateConstructorOptions {
|
||||||
|
domainName: string,
|
||||||
|
certInstance: Cert
|
||||||
|
}
|
||||||
|
|
||||||
|
export type TCertificateStatus = 'unregistered' | 'valid' | 'expiring' | 'expired'
|
||||||
|
|
||||||
|
export class Certificate {
|
||||||
|
domainName: string
|
||||||
|
certInstance: Cert
|
||||||
|
domainData: plugins.smartstring.Domain
|
||||||
|
creationDate: Date = null
|
||||||
|
expiryDate: Date = null
|
||||||
|
publicKey: string = null
|
||||||
|
privKey: string = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* run when creating a new instance of Certificate
|
||||||
|
*/
|
||||||
|
constructor(optionsArg: ICertificateConstructorOptions) {
|
||||||
|
this.domainName = optionsArg.domainName
|
||||||
|
this.domainData = new plugins.smartstring.Domain(this.domainName)
|
||||||
|
this.certInstance = optionsArg.certInstance
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the status of the Certificate
|
||||||
|
*/
|
||||||
|
get status(): TCertificateStatus {
|
||||||
|
let validTimeRemaining: number = 0
|
||||||
|
if (this.creationDate !== null && this.expiryDate !== null) {
|
||||||
|
validTimeRemaining = this.expiryDate.getTime() - Date.now()
|
||||||
|
}
|
||||||
|
let MonthMilliseconds = 2629746000
|
||||||
|
if (this.publicKey === null || this.privKey === null) {
|
||||||
|
return 'unregistered'
|
||||||
|
} else if (validTimeRemaining >= MonthMilliseconds) {
|
||||||
|
return 'valid'
|
||||||
|
} else if (validTimeRemaining < MonthMilliseconds && validTimeRemaining >= 0) {
|
||||||
|
return 'expiring'
|
||||||
|
} else {
|
||||||
|
return 'expired'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get sameZoneRequesting(): boolean {
|
||||||
|
return this.certInstance.domainStringRequestMap.checkMinimatch('*' + this.domainData.zoneName)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* schedule a retry of certificate request
|
||||||
|
*/
|
||||||
|
scheduleRetry() {
|
||||||
|
let done = plugins.q.defer()
|
||||||
|
setTimeout(() => {
|
||||||
|
this.renew()
|
||||||
|
.then(done.resolve)
|
||||||
|
}, 60000)
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* renew certificate if needed
|
||||||
|
*/
|
||||||
|
renew(force: boolean = false) {
|
||||||
|
let done = q.defer()
|
||||||
|
if (this.status === 'valid') {
|
||||||
|
plugins.beautylog.log('Certificate still valid for more than 1 month, so it is not renewed now')
|
||||||
|
done.resolve()
|
||||||
|
} else if (this.status === 'expiring' || this.status === 'expired' || this.status === 'unregistered') {
|
||||||
|
plugins.beautylog.info('Certificate not valid currently, going to renew now!')
|
||||||
|
if (this.sameZoneRequesting) {
|
||||||
|
this.certInstance.domainStringRequestMap.registerUntilTrue(
|
||||||
|
() => {
|
||||||
|
return !this.sameZoneRequesting
|
||||||
|
},
|
||||||
|
() => {
|
||||||
|
this.renew().then(done.resolve)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
this.certInstance.letsencrypt.registerDomain(this.domainName)
|
||||||
|
.then(() => {
|
||||||
|
return this.syncFs()
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
done.resolve()
|
||||||
|
}).catch((err) => { console.log(err) })
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw Error(`weird status for certificate with domain name ${this.domainName}`)
|
||||||
|
}
|
||||||
|
done.resolve()
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* syncFs syncs the certificate with disk
|
||||||
|
*/
|
||||||
|
syncFs() {
|
||||||
|
let configJsonMemory: ICertificateFsConfig = {
|
||||||
|
domainName: this.domainName,
|
||||||
|
creationTime: this.creationDate.getTime(),
|
||||||
|
expiryTime: this.expiryDate.getTime()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* deletes the certificate
|
||||||
|
*/
|
||||||
|
delete() { }
|
||||||
|
}
|
77
ts/cert.classes.certrepo.ts
Normal file
77
ts/cert.classes.certrepo.ts
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
import * as q from 'q'
|
||||||
|
import { GitRepo } from 'smartgit'
|
||||||
|
|
||||||
|
import * as plugins from './cert.plugins'
|
||||||
|
import * as paths from './cert.paths'
|
||||||
|
|
||||||
|
import { Cert } from './cert.classes.cert'
|
||||||
|
import { Certificate } from './cert.classes.certificate'
|
||||||
|
|
||||||
|
export interface ICertRepoConstructorOptions {
|
||||||
|
sslDirPath: string
|
||||||
|
remoteGitUrl: string
|
||||||
|
certInstance: Cert
|
||||||
|
}
|
||||||
|
|
||||||
|
export class CertRepo {
|
||||||
|
private _sslDirPath: string
|
||||||
|
private _remoteGitUrl: string
|
||||||
|
private gitRepo: GitRepo
|
||||||
|
private _certInstance: Cert
|
||||||
|
constructor(optionsArg: ICertRepoConstructorOptions) {
|
||||||
|
this._sslDirPath = optionsArg.sslDirPath
|
||||||
|
this._remoteGitUrl = optionsArg.remoteGitUrl
|
||||||
|
this._certInstance = optionsArg.certInstance
|
||||||
|
|
||||||
|
// setup sslDir
|
||||||
|
if (!this._sslDirPath) {
|
||||||
|
this._sslDirPath = paths.defaultSslDir
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* setup the Cert instance
|
||||||
|
*/
|
||||||
|
setup() {
|
||||||
|
// setup Git
|
||||||
|
let done = q.defer()
|
||||||
|
if (this._remoteGitUrl) {
|
||||||
|
plugins.smartfile.fs.ensureEmptyDirSync(paths.defaultSslDir)
|
||||||
|
plugins.smartgit.createRepoFromClone(this._remoteGitUrl, paths.defaultSslDir)
|
||||||
|
.then(gitRepoArg => {
|
||||||
|
this.gitRepo = gitRepoArg
|
||||||
|
done.resolve()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* syncs an objectmap of Certificates with repo
|
||||||
|
*/
|
||||||
|
syncFs() {
|
||||||
|
let done = q.defer()
|
||||||
|
done.resolve()
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pulls already requested certificates from git origin
|
||||||
|
*/
|
||||||
|
sslGitOriginPull = () => {
|
||||||
|
if (this.gitRepo) {
|
||||||
|
this.gitRepo.pull('origin', 'master')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pushes all new requested certificates to git origin
|
||||||
|
*/
|
||||||
|
sslGitOriginAddCommitPush = () => {
|
||||||
|
if (this._remoteGitUrl) {
|
||||||
|
this.gitRepo.addAll()
|
||||||
|
this.gitRepo.commit('added new SSL certificates and deleted obsolete ones.')
|
||||||
|
this.gitRepo.push('origin', 'master')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
84
ts/cert.classes.challengehandler.ts
Normal file
84
ts/cert.classes.challengehandler.ts
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
import * as plugins from './cert.plugins'
|
||||||
|
import * as paths from './cert.paths'
|
||||||
|
|
||||||
|
export interface IChallengehandlerConstructorOptions {
|
||||||
|
cfEmail: string,
|
||||||
|
cfKey: string,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class ChallengeHandler handles challenges
|
||||||
|
*/
|
||||||
|
export class ChallengeHandler {
|
||||||
|
private _cfInstance: plugins.cflare.CflareAccount
|
||||||
|
constructor(optionsArg: IChallengehandlerConstructorOptions) {
|
||||||
|
this._cfInstance = new plugins.cflare.CflareAccount()
|
||||||
|
this._cfInstance.auth({
|
||||||
|
email: optionsArg.cfEmail,
|
||||||
|
key: optionsArg.cfKey
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set a challenge
|
||||||
|
*/
|
||||||
|
setChallenge(domainNameArg: string, challengeArg: string) {
|
||||||
|
let done = plugins.q.defer()
|
||||||
|
plugins.beautylog.log('setting challenge for ' + domainNameArg)
|
||||||
|
this._cfInstance.createRecord(prefixName(domainNameArg), 'TXT', challengeArg).then(() => {
|
||||||
|
plugins.beautylog.ok('Challenge has been set!')
|
||||||
|
plugins.beautylog.info('We need to cool down to let DNS propagate to edge locations!')
|
||||||
|
cooldown().then(() => {
|
||||||
|
done.resolve()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cleans a challenge
|
||||||
|
*/
|
||||||
|
cleanChallenge(domainNameArg) {
|
||||||
|
let done = plugins.q.defer()
|
||||||
|
plugins.beautylog.log('cleaning challenge for ' + domainNameArg)
|
||||||
|
this._cfInstance.removeRecord(prefixName(domainNameArg), 'TXT')
|
||||||
|
cooldown().then(() => {
|
||||||
|
done.resolve()
|
||||||
|
})
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cooldown timer for letting DNS settle before answering the challengerequest
|
||||||
|
*/
|
||||||
|
let cooldown = () => {
|
||||||
|
let done = plugins.q.defer()
|
||||||
|
let cooldowntime = 60000
|
||||||
|
let passedTime = 0
|
||||||
|
plugins.beautylog.log('Cooling down! ' + (cooldowntime / 1000).toString() + ' seconds left')
|
||||||
|
let coolDownCounter = () => {
|
||||||
|
setTimeout(() => {
|
||||||
|
if (cooldowntime <= passedTime) {
|
||||||
|
plugins.beautylog.ok('Cooled down!')
|
||||||
|
done.resolve()
|
||||||
|
} else {
|
||||||
|
passedTime = passedTime + 5000
|
||||||
|
plugins.beautylog.log('Cooling down! '
|
||||||
|
+ ((cooldowntime - passedTime) / 1000).toString()
|
||||||
|
+ ' seconds left'
|
||||||
|
)
|
||||||
|
coolDownCounter()
|
||||||
|
}
|
||||||
|
}, 5000)
|
||||||
|
}
|
||||||
|
coolDownCounter()
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* prefix a domain name to make sure it complies with letsencrypt
|
||||||
|
*/
|
||||||
|
let prefixName = (domainNameArg: string): string => {
|
||||||
|
return '_acme-challenge.' + domainNameArg
|
||||||
|
}
|
48
ts/cert.classes.letsencrypt.ts
Normal file
48
ts/cert.classes.letsencrypt.ts
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
import * as q from 'q'
|
||||||
|
let letsencrypt = require('letsencrypt')
|
||||||
|
let leStore = require('le-store-certbot')
|
||||||
|
|
||||||
|
import * as plugins from './cert.plugins'
|
||||||
|
import * as paths from './cert.paths'
|
||||||
|
|
||||||
|
import { ChallengeHandler } from './cert.classes.challengehandler'
|
||||||
|
|
||||||
|
export type TLeEnv = 'production' | 'staging'
|
||||||
|
|
||||||
|
export interface ILetsencryptConstructorOptions {
|
||||||
|
leEnv: TLeEnv,
|
||||||
|
challengeHandler: ChallengeHandler,
|
||||||
|
sslDir: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Letsencrypt {
|
||||||
|
leEnv: TLeEnv
|
||||||
|
challengeHandler: ChallengeHandler // this is the format we use
|
||||||
|
sslDir: string
|
||||||
|
private _leServerUrl: string
|
||||||
|
|
||||||
|
constructor(optionsArg: ILetsencryptConstructorOptions) {
|
||||||
|
// determine leEnv
|
||||||
|
this.leEnv = optionsArg.leEnv
|
||||||
|
this.challengeHandler = optionsArg.challengeHandler
|
||||||
|
this.sslDir = optionsArg.sslDir
|
||||||
|
|
||||||
|
// set letsencrypt environment
|
||||||
|
if (this.leEnv === 'production') {
|
||||||
|
this._leServerUrl = letsencrypt.productionServerUrl
|
||||||
|
} else if (this.leEnv === 'staging') {
|
||||||
|
this._leServerUrl = letsencrypt.stagingServerUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* register a domain
|
||||||
|
*/
|
||||||
|
registerDomain(domainNameArg: string) {
|
||||||
|
plugins.beautylog.log(`trying to register domain ${domainNameArg}`)
|
||||||
|
let done = q.defer()
|
||||||
|
plugins.smartfile.fs.ensureDirSync(plugins.path.join(paths.leConfigDir, 'live', domainNameArg))
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
}
|
@ -1,58 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
// the shebang line above makes sure this script will get interpreted by node
|
|
||||||
|
|
||||||
import "typings-global";
|
|
||||||
import * as plugins from "./cert.plugins";
|
|
||||||
import * as paths from "./cert.paths";
|
|
||||||
|
|
||||||
let smartcli = new plugins.smartcli.Smartcli();
|
|
||||||
|
|
||||||
let config = plugins.smartfile.local.toObjectSync(paths.config);
|
|
||||||
let cflare = new plugins.cflare.CflareAccount();
|
|
||||||
cflare.auth({
|
|
||||||
email: config.cfEmail,
|
|
||||||
key: config.cfKey
|
|
||||||
});
|
|
||||||
|
|
||||||
let setChallenge = (domainNameArg: string, challengeArg: string) => {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
cflare.createRecord(prefixName(domainNameArg), "TXT", challengeArg).then(() => {
|
|
||||||
cooldown().then(() => {
|
|
||||||
done.resolve();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return done.promise;
|
|
||||||
}
|
|
||||||
|
|
||||||
let cleanChallenge = (domainNameArg) => {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
cflare.removeRecord(prefixName(domainNameArg), "TXT");
|
|
||||||
return done.promise;
|
|
||||||
}
|
|
||||||
|
|
||||||
let cooldown = () => {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
console.log("Cooling down!");
|
|
||||||
setTimeout(() => {
|
|
||||||
done.resolve();
|
|
||||||
}, 20000)
|
|
||||||
return done.promise;
|
|
||||||
}
|
|
||||||
|
|
||||||
let prefixName = (domainNameArg: string): string => {
|
|
||||||
return "_acme-challenge." + domainNameArg;
|
|
||||||
}
|
|
||||||
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: "deploy_challenge"
|
|
||||||
}).then((argv) => {
|
|
||||||
setChallenge(argv._[1], argv._[3]);
|
|
||||||
});
|
|
||||||
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: "clean_challenge"
|
|
||||||
}).then((argv) => {
|
|
||||||
cleanChallenge(argv._[1]);
|
|
||||||
});
|
|
||||||
|
|
||||||
smartcli.startParse();
|
|
@ -1,7 +1,9 @@
|
|||||||
import "typings-global";
|
import * as plugins from './cert.plugins'
|
||||||
import * as plugins from "./cert.plugins";
|
|
||||||
|
|
||||||
export let certHook = plugins.path.join(__dirname,"cert.hook.js");
|
// dirs
|
||||||
export let config = plugins.path.join(__dirname,"assets/config.json");
|
export let projectDir = plugins.path.join(__dirname,'../')
|
||||||
export let letsencryptSh = plugins.path.join(__dirname,"assets/letsencrypt.sh");
|
export let assetDir = plugins.path.join(projectDir,'assets')
|
||||||
export let sslDir = plugins.path.join(__dirname,"/assets/certs");
|
export let defaultSslDir = plugins.path.join(assetDir,'defaultSslDir')
|
||||||
|
export let leConfigDir = plugins.path.join(assetDir,'letsencrypt')
|
||||||
|
plugins.smartfile.fs.ensureDirSync(leConfigDir)
|
||||||
|
plugins.smartfile.fs.ensureDirSync(defaultSslDir)
|
||||||
|
@ -1,11 +1,26 @@
|
|||||||
import "typings-global";
|
import 'typings-global'
|
||||||
export import beautylog = require("beautylog");
|
import * as beautylog from 'beautylog'
|
||||||
export import cflare = require("cflare");
|
import * as cflare from 'cflare'
|
||||||
export let fs = require("fs-extra");
|
let fs = require('fs-extra')
|
||||||
export import path = require("path");
|
import * as lik from 'lik'
|
||||||
export let q = require("q");
|
import * as path from 'path'
|
||||||
export let shelljs = require("shelljs");
|
import * as q from 'q'
|
||||||
export import smartcli = require("smartcli");
|
import * as shelljs from 'shelljs'
|
||||||
export import smartfile = require("smartfile");
|
import * as smartcli from 'smartcli'
|
||||||
export import smartstring = require("smartstring");
|
import * as smartfile from 'smartfile'
|
||||||
|
import * as smartgit from 'smartgit'
|
||||||
|
import * as smartstring from 'smartstring'
|
||||||
|
|
||||||
|
export {
|
||||||
|
beautylog,
|
||||||
|
cflare,
|
||||||
|
fs,
|
||||||
|
lik,
|
||||||
|
path,
|
||||||
|
q,
|
||||||
|
shelljs,
|
||||||
|
smartcli,
|
||||||
|
smartfile,
|
||||||
|
smartgit,
|
||||||
|
smartstring
|
||||||
|
}
|
||||||
|
45
ts/index.ts
45
ts/index.ts
@ -1,44 +1 @@
|
|||||||
import * as plugins from "./cert.plugins";
|
export * from './cert.classes.cert'
|
||||||
import * as paths from "./cert.paths";
|
|
||||||
|
|
||||||
export class Cert {
|
|
||||||
cfEmail:string;
|
|
||||||
cfKey:string;
|
|
||||||
sslDir:string;
|
|
||||||
certificatesPresent;
|
|
||||||
certificatesValid;
|
|
||||||
gitOriginRepo;
|
|
||||||
constructor(optionsArg:{
|
|
||||||
cfEmail:string,
|
|
||||||
cfKey:string,
|
|
||||||
sslDir:string,
|
|
||||||
gitOriginRepo?:string
|
|
||||||
}){
|
|
||||||
this.cfEmail = optionsArg.cfEmail;
|
|
||||||
this.cfKey = optionsArg.cfKey;
|
|
||||||
this.sslDir = optionsArg.sslDir;
|
|
||||||
this.gitOriginRepo = optionsArg.gitOriginRepo;
|
|
||||||
let config = {
|
|
||||||
cfEmail: this.cfEmail,
|
|
||||||
cfKey: this.cfKey
|
|
||||||
}
|
|
||||||
plugins.smartfile.memory.toFsSync(JSON.stringify(config),{fileName:"config.json",filePath:plugins.path.join(__dirname,"assets/")});
|
|
||||||
};
|
|
||||||
getDomainCert(domainNameArg:string){
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
plugins.shelljs.exec("chmod 700 " + paths.letsencryptSh);
|
|
||||||
plugins.shelljs.exec("chmod 700 " + paths.certHook);
|
|
||||||
plugins.shelljs.exec("bash -c \"" + paths.letsencryptSh + " -c -d " + domainNameArg + " -t dns-01 -k " + paths.certHook + " -o "+ paths.sslDir + "\"");
|
|
||||||
done.resolve();
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export class Certificate {
|
|
||||||
domainName:string;
|
|
||||||
creationDate:Date;
|
|
||||||
expiryDate:Date;
|
|
||||||
constructor(){
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
import * as plugins from "./cert.plugins";
|
|
||||||
import * as paths from "./cert.paths";
|
|
||||||
|
|
||||||
export let startInstall = () => {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
plugins.beautylog.info("installing letsencrypt.sh locally...");
|
|
||||||
|
|
||||||
plugins.fs.ensureDir(plugins.path.join(__dirname, "assets/"));
|
|
||||||
plugins.smartfile.remote.toFs(
|
|
||||||
"https://raw.githubusercontent.com/lukas2511/letsencrypt.sh/master/letsencrypt.sh",
|
|
||||||
paths.letsencryptSh
|
|
||||||
).then(() => {
|
|
||||||
plugins.beautylog.success("Done!");
|
|
||||||
done.resolve();
|
|
||||||
});
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
let smartcli = new plugins.smartcli.Smartcli();
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName:"install"
|
|
||||||
}).then(startInstall);
|
|
||||||
smartcli.startParse();
|
|
Loading…
x
Reference in New Issue
Block a user