Compare commits

..

2 Commits

Author SHA1 Message Date
2adbf3b26f 0.0.7 2016-06-22 13:09:26 +02:00
68489fde52 now working 2016-06-22 13:09:18 +02:00
54 changed files with 1711 additions and 2941 deletions

7
.gitignore vendored
View File

@ -1,9 +1,4 @@
node_modules/
assets/
node_modules
docs/
public/
pages/
coverage/
.nogit/
dist/assets/
test/assets/

View File

@ -5,15 +5,10 @@ stages:
- test2
- release
before_script:
- npmci prepare ssh
testLTS:
stage: test1
stage: test
script:
- npmci test lts
only:
- tags
tags:
- docker
- lossless
@ -22,8 +17,6 @@ testSTABLE:
stage: test2
script:
- npmci test stable
only:
- tags
tags:
- docker
- lossless

View File

@ -1,22 +1,6 @@
# Cert
Easily obain SSL certificates from LetsEncrypt. Supports DNS-01 challenge. TypeScript ready.
## Availabililty
[![npm](https://push.rocks/assets/repo-button-npm.svg)](https://www.npmjs.com/package/cert)
[![git](https://push.rocks/assets/repo-button-git.svg)](https://gitlab.com/pushrocks/cert)
[![git](https://push.rocks/assets/repo-button-mirror.svg)](https://github.com/pushrocks/cert)
[![docs](https://push.rocks/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/cert/)
## Status for master
[![build status](https://gitlab.com/pushrocks/cert/badges/master/build.svg)](https://gitlab.com/pushrocks/cert/commits/master)
[![coverage report](https://gitlab.com/pushrocks/cert/badges/master/coverage.svg)](https://gitlab.com/pushrocks/cert/commits/master)
[![Dependency Status](https://david-dm.org/pushrocks/cert.svg)](https://david-dm.org/pushrocks/cert)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/cert/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/cert/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/cert/badges/code.svg)](https://www.bithound.io/github/pushrocks/cert)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Usage
```typescript
@ -29,17 +13,13 @@ let myCert = new Cert({
gitOriginRepo: "git@githhub.com/someuser/somereopo" // good for persistence in highly volatile environments like docker
});
myCert.getDomainCert("example.com"); // returns promise
myCert.getDomainCert("example.com");
```
> **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
### sslDir
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
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
@ -47,5 +27,3 @@ 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
Just make sure your id_rsa is in place for the node user and is allowed for the origin repo.
[![npm](https://push.rocks/assets/repo-header.svg)](https://push.rocks)

View File

@ -0,0 +1,51 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,12 @@
{
"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"
}

View File

@ -0,0 +1,27 @@
-----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-----

View File

@ -0,0 +1,34 @@
-----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 Symbolic link
View File

@ -0,0 +1 @@
cert-1466593547.csr

1
dist/assets/certs/sub2.bleu.de/cert.pem vendored Symbolic link
View File

@ -0,0 +1 @@
cert-1466593547.pem

View File

@ -0,0 +1,27 @@
-----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 Symbolic link
View File

@ -0,0 +1 @@
chain-1466593547.pem

View File

@ -0,0 +1,61 @@
-----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-----

View File

@ -0,0 +1 @@
fullchain-1466593547.pem

View File

@ -0,0 +1,51 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1 @@
privkey-1466593547.pem

1
dist/assets/config.json vendored Normal file
View File

@ -0,0 +1 @@
{"cfEmail":"sandbox@lossless.digital","cfKey":"5108a833dced8e8bd7186ae5833855b0dc138"}

1054
dist/assets/letsencrypt.sh vendored Executable file

File diff suppressed because it is too large Load Diff

View File

@ -1,43 +0,0 @@
/// <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;
}

View File

@ -1,75 +0,0 @@
"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

View File

@ -1,48 +0,0 @@
/// <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;
}

View File

@ -1,103 +0,0 @@
"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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

View File

@ -1,31 +0,0 @@
/// <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;
}

View File

@ -1,59 +0,0 @@
"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==

View File

@ -1,20 +0,0 @@
/// <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<{}>;
}

View File

@ -1,75 +0,0 @@
"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

View File

@ -1,26 +0,0 @@
/// <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();
}

File diff suppressed because one or more lines are too long

1
dist/cert.hook.d.ts vendored Normal file
View File

@ -0,0 +1 @@
import "typings-global";

51
dist/cert.hook.js vendored Executable file
View File

@ -0,0 +1,51 @@
#!/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==

View File

@ -1,4 +1,5 @@
export declare let projectDir: string;
export declare let assetDir: string;
export declare let defaultSslDir: string;
export declare let leConfigDir: string;
import "typings-global";
export declare let certHook: string;
export declare let config: string;
export declare let letsencryptSh: string;
export declare let sslDir: string;

17
dist/cert.paths.js vendored
View File

@ -1,10 +1,9 @@
"use strict";
const plugins = require("./cert.plugins");
// dirs
exports.projectDir = plugins.path.join(__dirname, '../');
exports.assetDir = plugins.path.join(exports.projectDir, 'assets');
exports.defaultSslDir = plugins.path.join(exports.assetDir, 'defaultSslDir');
exports.leConfigDir = plugins.path.join(exports.assetDir, 'letsencrypt');
plugins.smartfile.fs.ensureDirSync(exports.leConfigDir);
plugins.smartfile.fs.ensureDirSync(exports.defaultSslDir);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC5wYXRocy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NlcnQucGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBDQUF5QztBQUV6QyxPQUFPO0FBQ0ksUUFBQSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLEtBQUssQ0FBQyxDQUFBO0FBQy9DLFFBQUEsUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFVLEVBQUMsUUFBUSxDQUFDLENBQUE7QUFDakQsUUFBQSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQVEsRUFBQyxlQUFlLENBQUMsQ0FBQTtBQUMzRCxRQUFBLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBUSxFQUFDLGFBQWEsQ0FBQyxDQUFBO0FBQ2xFLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxtQkFBVyxDQUFDLENBQUE7QUFDL0MsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLHFCQUFhLENBQUMsQ0FBQSJ9
require("typings-global");
var plugins = require("./cert.plugins");
exports.certHook = plugins.path.join(__dirname, "cert.hook.js");
exports.config = plugins.path.join(__dirname, "assets/config.json");
exports.letsencryptSh = plugins.path.join(__dirname, "assets/letsencrypt.sh");
exports.sslDir = plugins.path.join(__dirname, "/assets/certs");
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNlcnQucGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sZ0JBQWdCLENBQUMsQ0FBQTtBQUN4QixJQUFZLE9BQU8sV0FBTSxnQkFBZ0IsQ0FBQyxDQUFBO0FBRS9CLGdCQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZELGNBQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUMzRCxxQkFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3JFLGNBQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsZUFBZSxDQUFDLENBQUMiLCJmaWxlIjoiY2VydC5wYXRocy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCI7XG5pbXBvcnQgKiBhcyBwbHVnaW5zIGZyb20gXCIuL2NlcnQucGx1Z2luc1wiO1xuXG5leHBvcnQgbGV0IGNlcnRIb29rID0gcGx1Z2lucy5wYXRoLmpvaW4oX19kaXJuYW1lLFwiY2VydC5ob29rLmpzXCIpO1xuZXhwb3J0IGxldCBjb25maWcgPSBwbHVnaW5zLnBhdGguam9pbihfX2Rpcm5hbWUsXCJhc3NldHMvY29uZmlnLmpzb25cIik7XG5leHBvcnQgbGV0IGxldHNlbmNyeXB0U2ggPSBwbHVnaW5zLnBhdGguam9pbihfX2Rpcm5hbWUsXCJhc3NldHMvbGV0c2VuY3J5cHQuc2hcIik7XG5leHBvcnQgbGV0IHNzbERpciA9IHBsdWdpbnMucGF0aC5qb2luKF9fZGlybmFtZSxcIi9hc3NldHMvY2VydHNcIik7Il19

View File

@ -1,13 +1,10 @@
import 'typings-global';
import * as beautylog from 'beautylog';
import * as cflare from 'cflare';
declare let fs: any;
import * as lik from 'lik';
import * as path from 'path';
import * as q from 'q';
import * as shelljs from 'shelljs';
import * as smartcli from 'smartcli';
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 };
import "typings-global";
export import beautylog = require("beautylog");
export import cflare = require("cflare");
export declare let fs: any;
export import path = require("path");
export declare let q: any;
export declare let shelljs: any;
export import smartcli = require("smartcli");
export import smartfile = require("smartfile");
export import smartstring = require("smartstring");

34
dist/cert.plugins.js vendored
View File

@ -1,25 +1,13 @@
"use strict";
require("typings-global");
const beautylog = require("beautylog");
exports.beautylog = beautylog;
const cflare = require("cflare");
exports.cflare = cflare;
let fs = require('fs-extra');
exports.fs = fs;
const lik = require("lik");
exports.lik = lik;
const path = require("path");
exports.path = path;
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==
exports.beautylog = require("beautylog");
exports.cflare = require("cflare");
exports.fs = require("fs-extra");
exports.path = require("path");
exports.q = require("q");
exports.shelljs = require("shelljs");
exports.smartcli = require("smartcli");
exports.smartfile = require("smartfile");
exports.smartstring = require("smartstring");
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNlcnQucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsUUFBTyxnQkFBZ0IsQ0FBQyxDQUFBO0FBQ1YsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNqQyxjQUFNLFdBQVcsUUFBUSxDQUFDLENBQUM7QUFDOUIsVUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0QixZQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDMUIsU0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixlQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzFCLGdCQUFRLFdBQVcsVUFBVSxDQUFDLENBQUM7QUFDL0IsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNqQyxtQkFBVyxXQUFXLGFBQWEsQ0FBQyxDQUFDIiwiZmlsZSI6ImNlcnQucGx1Z2lucy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCI7XG5leHBvcnQgaW1wb3J0IGJlYXV0eWxvZyA9IHJlcXVpcmUoXCJiZWF1dHlsb2dcIik7XG5leHBvcnQgaW1wb3J0IGNmbGFyZSA9IHJlcXVpcmUoXCJjZmxhcmVcIik7XG5leHBvcnQgbGV0IGZzID0gcmVxdWlyZShcImZzLWV4dHJhXCIpO1xuZXhwb3J0IGltcG9ydCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5leHBvcnQgbGV0IHEgPSByZXF1aXJlKFwicVwiKTtcbmV4cG9ydCBsZXQgc2hlbGxqcyA9IHJlcXVpcmUoXCJzaGVsbGpzXCIpO1xuZXhwb3J0IGltcG9ydCBzbWFydGNsaSA9IHJlcXVpcmUoXCJzbWFydGNsaVwiKTtcbmV4cG9ydCBpbXBvcnQgc21hcnRmaWxlID0gcmVxdWlyZShcInNtYXJ0ZmlsZVwiKTtcbmV4cG9ydCBpbXBvcnQgc21hcnRzdHJpbmcgPSByZXF1aXJlKFwic21hcnRzdHJpbmdcIik7XG5cbiJdfQ==

22
dist/index.d.ts vendored
View File

@ -1 +1,21 @@
export * from './cert.classes.cert';
export declare class 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
View File

@ -1,6 +1,36 @@
"use strict";
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
var plugins = require("./cert.plugins");
var paths = require("./cert.paths");
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"));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEseUNBQW1DIn0=
;
Cert.prototype.getDomainCert = function (domainNameArg) {
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 Normal file
View File

@ -0,0 +1 @@
export declare let startInstall: () => any;

20
dist/install.js vendored Normal file
View File

@ -0,0 +1,20 @@
"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

View File

@ -1,5 +0,0 @@
{
"npmts": {
"mode": "default"
}
}

View File

@ -1,13 +1,11 @@
{
"name": "cert",
"version": "1.0.8",
"version": "0.0.7",
"description": "Easily obain SSL certificates from LetsEncrypt. Supports DNS-01 challenge. TypeScript ready.",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"scripts": {
"test": "(npm run cleanTest && npmts --nodocs)",
"cleanTest": "(rm -rf ./test/assets)",
"compile": "(npmts --notest)"
"test": "(npmts)",
"install": "node dist/install.js install"
},
"repository": {
"type": "git",
@ -26,25 +24,22 @@
},
"homepage": "https://gitlab.com/pushrocks/cert#readme",
"dependencies": {
"@types/minimatch": "2.x.x",
"@types/q": "0.0.32",
"beautylog": "^6.0.0",
"cflare": "0.0.10",
"fs-extra": "^1.0.0",
"lik": "^1.0.27",
"beautylog": "^5.0.12",
"cflare": "0.0.7",
"fs-extra": "^0.30.0",
"letsencrypt": "^1.4.4",
"q": "^1.4.1",
"smartacme": "^1.0.2",
"smartcli": "^2.0.1",
"smartfile": "^4.1.1",
"smartgit": "1.0.5",
"smartstring": "^2.0.22",
"typings-global": "^1.0.14"
"shelljs": "^0.7.0",
"smartcli": "^1.0.4",
"smartfile": "^3.0.10",
"smartgit": "0.0.10",
"smartstring": "^2.0.10",
"typings-global": "^1.0.3"
},
"devDependencies": {
"@types/should": "^8.1.30",
"npmts-g": "^5.2.10",
"qenv": "^1.1.1",
"should": "^11.1.2",
"typings-test": "^1.0.3"
"npmts-g": "^5.2.6",
"qenv": "^1.0.8",
"should": "^9.0.2",
"typings-test": "^1.0.1"
}
}

1656
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

3
test/test.d.ts vendored
View File

@ -1 +1,2 @@
import 'typings-test';
import "typings-test";
import "should";

View File

@ -1,43 +1,36 @@
"use strict";
require("typings-test");
const should = require("should");
const qenv_1 = require("qenv");
const path = require("path");
const q = require("q");
const cert = require("../dist/index");
let testQenv = new qenv_1.Qenv(process.cwd(), process.cwd() + '/.nogit');
let testCert;
describe('cert', function () {
describe('Cert', function () {
it('should create a new Cert object from class', function () {
require("should");
var qenv_1 = require("qenv");
var install_1 = require("../dist/install");
var cert = require("../dist/index");
var testQenv = new qenv_1.Qenv(process.cwd(), process.cwd() + "/.nogit");
var testCert;
describe("cert", function () {
describe("install", function () {
it("should download letsencrypt.sh", function (done) {
this.timeout(5000);
install_1.startInstall().then(function () {
done();
});
});
});
describe("Cert", function () {
it("should create a new cert", function () {
testCert = new cert.Cert({
cfEmail: process.env.CF_EMAIL,
cfKey: process.env.CF_KEY,
sslDirPath: path.join(process.cwd(), 'test/assets'),
gitOriginRepo: 'git@gitlab.com:sandboxzone/sandbox-sslorigin.git',
leEnv: 'staging'
sslDir: ""
});
should(testCert).be.instanceof(cert.Cert);
testCert.should.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(() => {
it("should get a valid certificate", function (done) {
this.timeout(120000);
testCert.getDomainCert("sub2.bleu.de").then(function () {
done();
});
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFDaEMsK0JBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qix1QkFBdUI7QUFDdkIsc0NBQXFDO0FBR3JDLElBQUksUUFBUSxHQUFHLElBQUksV0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUE7QUFFakUsSUFBSSxRQUFtQixDQUFBO0FBRXZCLFFBQVEsQ0FBQyxNQUFNLEVBQUM7SUFDWixRQUFRLENBQUMsTUFBTSxFQUFDO1FBQ1osRUFBRSxDQUFDLDRDQUE0QyxFQUFDO1lBQzVDLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7Z0JBQzdCLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU07Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBQyxhQUFhLENBQUM7Z0JBQ2xELGFBQWEsRUFBRSxrREFBa0Q7Z0JBQ2pFLEtBQUssRUFBRSxTQUFTO2FBQ25CLENBQUMsQ0FBQTtZQUNGLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM3QyxDQUFDLENBQUMsQ0FBQTtRQUNGLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxVQUFTLElBQUk7WUFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNuQixRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO2dCQUNsQixJQUFJLEVBQUUsQ0FBQTtZQUNWLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFDLENBQUE7UUFDRixFQUFFLENBQUMsZ0NBQWdDLEVBQUMsVUFBUyxJQUFJO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDckIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFBO1lBQ3JCLDRCQUE0QixHQUFHLEVBQUUsR0FBRztnQkFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFBO1lBQ3hELENBQUM7WUFDRCxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsVUFBVSxrQkFBa0IsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7WUFDNUYsK0ZBQStGO1lBQy9GLCtGQUErRjtZQUMvRixDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDckIsSUFBSSxFQUFFLENBQUE7WUFDVixDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFDdEIsUUFBTyxRQUFRLENBQUMsQ0FBQTtBQUNoQixxQkFBbUIsTUFBTSxDQUFDLENBQUE7QUFFMUIsd0JBQTJCLGlCQUFpQixDQUFDLENBQUE7QUFDN0MsSUFBWSxJQUFJLFdBQU0sZUFBZSxDQUFDLENBQUE7QUFHdEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxXQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUVsRSxJQUFJLFFBQWtCLENBQUM7QUFFdkIsUUFBUSxDQUFDLE1BQU0sRUFBQztJQUNaLFFBQVEsQ0FBQyxTQUFTLEVBQUM7UUFDZixFQUFFLENBQUMsZ0NBQWdDLEVBQUMsVUFBUyxJQUFJO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsc0JBQVksRUFBRSxDQUFDLElBQUksQ0FBQztnQkFDaEIsSUFBSSxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsTUFBTSxFQUFDO1FBQ1osRUFBRSxDQUFDLDBCQUEwQixFQUFDO1lBQzFCLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7Z0JBQzdCLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU07Z0JBQ3pCLE1BQU0sRUFBRSxFQUFFO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQTtRQUNGLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBQyxVQUFTLElBQUk7WUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQixRQUFRLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDeEMsSUFBSSxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQyIsImZpbGUiOiJ0ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy10ZXN0XCI7XG5pbXBvcnQgXCJzaG91bGRcIjtcbmltcG9ydCB7UWVudn0gZnJvbSBcInFlbnZcIjtcblxuaW1wb3J0IHtzdGFydEluc3RhbGx9IGZyb20gXCIuLi9kaXN0L2luc3RhbGxcIjtcbmltcG9ydCAqIGFzIGNlcnQgZnJvbSBcIi4uL2Rpc3QvaW5kZXhcIjtcblxuXG5sZXQgdGVzdFFlbnYgPSBuZXcgUWVudihwcm9jZXNzLmN3ZCgpLCBwcm9jZXNzLmN3ZCgpICsgXCIvLm5vZ2l0XCIpO1xuXG5sZXQgdGVzdENlcnQ6Y2VydC5DZXJ0O1xuXG5kZXNjcmliZShcImNlcnRcIixmdW5jdGlvbigpe1xuICAgIGRlc2NyaWJlKFwiaW5zdGFsbFwiLGZ1bmN0aW9uKCl7XG4gICAgICAgIGl0KFwic2hvdWxkIGRvd25sb2FkIGxldHNlbmNyeXB0LnNoXCIsZnVuY3Rpb24oZG9uZSl7XG4gICAgICAgICAgICB0aGlzLnRpbWVvdXQoNTAwMCk7XG4gICAgICAgICAgICBzdGFydEluc3RhbGwoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgZGVzY3JpYmUoXCJDZXJ0XCIsZnVuY3Rpb24oKXtcbiAgICAgICAgaXQoXCJzaG91bGQgY3JlYXRlIGEgbmV3IGNlcnRcIixmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGVzdENlcnQgPSBuZXcgY2VydC5DZXJ0KHtcbiAgICAgICAgICAgICAgICBjZkVtYWlsOiBwcm9jZXNzLmVudi5DRl9FTUFJTCxcbiAgICAgICAgICAgICAgICBjZktleTogcHJvY2Vzcy5lbnYuQ0ZfS0VZLFxuICAgICAgICAgICAgICAgIHNzbERpcjogXCJcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0ZXN0Q2VydC5zaG91bGQuYmUuaW5zdGFuY2VvZihjZXJ0LkNlcnQpO1xuICAgICAgICB9KVxuICAgICAgICBpdChcInNob3VsZCBnZXQgYSB2YWxpZCBjZXJ0aWZpY2F0ZVwiLGZ1bmN0aW9uKGRvbmUpe1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0KDEyMDAwMCk7XG4gICAgICAgICAgICB0ZXN0Q2VydC5nZXREb21haW5DZXJ0KFwic3ViMi5ibGV1LmRlXCIpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH0pXG59KTsiXX0=

View File

@ -1,45 +1,38 @@
import 'typings-test'
import * as should from 'should'
import {Qenv} from 'qenv'
import path = require('path')
import q = require('q')
import * as cert from '../dist/index'
import "typings-test";
import "should";
import {Qenv} from "qenv";
import {startInstall} from "../dist/install";
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(){
it('should create a new Cert object from class',function(){
describe("cert",function(){
describe("install",function(){
it("should download letsencrypt.sh",function(done){
this.timeout(5000);
startInstall().then(() => {
done();
})
})
})
describe("Cert",function(){
it("should create a new cert",function(){
testCert = new cert.Cert({
cfEmail: process.env.CF_EMAIL,
cfKey: process.env.CF_KEY,
sslDirPath: path.join(process.cwd(),'test/assets'),
gitOriginRepo: 'git@gitlab.com:sandboxzone/sandbox-sslorigin.git',
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()
})
sslDir: ""
});
testCert.should.be.instanceof(cert.Cert);
})
it("should get a valid certificate",function(done){
this.timeout(120000);
testCert.getDomainCert("sub2.bleu.de").then(() => {
done();
});
})
})
});

View File

@ -1,98 +0,0 @@
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() {
}
}

View File

@ -1,129 +0,0 @@
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() { }
}

View File

@ -1,77 +0,0 @@
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')
}
}
}

View File

@ -1,84 +0,0 @@
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
}

View File

@ -1,48 +0,0 @@
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
}
}

58
ts/cert.hook.ts Normal file
View File

@ -0,0 +1,58 @@
#!/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();

View File

@ -1,9 +1,7 @@
import * as plugins from './cert.plugins'
import "typings-global";
import * as plugins from "./cert.plugins";
// dirs
export let projectDir = plugins.path.join(__dirname,'../')
export let assetDir = plugins.path.join(projectDir,'assets')
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)
export let certHook = plugins.path.join(__dirname,"cert.hook.js");
export let config = plugins.path.join(__dirname,"assets/config.json");
export let letsencryptSh = plugins.path.join(__dirname,"assets/letsencrypt.sh");
export let sslDir = plugins.path.join(__dirname,"/assets/certs");

View File

@ -1,26 +1,11 @@
import 'typings-global'
import * as beautylog from 'beautylog'
import * as cflare from 'cflare'
let fs = require('fs-extra')
import * as lik from 'lik'
import * as path from 'path'
import * as q from 'q'
import * as shelljs from 'shelljs'
import * as smartcli from 'smartcli'
import * as smartfile from 'smartfile'
import * as smartgit from 'smartgit'
import * as smartstring from 'smartstring'
import "typings-global";
export import beautylog = require("beautylog");
export import cflare = require("cflare");
export let fs = require("fs-extra");
export import path = require("path");
export let q = require("q");
export let shelljs = require("shelljs");
export import smartcli = require("smartcli");
export import smartfile = require("smartfile");
export import smartstring = require("smartstring");
export {
beautylog,
cflare,
fs,
lik,
path,
q,
shelljs,
smartcli,
smartfile,
smartgit,
smartstring
}

View File

@ -1 +1,44 @@
export * from './cert.classes.cert'
import * as plugins from "./cert.plugins";
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(){
};
}

23
ts/install.ts Normal file
View File

@ -0,0 +1,23 @@
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();

View File

@ -1,3 +0,0 @@
helpers.updateSslDirSync(this._sslDir, domainNameArg)
helpers.scheduleRetry(domainNameArg, this).then(done.resolve)
this.domainCertRequestMap.removeString(domainNameArg)