first commit

This commit is contained in:
franv 2020-08-13 12:04:06 -07:00
commit e99677c375
17054 changed files with 2676651 additions and 0 deletions

View File

@ -0,0 +1 @@
{"n": "0CZhC6bjwv-TtxEDRl-CGEnve4l-JD-RiwRZYdGjpXJrR-bxeoDiltL8w13ZXqQHGioP7b3G29-J9bMrlH9yqipvukorqZCaKahFUhOWWEvFPW9Kol5bD4-vrXqUvriORHcKIcxb2BIZww1hjzGuzMXdOIc2iX_AG5OOIoM59Q4QY93WluJ76MlCO-9aBQo4Ai0FEHSNF-kX4cG0Y66xWkjW-juaPJt_vFRiHQttJQ1hfYLQaV125z0zbk8AKEz5KHvBWjez2LlENvHn0O3wFSLuDrJgqo8UjH4cHCphCJT2VhcwZvtKcOuKL7oZRYwN_kYF-nN7AJ2vXBeccoPNQ4lx0D4dJJdrQ4ec7D_5775Y8A3SOcKTYHQZM5mhVeNjZlR6OHDE3nENdPvEGS-zirWEAD7394UGJFtShRGV7T7EdcOezUwiRPv2ULQF1icZsm6uPrPKE56NqoK7KFYj1tPVKffAtIAMuhF8qY3715zX7iV3o2Oz7wWJU7nVT3OMPGOTSHn4LTubLjNpx75nZEKSiDm4qVOsHhkhD7rjckQSkG_k3KHyI7CTB5v8CA-Map2jaqQKr6XnLMJAa78VGNQQhqJnRN7p0nR6fqZwkoLeqY_1-XgQ3SY_DBVxMS56Fws9Lu4HnLOiIX2525HUx6CFUj66RJ2rm_sONCH3SEk", "e": "AQAB", "d": "E5FYFDFXPhCqwU3_IdF-uGvS8KknS58SPqBlCrYbjUUpYrQKRXryUj15d6BN_ACtjj8gCjiKBkeIf6mdUjN9AxRENp4cZq9qXror8iBXROuymijpOkRmiRr35_YbH6bX8QXD1ROSGsjw1Q5f-ocwKJ39QwArF1gEJlODzCjL_Qaacdj8AGlAPs0Uxe-lZc3lIAc9b6OVVAccsKN2ItzcXWF1nEaYJFR1-K1yH8rgMtiELrlqgE1CDVEKkbcpi6BY1_5yWdnctWYNTKEHKvQDWulSudz5C2-x_dcpK1iskJL4aXV6nmPHRsBN2FjFYW1eL2ZDz5yllpQ8VQr_MSDE3gYVcd6BCpGiasDjXtEvl9GhxRL-LaI8zZv5k3O2JDBG9tGws-bbHq7mqaT8Ei8j5DDsTzl0PJ5GdSj9h9kjh-H5zf6KTGGLHN3GPeki_1DWdlUfreKt6G9dnfFiwI6tF_OGLXVRjgfLl5I4ttsMVMzxihEbC93SUzzJaDuEUWS0KTrQxI94Nj3HxVWpdluszTv0PR6BTAKhz2KhDrhb8b6hVt6v_bFIdqDQPUyfBcIcft6-59hzHwcXuk8uvJgto28RI_d4GW05xfsYO4VogWbmvqGlWz8sroQyQwjnSiEiqG-VWkS8flouF7ULrMEWyoOLFdhaaCq7ef2liFllZYE", "p": "7XJSjNAJrknKkOQVFllgbv-aDTMyLjcZy7LEbeOrzKP743Kcr1zOlRut_4M-134EJp3knDjxQpalmR0t9b952W78jtHNQRWJJR6NwiS1fJJXymIz3Nm3WCQT1zQVBKrb2wo0TBn0uDS9dDB4QZ6XJBEktLjhxcMudzx9PpHRZtTVJWgmi-mxw__qHa0hJkQ48WgZM3UYi2mzkJ4-OvWl78MVIyotY6C8R50RKDNXBapKBGgrB7czneBk-HrLtP7KpeLlaONirYTsMFJjXGgKm4F09nJxK2s-fgtouPtl03KBGAsq15o_zAVBvV4JkiEsVu6vHe72dP6bxx4WrZLFeQ", "q": "4GoID9XD_3x0YWFNpRoOiCrPbSTMzuN92QIHEmlG7drAt5q354Is8clIhEOL-CNv1k4wVpq0jC_HP2qdwqbqK8w6vV551ndhQt9ri7_IyohiwvYyNzkHlNF_HC_cXn4l88J73KPovG7DPUKCAGZmRbyl2Glzq-TTCq3cOAKXpQWbOZkQDYVKZR2ROnogKzlHSp9bbDbplMjLKgus1XTLmV2r6gIYm23JlczyTYsDWNIsGS2tlU4lYx4y6YP7lNGNrwGVZg5L7bK3m_JQKGq5tRSXrympGmn24FjmgHjThgtif7tkW_P8mfnJzm3HabgHDwRmka39YGlTF-kNK1r1UQ", "dp": "HKIfoElqEXFmkwheHp7SiTAbhKH62CXe33iERXgh_IB93JSynlcDtmlrFxfdmSDiIUIDEm-vcEc4Wvlw1GStrfG7VQGpzcJqEmbX02SX2hjPq2EiPeynNmLLXbUzH6f28TgOzGqI3znE6uD5b3hPY5MJqR1uZGnADbLmq4fsB4l81pDzrQWWYTtYIRICoFmzwDC8cT8aoZ0ygSsD-BotU3dj8iSg6pW0frJLIlzmjpFVcaiaH8kQ2WX45xnvvLjI-S4eWgKpoKEZ1k3pG3iUZuI6l4l_aiv5kjuP-laeldwGAz89gFhifxjXL53Ka6vCbA1GYsaxQ7R8VoujUnUTiQ", "dq": "mGYpV2eaFPSVrFQCAK8zUzGPb9Vf6NgA7NA9sTkhXAIEgitl3KhAkWpZ_shIU5jtKCItHYMuPU1tCBoFTN1BhcDJ2zQ_lW-480r6pAr39uKr_y5mZ64pAd1Lbv7prpoIeAOJTgtZ0C2AFSgHVPI1XgKAtfjW_tMEpunu9XJ9PSoTggf6KNRt80EjEQ1Cr1fUnE6gLVsVQV8i6UjIdKU-ZsaAKwiFYXgrP7nQiuxut3DzVZ35lb1eEnO9q2tf_G5aw5BVvtrSoXeOzS6_VNM1jk2PvPqTxkZTy4NT9ccYDp3IpGnD-9YzovVJIRDYLWk2EfKxHRmFSmX8ce5obRr2IQ", "qi": "B2mgbn4WBBjKpxKd989jvjNbJ3wwJybPKvdDJ-3XgpbJ-PiXCd8xm_N1kWtvVd_2NVl6vug0kLKVShSyH4y7gY5E4B34u3rbM1sgwP2Se2IvMQjWiMSCtgGiEV3wVSLbdWTueoGpT58-OH_rxJFUR3ox08PpyhFS0Lz2o9YELBXzPdE58zFpHySu8PYsb3j5N_r5_Fr98xJcSEXzi2MnrobPF-xWu2bmIbqYZ_mIIUvqFokfdm-8hHQy492qxVCPC5NV5TRJf6YIm5QsxglwH131LSy9jrEaVhhshjTzY34ZLRCDig_JXhYZiw8_8ZPE89KpROS8ag__05ra4aod6g", "kty": "RSA"}

View File

@ -0,0 +1 @@
{"body": {"key": {"n": "0CZhC6bjwv-TtxEDRl-CGEnve4l-JD-RiwRZYdGjpXJrR-bxeoDiltL8w13ZXqQHGioP7b3G29-J9bMrlH9yqipvukorqZCaKahFUhOWWEvFPW9Kol5bD4-vrXqUvriORHcKIcxb2BIZww1hjzGuzMXdOIc2iX_AG5OOIoM59Q4QY93WluJ76MlCO-9aBQo4Ai0FEHSNF-kX4cG0Y66xWkjW-juaPJt_vFRiHQttJQ1hfYLQaV125z0zbk8AKEz5KHvBWjez2LlENvHn0O3wFSLuDrJgqo8UjH4cHCphCJT2VhcwZvtKcOuKL7oZRYwN_kYF-nN7AJ2vXBeccoPNQ4lx0D4dJJdrQ4ec7D_5775Y8A3SOcKTYHQZM5mhVeNjZlR6OHDE3nENdPvEGS-zirWEAD7394UGJFtShRGV7T7EdcOezUwiRPv2ULQF1icZsm6uPrPKE56NqoK7KFYj1tPVKffAtIAMuhF8qY3715zX7iV3o2Oz7wWJU7nVT3OMPGOTSHn4LTubLjNpx75nZEKSiDm4qVOsHhkhD7rjckQSkG_k3KHyI7CTB5v8CA-Map2jaqQKr6XnLMJAa78VGNQQhqJnRN7p0nR6fqZwkoLeqY_1-XgQ3SY_DBVxMS56Fws9Lu4HnLOiIX2525HUx6CFUj66RJ2rm_sONCH3SEk", "e": "AQAB", "kty": "RSA"}, "contact": ["mailto:ouch@thetrauma.org"], "status": "valid"}, "uri": "https://acme-v02.api.letsencrypt.org/acme/acct/93765291", "terms_of_service": "https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf"}

30
certs/default.crt Normal file
View File

@ -0,0 +1,30 @@
-----BEGIN CERTIFICATE-----
MIIFOTCCAyGgAwIBAgIUc7DbV74VZ/fbTdH4Ush3ssUZT2QwDQYJKoZIhvcNAQEL
BQAwLDEqMCgGA1UEAwwhbGV0c2VuY3J5cHQtbmdpbngtcHJveHktY29tcGFuaW9u
MB4XDTIwMDgxMjE3MzkwN1oXDTIxMDgxMjE3MzkwN1owLDEqMCgGA1UEAwwhbGV0
c2VuY3J5cHQtbmdpbngtcHJveHktY29tcGFuaW9uMIICIjANBgkqhkiG9w0BAQEF
AAOCAg8AMIICCgKCAgEAz8OVzeuX+USCAfqZYa6rNq3EQ7gTampX1UxqvBSlHf8B
fSj6AIvvnvESFZ5RoCDkoDT6/YhdqNVI5pIVePiHz5TNTo6ZnysDDDhdUDvVXM2S
l8Y4ASzPp3tipKoqkuQLx2toSFLM7qJWgXapVB8cr6Gr9vOEv6JvlEgKuE/j1Sz5
Nr0txy14Mb2rMgYIX6qhmNdfRgLE1TPsoGqm8u/bfakgzUCiLT5q4t3cawIdWUzV
RToBmB2Qon1/txuL/7EpZnegl+h3/ON/b9aH4iWr5oBzHut7eEzz4Lk/U3cqx3zx
Z2mec4JcUbbczoJs1MauISfg+GslIZ8DnJWZqWIba07k1GDfyJkQg0dS6uz/MB76
8cDtmTXvXdij5TTz2LWSDNQ0TvXF8sj5leLJ6M24cNFMBPdW2ROcVDaIy8LUe7fQ
2aUnBaR2DO4l/iEyoj2yuiA/W/bL3pTxE5cCgHgS16lBONSnSTZRqDVKVDWq0PdU
uuMxwgvL6T89+vW79AQzfVQyzjK6cWurvYGeOYsn7WLXeE4Tc2EPdf3FrkaY4RaF
cZXReZ2AVrcEM7OuSVEuyoZ3OpHYw3Scppu86HhaXXCLry1cytqMpfEINxnok7mB
nKIGoLxZ844P06nq1BQKsufFHIi3nVIWAKFN606clwYbyXKq1CRRvfsDDaSi6d8C
AwEAAaNTMFEwHQYDVR0OBBYEFJebfZzgj5Jv4vUnRLRr2na/pwrFMB8GA1UdIwQY
MBaAFJebfZzgj5Jv4vUnRLRr2na/pwrFMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
hvcNAQELBQADggIBAGthz2srMKsDQGxuPh353wv7CVp6I032rzb52kXHNCWvTuFn
01lylmz5hVZoaITZWmRe/kvuMFek1PbS4KJspM+cKx96YUXJCj3T4Vr4/pPLjtPJ
bTLzXqPzVas4esC609ALRNC/38mmmfb1JktO0TipUPLRKx3KUZsCnAAmB5l1Ztus
wsSOlGMRODKcb20AYA7n6/QV/B2ps0akkpCBT/zQ3qPt9Hf7LGiWaubZRB0bmuND
gr8Yk++uehzs2JX3wM3gK+GCpfBYCi2X8nEVA4KJp79JHLDIDRxEnCWsLXK7CvMr
tiPGrIL2QYFWA2is9Hq2gMlR5XP41Cw9KbTTNo+jgFDrhrso8xpSCNYz9zwZ61EW
yyqcC1/+EAf+kkGj2OYReFh9q6OufEPiJbwLafWf2Ye5JlwitbRiuMT9oQN3cqsH
Bfv+p1qfAf06lyavOCfSmmXfFp1t/c34r3pZxP64VwQ2hXWVTX+6ThqzGxLWcIHX
2aVo3W3nGRygb03pUgaprJzDKXnaH5Nmdkko+9KF9bn7uSR5D5fZeiGnxWJdSC2C
DutDnp6aOXAh1rEGakGx2jTsz/6NxwQM4d/6jmWtWfrlE1rVRr7Cj21Aua3CgxV9
ArfvVfRR6ZYZqSd49S7aR6WRUmEGvyB0d+Mm8eJmA6X+SH8zHieaWY2dcO0r
-----END CERTIFICATE-----

52
certs/default.key Normal file
View File

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
RhUlTHQlzbjGbDKVa/y8pIPu3pTm1g==
-----END PRIVATE KEY-----

8
certs/dhparam.pem Normal file
View File

@ -0,0 +1,8 @@
-----BEGIN DH PARAMETERS-----
MIIBCAKCAQEAriPOFT9XbeOvk44sMGTrx0Ipf+R+6UW4dfCthNY1UaMVA+23lYig
Z0iWJ4H3Oy9Zds0i1T2k40iWd6JJ/5bK5UNE8yYEVLawf4S+zw3/lx/JG2hY1K64
NwGsqVkcA5EX801T1iv7Gdv/1E6UccHw5Ycb4EcKnl9taEbQXiAD4C9u4fdsAkvf
2Walpagc6vURpdFYHp+F4t/3t0f6IL6k/BJ2vAJlZ+KfLbn2INGCM8qkZ0YW3FaF
FgSpz7rY4kWYL2cnU1l7vcIapIRugxpKV7IOdtY9mZxdah1O9OWoxBZV9l1mdUlZ
a1SgbUw8Q5g7bv3A3u8jq19JoE/hwOUg0wIBAg==
-----END DH PARAMETERS-----

View File

@ -0,0 +1 @@
./git.airdog.site/chain.pem

1
certs/git.airdog.site.crt Symbolic link
View File

@ -0,0 +1 @@
./git.airdog.site/fullchain.pem

View File

@ -0,0 +1 @@
./dhparam.pem

1
certs/git.airdog.site.key Symbolic link
View File

@ -0,0 +1 @@
./git.airdog.site/key.pem

View File

View File

@ -0,0 +1 @@
../accounts/acme-v02.api.letsencrypt.org/directory/default_key.json

View File

@ -0,0 +1 @@
../accounts/acme-v02.api.letsencrypt.org/directory/default_reg.json

View File

@ -0,0 +1,36 @@
-----BEGIN CERTIFICATE-----
MIIGVTCCBT2gAwIBAgISBJKdTX/9sW9DJmxpPCoECsUgMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA4MTMxNTM1MDhaFw0y
MDExMTExNTM1MDhaMBoxGDAWBgNVBAMTD2dpdC5haXJkb2cuc2l0ZTCCAiIwDQYJ
KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMwq0ClselXF04EK3DLxShI8BkBOD/WA
XWi7ECKYlzlXEPrafMK9p8ll2N7quSegycHW2j7Q7gvrPF81t4oRDMpYIOZQWpKr
r+chzdDnZP/hk7JxMB0Yi2XMH5ozNhtxZ9AgMgp/UzCoiiK2624AiKTwnS7/N2UE
FEOmLTXrHn0gmbI6oW/T0R1DUpqMMxL1QeDLS5SN77ZjDtLwZgGwt0cRJbv25wxE
n+9uIhLKoVOeFiw7UdGTRGVqQrNVCPqeZ7c/lVpjUHF1eJXGTl32XsSs3j+89Xv1
J9w+L0aUMubE6IIy9NmOJoOKZmwaaWq43noclNvapMO4CTAv0/xI5SLgFCve1vnL
5fKZb7I4AS0aFguCg6F2iQT6KU47v+9kl+9filrwmyoLGyqJ402Ufa1hdKC8B8+J
ZFhWcTUYNJ5OZK9sgZmCSIBfBF9gy+hXKgYDyBfqut1gh/WQO8CNS66MgMayrF/n
A4UW4GnXUTg7LBi7e4l9ULV6dnBLEf7qO0Eg/fQj8oXPRqoc42h+mhoIk8CFATy2
a64a4ZU9lZ/QwzuJkj54E+UurTxKr0PwZoUqZ3+s3FbLrOc/VBly7sWGxPxVLRjM
Lp9CV6+eFnVtRdhmaSqZf8ewbLo/MHa+UJ3nk2OKr6aGkAIqBpSuo6K46sFyODVX
aNCNDgNbDsWHAgMBAAGjggJjMIICXzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw
FAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCFM
gP4KSDEe/hFUyBwDlMfn7BdWMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/z
qOyhMG8GCCsGAQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50
LXgzLmxldHNlbmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50
LXgzLmxldHNlbmNyeXB0Lm9yZy8wGgYDVR0RBBMwEYIPZ2l0LmFpcmRvZy5zaXRl
MEwGA1UdIARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUH
AgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBAwYKKwYBBAHWeQIEAgSB
9ASB8QDvAHUAB7dcG+V9aP/xsMYdIxXHuuZXfFeUt2ruvGE6GmnTohwAAAFz6Kza
DQAABAMARjBEAiBB6jr5uFBeSaEi/Wah5ZroENvMjaALl2lnt5fLux05sQIgFTAc
V8RE84YTUg9XXEMO0CFRQ8AtABfDkFIRDRhUfGMAdgBep3P531bA57U2SH3QSeAy
epGaDIShEhKEGHWWgXFFWAAAAXPorNt3AAAEAwBHMEUCIFfDBeYPX/uOGQ9zomuD
Ko7z8zB2Jq0BhgeqPDoP3uXHAiEA0IWnTxm3BEvCLjb/XPgOQ0Pik5gH79L0K77I
UCN+NFMwDQYJKoZIhvcNAQELBQADggEBAJXcWWaXWknm3RHhQDUZzLv551chdmi9
6/1Tesq+3NFMJ8DiR+kZtJnAtThBekr7Fz0kvnCnK2W7xSCu1HevLgVBRjKNWlf2
8p8Q0RLmNMUUQxyBQl2aXfbA+KK1EAC1eWLWSP/zGEAs1tt6dbvgosNtb3ZI/DZ1
PcmLTACbNsH03tea+j+w3b0RHZLYxFLHjHvbkH+oaLFmsAfUIzDm8o5uEpXcwg3z
gA+G2OuwOLUtM7bBYQz6nJ+pM7ElTtfIFK10cT/WoTpXyU4Iw/0vrT7ExoUAQM5I
8QXcxrJr4gBWXriBAAUi+wRrVKrrg81+Sk8X5rVj4qxDhaTtgrRWMQs=
-----END CERTIFICATE-----

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-----

View File

@ -0,0 +1,63 @@
-----BEGIN CERTIFICATE-----
MIIGVTCCBT2gAwIBAgISBJKdTX/9sW9DJmxpPCoECsUgMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA4MTMxNTM1MDhaFw0y
MDExMTExNTM1MDhaMBoxGDAWBgNVBAMTD2dpdC5haXJkb2cuc2l0ZTCCAiIwDQYJ
KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMwq0ClselXF04EK3DLxShI8BkBOD/WA
XWi7ECKYlzlXEPrafMK9p8ll2N7quSegycHW2j7Q7gvrPF81t4oRDMpYIOZQWpKr
r+chzdDnZP/hk7JxMB0Yi2XMH5ozNhtxZ9AgMgp/UzCoiiK2624AiKTwnS7/N2UE
FEOmLTXrHn0gmbI6oW/T0R1DUpqMMxL1QeDLS5SN77ZjDtLwZgGwt0cRJbv25wxE
n+9uIhLKoVOeFiw7UdGTRGVqQrNVCPqeZ7c/lVpjUHF1eJXGTl32XsSs3j+89Xv1
J9w+L0aUMubE6IIy9NmOJoOKZmwaaWq43noclNvapMO4CTAv0/xI5SLgFCve1vnL
5fKZb7I4AS0aFguCg6F2iQT6KU47v+9kl+9filrwmyoLGyqJ402Ufa1hdKC8B8+J
ZFhWcTUYNJ5OZK9sgZmCSIBfBF9gy+hXKgYDyBfqut1gh/WQO8CNS66MgMayrF/n
A4UW4GnXUTg7LBi7e4l9ULV6dnBLEf7qO0Eg/fQj8oXPRqoc42h+mhoIk8CFATy2
a64a4ZU9lZ/QwzuJkj54E+UurTxKr0PwZoUqZ3+s3FbLrOc/VBly7sWGxPxVLRjM
Lp9CV6+eFnVtRdhmaSqZf8ewbLo/MHa+UJ3nk2OKr6aGkAIqBpSuo6K46sFyODVX
aNCNDgNbDsWHAgMBAAGjggJjMIICXzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw
FAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCFM
gP4KSDEe/hFUyBwDlMfn7BdWMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/z
qOyhMG8GCCsGAQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50
LXgzLmxldHNlbmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50
LXgzLmxldHNlbmNyeXB0Lm9yZy8wGgYDVR0RBBMwEYIPZ2l0LmFpcmRvZy5zaXRl
MEwGA1UdIARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUH
AgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBAwYKKwYBBAHWeQIEAgSB
9ASB8QDvAHUAB7dcG+V9aP/xsMYdIxXHuuZXfFeUt2ruvGE6GmnTohwAAAFz6Kza
DQAABAMARjBEAiBB6jr5uFBeSaEi/Wah5ZroENvMjaALl2lnt5fLux05sQIgFTAc
V8RE84YTUg9XXEMO0CFRQ8AtABfDkFIRDRhUfGMAdgBep3P531bA57U2SH3QSeAy
epGaDIShEhKEGHWWgXFFWAAAAXPorNt3AAAEAwBHMEUCIFfDBeYPX/uOGQ9zomuD
Ko7z8zB2Jq0BhgeqPDoP3uXHAiEA0IWnTxm3BEvCLjb/XPgOQ0Pik5gH79L0K77I
UCN+NFMwDQYJKoZIhvcNAQELBQADggEBAJXcWWaXWknm3RHhQDUZzLv551chdmi9
6/1Tesq+3NFMJ8DiR+kZtJnAtThBekr7Fz0kvnCnK2W7xSCu1HevLgVBRjKNWlf2
8p8Q0RLmNMUUQxyBQl2aXfbA+KK1EAC1eWLWSP/zGEAs1tt6dbvgosNtb3ZI/DZ1
PcmLTACbNsH03tea+j+w3b0RHZLYxFLHjHvbkH+oaLFmsAfUIzDm8o5uEpXcwg3z
gA+G2OuwOLUtM7bBYQz6nJ+pM7ElTtfIFK10cT/WoTpXyU4Iw/0vrT7ExoUAQM5I
8QXcxrJr4gBWXriBAAUi+wRrVKrrg81+Sk8X5rVj4qxDhaTtgrRWMQs=
-----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,52 @@
-----BEGIN PRIVATE KEY-----
MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQDMKtApbHpVxdOB
Ctwy8UoSPAZATg/1gF1ouxAimJc5VxD62nzCvafJZdje6rknoMnB1to+0O4L6zxf
NbeKEQzKWCDmUFqSq6/nIc3Q52T/4ZOycTAdGItlzB+aMzYbcWfQIDIKf1MwqIoi
tutuAIik8J0u/zdlBBRDpi016x59IJmyOqFv09EdQ1KajDMS9UHgy0uUje+2Yw7S
8GYBsLdHESW79ucMRJ/vbiISyqFTnhYsO1HRk0RlakKzVQj6nme3P5VaY1BxdXiV
xk5d9l7ErN4/vPV79SfcPi9GlDLmxOiCMvTZjiaDimZsGmlquN56HJTb2qTDuAkw
L9P8SOUi4BQr3tb5y+XymW+yOAEtGhYLgoOhdokE+ilOO7/vZJfvX4pa8JsqCxsq
ieNNlH2tYXSgvAfPiWRYVnE1GDSeTmSvbIGZgkiAXwRfYMvoVyoGA8gX6rrdYIf1
kDvAjUuujIDGsqxf5wOFFuBp11E4OywYu3uJfVC1enZwSxH+6jtBIP30I/KFz0aq
HONofpoaCJPAhQE8tmuuGuGVPZWf0MM7iZI+eBPlLq08Sq9D8GaFKmd/rNxWy6zn
P1QZcu7FhsT8VS0YzC6fQlevnhZ1bUXYZmkqmX/HsGy6PzB2vlCd55Njiq+mhpAC
KgaUrqOiuOrBcjg1V2jQjQ4DWw7FhwIDAQABAoICAQC648nu0UzerRrhueY9f6A1
NtrmDE8RhLJ8xxeLA7ESHP//EPc5cFBhzCgMTkK04rstBBZ9f9UX9foqkUp0SQ0z
QB7FlPKD5kM7yTbUrqxGiuAfbPsE903LHmIjThOOZW4JFx+XelvVY8Im6thxtm1e
xp6rwZWck3JVRo2GGLatBaWLf539dqCqL9EyhXnPNdBbDN0fnBm9E8ojD0ng7Dmp
BSpMeEOheEQK8P6hwviQSVq0nIxV0n++cdmivQleGJiKJtr5hYXChiyetYtQ+dBg
Knm7UKZKFOyq8AVojwpVMhQ/8pMtfrEEojEFbdvnhFiq4PTml6tROWq3wGBFRRjx
BBBiR1njSfIh2vbIcyQL5VQ499klqiMok5n6JdCEDUETxNxsShE/KKI4o+VtDoG/
Z0hk/uO8KN1O6/HjrxnOV1bE2sSmyjpli53dmjfkBQy4IS3WqEdFSS9adQTKIsb7
fucPxHkrbawR2QO90YwFvxcT5pJWT/FpbSEGD7AAmYyajzJ2XGgyXRHWolOEtUuf
Ke0pwXriWxMcCNcPxHNXhEgJkzHhegD42cDCLL6fTMTDz8WTJd6o6s/VMM9D8E67
t2P+YKajabkZYQw5e8x2bLMjgBZMgtiyD5NPhdJF73Mps9WRDbjXyR1FNOira2B3
4OeEXklFIKN1dL1SYf244QKCAQEA6haH8PzAym0ioD7k6lk0e02a/80pTGkhLoE9
+l554iLwPYmkTUVX/ecycXH+BCOzuWNyK2kptS6OTwUpbq1E0bl909VTVga7hfOf
0nb9+2988430ZWpFij2u73MgU9OIP0MPqVma19RBKavGoRc9r8vCCuSwpQHI6CLn
CumY8YytmVHQfBY5mKScWlp5neGSg4Tyw5u+6KFn+u2eQe7MjrkkNXVZG4rqj7Dw
2XEF/Qr9z5PWRQYfhbOd4UOM6JcFbbg5BzuBbr9a8n4h5HfZnVTZxOInEVW1qybN
5G2I7mtJUVsl0kd2thipEzlTAyfUMMTvyd8sYFd50JVO9a9nNwKCAQEA30dJ0DGm
Bfn1ghq8/Ej2tPbDnKCsj8Svlx+jhnp2NMZAE8U/dE6mhXMnakbHXDomaFpShSEG
ziGoLOTibEpvppg0EbIkv2FK4TOQdRWOyDwNOgERiJeojwcUg/csSbKIo1X8DJ4x
4FYE0BDg04QMohD73JajcVOZeNX0/0B135FmdrsqlhxFFxNPMJekcsA78ptSv2JB
68Hnv9B+CW0SVsJUFMrp8e57VSzzaglZOb8ZfrV86sNJe/O2poI+cSVOc038RBg+
h+nac8PhyEpxj5v9MjleGtf1ktXO0efP9HZCo3XCUkco8Jt5QVjsj/+VmZ/7dgMe
m/mtGwx8OV4cMQKCAQA4H9jOFbufjRUNOKcn7OVhXtT32de6A0a6YLBcdARjDJ9v
Ea47/JFBRgpZGsydb3Xq0AYSlG80iooCNimd6JskcYXSoUYOzSRu1F+QVYlFnJBn
0LQ1EIrFv05PCNpKXuA+0rRRlTND5hcNh6ri+rCGkqLee8BCf7AMwDmG60UJPQJu
TShgZ++9QlJec2zPRsMbF2ghMBlQq0pD5m7YPgn7ejZNPupzaRYeB31nlOqrpdP+
zeJEwFgUdWE4HjsNlQ/vI4lAy6qXw/dpRoaXwYiCaVKhGtvlExiwhWg+CWkYSM7W
W7UwuoOi2zzGaCsYCZedbcpUK1b3bmG9ed7plvl3AoIBAQC85/uzgc4N0GW/JhAv
Ayx3/y+RHP/iw24sVkBsTsAj9nfQQlpldQW+cqcua6PQjAJi18hpin/PdvpqwVww
cunz8WJcdnRQ12gbER1vckXTc7tdD/pdrrKWEE9zN3TpBXxFdUJDCrT4MM7xmtYd
HuPxWp09DNZL04dNjPgz3b3c4Y/ndIObbV+nHlcpraMc0zflEzT3Z5KOfQguaZ+5
KecSMGgjD2rPng4LCnUHidFL4jsX0UVW+tL5ZEFsr1VVNVMiiyCcHEcLhvekal5k
r1dVQYz/KTpNS9oh2XOadJ6lHklTMxattjcVGvWELFA5pOxVhd2jAxCqtpuW/wE7
KDyBAoIBAQCT3P9ffTocw70kAqqyLz8CpNs9AHUlwlNephAZiBfmcJvSEE/mKpsJ
Fx6RXNOGtyUmImI2lO5AKZyU5q2I1RzwIddxGRjol1N7OUBdczFXTFkQrBXWUMGM
DdQuUT2JWEZHcQxhdwycT+1XjztHMCuBuu/40rQ6KQNzTRGV7ARw92D+uy5tPS3t
8Zvm21CePo0SobH459jaLX5oWuuJRiA5AdWRzVf94gIujHtbkuLYHDiIGXWl/xto
90eP+w808ElD07QT77CcTiNSjT1Ew/RAmtiIVl3mM/SeMXz3yZ967vleG04GeQ3C
NN/hm5Dvq/sDy2gVoUQInCzdOnrTYY6Q
-----END PRIVATE KEY-----

View File

@ -0,0 +1 @@
./next.airdog.site/chain.pem

1
certs/next.airdog.site.crt Symbolic link
View File

@ -0,0 +1 @@
./next.airdog.site/fullchain.pem

View File

@ -0,0 +1 @@
./dhparam.pem

1
certs/next.airdog.site.key Symbolic link
View File

@ -0,0 +1 @@
./next.airdog.site/key.pem

View File

View File

@ -0,0 +1 @@
../accounts/acme-v02.api.letsencrypt.org/directory/default_key.json

View File

@ -0,0 +1 @@
../accounts/acme-v02.api.letsencrypt.org/directory/default_reg.json

View File

@ -0,0 +1,36 @@
-----BEGIN CERTIFICATE-----
MIIGWDCCBUCgAwIBAgISBK2svrtOPYhEIis+hGALGpgYMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA4MTIxNjM5MTVaFw0y
MDExMTAxNjM5MTVaMBsxGTAXBgNVBAMTEG5leHQuYWlyZG9nLnNpdGUwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCX0wO1LgM1Cq8kvF77bMp8xpu+V4xm
uJB3I1QBWHSNMfBoluMcIW317QtnldlWPk7+/QqCpiZn3Y2kCBoGgO0qyzpfkZV3
KNRUie9H2j1RkbhmpmCE/7FMkH4IO9JkaYq1+tXkAOAopK4ADbqo6itXBHla62lB
D05ioAdQKq+IQGhQxmoaECOWOMAp/WOQFtrrV7F3yjm5YERid3aBENy47ndnNYJL
FuFT1xZsnb9wqyAOimCYtUKkylnqN55yznsHc2l3Ewoss0pax/Wv47JmbEimWA7g
tU2Al52eJrl8yC76yv3u/utsN0m2CzAoH3GmNTrqp00l6V2bJ9OPwyqCZS/krpr+
MwV0ijqM45rkOGXLx8Ly9GuQSSJH3euAvdgeRsKtFULNgzYo5J2lTB9/v7cc32aI
gfUD15zMk3TB7RRtvCPyqTlFqwaHl9F2xE/9Rtqx7Do5n+UqLB2HScAtzk4RPWwt
31pQGJrW1sRMxeL5pdhcrPDzTmqiCsCaEbzhFrCU2cLfvqdJ9xSUiCV1AqqZhdsa
sRxhxJKsfbTw5dVNZQsck4VOWBOFR71mpmwqsJuqjy3ys/q91ThQMaaV8SkcLOY/
k7uJQg/8YALPrLG5mrTvFF4qf15a5VvHaz5f4mGtg0HV5DZjDN4KexznVMrUONUG
LWPamJJjmeytQQIDAQABo4ICZTCCAmEwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQW
MBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRX
azfGrn4tfmc3ALWYnQvxDKT46TAfBgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv
86jsoTBvBggrBgEFBQcBAQRjMGEwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwLmlu
dC14My5sZXRzZW5jcnlwdC5vcmcwLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0Lmlu
dC14My5sZXRzZW5jcnlwdC5vcmcvMBsGA1UdEQQUMBKCEG5leHQuYWlyZG9nLnNp
dGUwTAYDVR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMBAQEwKDAmBggrBgEF
BQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEEBgorBgEEAdZ5AgQC
BIH1BIHyAPAAdgDnEvKwN34aYvuOyQxhhPHqezfLVh0RJlvz4PNL8kFUbgAAAXPj
wTF4AAAEAwBHMEUCIQDwm0bm+9ZQg643I1Q0bJxoAxtXRzBCHPBg7LSS+2G26wIg
Tu2L7x6Ra/ObXLn2ytdtdIU7PmRS++W8dZoO5OiZuSoAdgCyHgXMi6LNiiBOh2b5
K7mKJSBna9r6cOeySVMt74uQXgAAAXPjwTNuAAAEAwBHMEUCIQCMRplV8fyTM9l5
OBBI1wvc9x1woj1R+zvymX4dFeU/wwIgebiY2/Imff99YIXzPR1/A/XkPSV6Kb0f
2SpNBAYkneYwDQYJKoZIhvcNAQELBQADggEBAH/3XehkLqeLnZgTjNl6IdBjWj8I
UonpayVYrL+CWzRTE8DWKBZFjErIw+BFTdLPWtGLTaL4obu/2DyWDkBzjo8fYeDg
aV+kbGW4Qiw/jQ2QLts/AiGvMTkcsyA/PWdCAc7V1vyIbeskixyX96VczFSx32EM
hwIhgWiXsqDYWUojbi6mltIpWWmiLBwubxiGi5YdE32Ecr/B+xsYh2YvQss2Xbc4
oW7pQBOj67kG3Iez9380stySqJbWVhyy3oZZ4CK5ZackS0AKtj+St7EgTNx/2ZVw
blNR70AnVI4lZG0cz38dkj9TevRKDYXeMeqnC6CgDT02Wqu8wf8OMbg7OmA=
-----END CERTIFICATE-----

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-----

View File

@ -0,0 +1,63 @@
-----BEGIN CERTIFICATE-----
MIIGWDCCBUCgAwIBAgISBK2svrtOPYhEIis+hGALGpgYMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA4MTIxNjM5MTVaFw0y
MDExMTAxNjM5MTVaMBsxGTAXBgNVBAMTEG5leHQuYWlyZG9nLnNpdGUwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCX0wO1LgM1Cq8kvF77bMp8xpu+V4xm
uJB3I1QBWHSNMfBoluMcIW317QtnldlWPk7+/QqCpiZn3Y2kCBoGgO0qyzpfkZV3
KNRUie9H2j1RkbhmpmCE/7FMkH4IO9JkaYq1+tXkAOAopK4ADbqo6itXBHla62lB
D05ioAdQKq+IQGhQxmoaECOWOMAp/WOQFtrrV7F3yjm5YERid3aBENy47ndnNYJL
FuFT1xZsnb9wqyAOimCYtUKkylnqN55yznsHc2l3Ewoss0pax/Wv47JmbEimWA7g
tU2Al52eJrl8yC76yv3u/utsN0m2CzAoH3GmNTrqp00l6V2bJ9OPwyqCZS/krpr+
MwV0ijqM45rkOGXLx8Ly9GuQSSJH3euAvdgeRsKtFULNgzYo5J2lTB9/v7cc32aI
gfUD15zMk3TB7RRtvCPyqTlFqwaHl9F2xE/9Rtqx7Do5n+UqLB2HScAtzk4RPWwt
31pQGJrW1sRMxeL5pdhcrPDzTmqiCsCaEbzhFrCU2cLfvqdJ9xSUiCV1AqqZhdsa
sRxhxJKsfbTw5dVNZQsck4VOWBOFR71mpmwqsJuqjy3ys/q91ThQMaaV8SkcLOY/
k7uJQg/8YALPrLG5mrTvFF4qf15a5VvHaz5f4mGtg0HV5DZjDN4KexznVMrUONUG
LWPamJJjmeytQQIDAQABo4ICZTCCAmEwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQW
MBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRX
azfGrn4tfmc3ALWYnQvxDKT46TAfBgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv
86jsoTBvBggrBgEFBQcBAQRjMGEwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwLmlu
dC14My5sZXRzZW5jcnlwdC5vcmcwLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0Lmlu
dC14My5sZXRzZW5jcnlwdC5vcmcvMBsGA1UdEQQUMBKCEG5leHQuYWlyZG9nLnNp
dGUwTAYDVR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMBAQEwKDAmBggrBgEF
BQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEEBgorBgEEAdZ5AgQC
BIH1BIHyAPAAdgDnEvKwN34aYvuOyQxhhPHqezfLVh0RJlvz4PNL8kFUbgAAAXPj
wTF4AAAEAwBHMEUCIQDwm0bm+9ZQg643I1Q0bJxoAxtXRzBCHPBg7LSS+2G26wIg
Tu2L7x6Ra/ObXLn2ytdtdIU7PmRS++W8dZoO5OiZuSoAdgCyHgXMi6LNiiBOh2b5
K7mKJSBna9r6cOeySVMt74uQXgAAAXPjwTNuAAAEAwBHMEUCIQCMRplV8fyTM9l5
OBBI1wvc9x1woj1R+zvymX4dFeU/wwIgebiY2/Imff99YIXzPR1/A/XkPSV6Kb0f
2SpNBAYkneYwDQYJKoZIhvcNAQELBQADggEBAH/3XehkLqeLnZgTjNl6IdBjWj8I
UonpayVYrL+CWzRTE8DWKBZFjErIw+BFTdLPWtGLTaL4obu/2DyWDkBzjo8fYeDg
aV+kbGW4Qiw/jQ2QLts/AiGvMTkcsyA/PWdCAc7V1vyIbeskixyX96VczFSx32EM
hwIhgWiXsqDYWUojbi6mltIpWWmiLBwubxiGi5YdE32Ecr/B+xsYh2YvQss2Xbc4
oW7pQBOj67kG3Iez9380stySqJbWVhyy3oZZ4CK5ZackS0AKtj+St7EgTNx/2ZVw
blNR70AnVI4lZG0cz38dkj9TevRKDYXeMeqnC6CgDT02Wqu8wf8OMbg7OmA=
-----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,52 @@
-----BEGIN PRIVATE KEY-----
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
fuIcZhr/AapWaoKBl50pJEZUuMKpyfE=
-----END PRIVATE KEY-----

View File

@ -0,0 +1 @@
./rocket.airdog.site/chain.pem

View File

@ -0,0 +1 @@
./rocket.airdog.site/fullchain.pem

View File

@ -0,0 +1 @@
./dhparam.pem

View File

@ -0,0 +1 @@
./rocket.airdog.site/key.pem

View File

View File

@ -0,0 +1 @@
../accounts/acme-v02.api.letsencrypt.org/directory/default_key.json

View File

@ -0,0 +1 @@
../accounts/acme-v02.api.letsencrypt.org/directory/default_reg.json

View File

@ -0,0 +1,36 @@
-----BEGIN CERTIFICATE-----
MIIGXDCCBUSgAwIBAgISA1Pe9S0PLsQYiho3SJXSfnTUMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA4MTIxODMxNTlaFw0y
MDExMTAxODMxNTlaMB0xGzAZBgNVBAMTEnJvY2tldC5haXJkb2cuc2l0ZTCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALD90mfIv3i2X18OGpag9Cy0ItG/
Ld2RBGIR6uAP/pGwz0FlkbGxrxDTOXlUX3Vd2QxRXQcsjx0ow4CxhpLy7625thHw
d77N9RNCwZdv3CcRifANbXrkfnwNPKDW1v8A84Gb+GKXgKTL9hygI1RKeao3dBrO
ewMWZcpdPwlqYxWkEzGaQ/I1lNplFXFOlFsJFtEXu3pb83jCMQ+wpC26v8DtZdkn
73zLDZ2+llGgMKfQKjjSagdMeqfNzshFSswf6YprjTYd5n1SeNh2xCsn5ZbAFETU
ku0ZoN+h7jMqTG6Jr0r1Lr4oJ7DzV3vY0Ahzf+4OJ+uxEjg/WwveoWdSBJM84G2/
cxP/f/F98SYmF0uuq+aeaAjAcBqUwe2l6sVDKPXOsLiIWLnWixM9jBb/2ezPsFW0
s9lbf041A4ovvWjd9loKNIzel3YBKYKN6sa4CEpW/BJoB4X3b2ykQ80qNVhTtV9u
CHdYc19l7SOJv/K9F+g1b45Eqshhb3aaIdOHWrxZfljDP4eGvdQm571trEwqA9SK
eYhOnOrTwPob5FvRDKz6RlNSl8j+T2+3PDFCGWA1pt54rS0TKtcL0iVW+5AXr8Ez
MiU4wZXF3ylffkAT6KrY6KW37jlez6WRaWNMA4VoYLLMo1vV8wBG9sfuvwlznmqO
CJkXT10FfWqnM6UBAgMBAAGjggJnMIICYzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0l
BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYE
FPv3jhS82016ba1ZVaOCISguBTXwMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZF
Ze/zqOyhMG8GCCsGAQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3Au
aW50LXgzLmxldHNlbmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQu
aW50LXgzLmxldHNlbmNyeXB0Lm9yZy8wHQYDVR0RBBYwFIIScm9ja2V0LmFpcmRv
Zy5zaXRlMEwGA1UdIARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYI
KwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBBAYKKwYBBAHW
eQIEAgSB9QSB8gDwAHYAXqdz+d9WwOe1Nkh90EngMnqRmgyEoRIShBh1loFxRVgA
AAFz5Chl+QAABAMARzBFAiAYFZP4Y/183lMKwxUtgFJu0YtbdqS2fdUribdO8R26
bQIhAOHDC0srAux5dOukLSAP6AGW7Wy/vPvR172fdUXN/Zl6AHYAB7dcG+V9aP/x
sMYdIxXHuuZXfFeUt2ruvGE6GmnTohwAAAFz5ChmQQAABAMARzBFAiAzq7Hj4UID
7S84K0poxqoDBIPC26ZnOi2fupc7QW7sAAIhAJUynF87ZrUG5APWOWa36krUdSmG
F/htyjJccgsktNJTMA0GCSqGSIb3DQEBCwUAA4IBAQBu0ygbfqkIQDZsHXCI3Y0U
hEct6su4JIa88PhopbWk/eZNX9WkAvpBTW1L9gHm0tAWbUVpcLGJf33cdc8DS9XI
VtpbJxZgqiWy2xA1RU6XTAPcGb0SpzTA+lAlhbGvmd4G9U01JfM1DzbxG7LpiTRl
EzI/u+ugAWVEnwzQkxL00lWpU7T0+tR6iFLCsecPkJ4UmKHLlrk3xuc3bN0g6pk5
BH4b7zZncqDK1xAXZBy9cQA+geIc1lOBIOt7OORLbFjAghJLOLNY0tMCl8XuO3rX
rzZib7eKM2RqF6BetolKC7PLMbPBYdWYwMAF5Y1d7fXgTrOIDDW5AHDQB6UTOFrI
-----END CERTIFICATE-----

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-----

View File

@ -0,0 +1,63 @@
-----BEGIN CERTIFICATE-----
MIIGXDCCBUSgAwIBAgISA1Pe9S0PLsQYiho3SJXSfnTUMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA4MTIxODMxNTlaFw0y
MDExMTAxODMxNTlaMB0xGzAZBgNVBAMTEnJvY2tldC5haXJkb2cuc2l0ZTCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALD90mfIv3i2X18OGpag9Cy0ItG/
Ld2RBGIR6uAP/pGwz0FlkbGxrxDTOXlUX3Vd2QxRXQcsjx0ow4CxhpLy7625thHw
d77N9RNCwZdv3CcRifANbXrkfnwNPKDW1v8A84Gb+GKXgKTL9hygI1RKeao3dBrO
ewMWZcpdPwlqYxWkEzGaQ/I1lNplFXFOlFsJFtEXu3pb83jCMQ+wpC26v8DtZdkn
73zLDZ2+llGgMKfQKjjSagdMeqfNzshFSswf6YprjTYd5n1SeNh2xCsn5ZbAFETU
ku0ZoN+h7jMqTG6Jr0r1Lr4oJ7DzV3vY0Ahzf+4OJ+uxEjg/WwveoWdSBJM84G2/
cxP/f/F98SYmF0uuq+aeaAjAcBqUwe2l6sVDKPXOsLiIWLnWixM9jBb/2ezPsFW0
s9lbf041A4ovvWjd9loKNIzel3YBKYKN6sa4CEpW/BJoB4X3b2ykQ80qNVhTtV9u
CHdYc19l7SOJv/K9F+g1b45Eqshhb3aaIdOHWrxZfljDP4eGvdQm571trEwqA9SK
eYhOnOrTwPob5FvRDKz6RlNSl8j+T2+3PDFCGWA1pt54rS0TKtcL0iVW+5AXr8Ez
MiU4wZXF3ylffkAT6KrY6KW37jlez6WRaWNMA4VoYLLMo1vV8wBG9sfuvwlznmqO
CJkXT10FfWqnM6UBAgMBAAGjggJnMIICYzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0l
BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYE
FPv3jhS82016ba1ZVaOCISguBTXwMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZF
Ze/zqOyhMG8GCCsGAQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3Au
aW50LXgzLmxldHNlbmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQu
aW50LXgzLmxldHNlbmNyeXB0Lm9yZy8wHQYDVR0RBBYwFIIScm9ja2V0LmFpcmRv
Zy5zaXRlMEwGA1UdIARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYI
KwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBBAYKKwYBBAHW
eQIEAgSB9QSB8gDwAHYAXqdz+d9WwOe1Nkh90EngMnqRmgyEoRIShBh1loFxRVgA
AAFz5Chl+QAABAMARzBFAiAYFZP4Y/183lMKwxUtgFJu0YtbdqS2fdUribdO8R26
bQIhAOHDC0srAux5dOukLSAP6AGW7Wy/vPvR172fdUXN/Zl6AHYAB7dcG+V9aP/x
sMYdIxXHuuZXfFeUt2ruvGE6GmnTohwAAAFz5ChmQQAABAMARzBFAiAzq7Hj4UID
7S84K0poxqoDBIPC26ZnOi2fupc7QW7sAAIhAJUynF87ZrUG5APWOWa36krUdSmG
F/htyjJccgsktNJTMA0GCSqGSIb3DQEBCwUAA4IBAQBu0ygbfqkIQDZsHXCI3Y0U
hEct6su4JIa88PhopbWk/eZNX9WkAvpBTW1L9gHm0tAWbUVpcLGJf33cdc8DS9XI
VtpbJxZgqiWy2xA1RU6XTAPcGb0SpzTA+lAlhbGvmd4G9U01JfM1DzbxG7LpiTRl
EzI/u+ugAWVEnwzQkxL00lWpU7T0+tR6iFLCsecPkJ4UmKHLlrk3xuc3bN0g6pk5
BH4b7zZncqDK1xAXZBy9cQA+geIc1lOBIOt7OORLbFjAghJLOLNY0tMCl8XuO3rX
rzZib7eKM2RqF6BetolKC7PLMbPBYdWYwMAF5Y1d7fXgTrOIDDW5AHDQB6UTOFrI
-----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,52 @@
-----BEGIN PRIVATE KEY-----
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
/ntMZ0aPK0jmYWvYzyoMOO5XCaApElk=
-----END PRIVATE KEY-----

View File

@ -0,0 +1 @@
./wallabag.airdog.site/chain.pem

View File

@ -0,0 +1 @@
./wallabag.airdog.site/fullchain.pem

View File

@ -0,0 +1 @@
./dhparam.pem

View File

@ -0,0 +1 @@
./wallabag.airdog.site/key.pem

View File

View File

@ -0,0 +1 @@
../accounts/acme-v02.api.letsencrypt.org/directory/default_key.json

View File

@ -0,0 +1 @@
../accounts/acme-v02.api.letsencrypt.org/directory/default_reg.json

View File

@ -0,0 +1,37 @@
-----BEGIN CERTIFICATE-----
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
NtfJeA==
-----END CERTIFICATE-----

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-----

View File

@ -0,0 +1,64 @@
-----BEGIN CERTIFICATE-----
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
NtfJeA==
-----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,52 @@
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDS3d/TMEd/A3kR
NfNIfdJkYnNq93Ukf4aZIxe7U4ZoRX/ftGkPGb9ilUSwJMrUFaUSgOJkqNCCQE/L
fSh+Pvomyji8yQoovC3BOnQh+ayMghuOGy77MFUezSxdYju0ExwmLsMWVQJgtLS7
QoFB5WHdYUzdOPkBS9yYXsz8dKCRQ0g81+xZadDwAII6J+y2T3QaP1xBNtEaG6ki
lZEuFzatluQEfrNgJttArgZOl56S39b7KV8xXvTTMKPlEvpWn2vjFlccr3xllizf
Q9T30v67MYtZH8yytdxYPco239lvNXMRWCeezDcUXbXE7flTn8LN7oKET2kkDiDS
xsAO4xnhXzrRYNo+GpZOTDuSM9CFGatjiQsqsvPnhBE5Sf2ahtoQtMAtq/ogX0kO
3lC8RSyatJep3hTW5Y11KN4gXIdG4oPMR2SeNGhDGozinsMj+WFZvYRSDlS/+Jsh
j5U4LAVamdHeG4NGE8Qv5AZstAG3pPow4L6LfAX/Hxtk9I6Wk4ZhJ6PLD9qurWKz
uE2Hx/4JqxBDBq0cnvvCWqZR8TCnZ1VfhwCGz/DsEgj/JqxGQRe4fxKmrnFSladg
K09eyiUO+NqxtzPxeV0hy72rnyp1acSBm4AUiFObmvUzkDbfitQvAD+Kr2JM6r/o
WHLDxeOPt0enBxtTKDHFUdbWt/7ZRwIDAQABAoICAA87U7WvoRp9p7skiIROAmqZ
6fhqE54lUBWzwT0Y1XamvovsPkKG+5olaibHIZecUKY7hR78SsN93cW3Lruf1PYE
WYDZjNBQd4WjsUva+ynTJCZptEUUwrFM5M2CEQn672earSDp1xghNYTpUujtptoU
8zZvrRz42+BtyKTbz9VuZMNwXXQ//oW3o7CLvb+Vka9rsEBNs2ENanRDFY+cwahc
Y/AnLtHdPK05ZN88eInnfWH7JRMt5sVymAQuEMM9FM/8hyJdUsELzgX6omGcbiYb
eBNiBqlKFbaSEA9SsCQmWj+AfKwt2DSyaDTnc8Ekoy+48NiZ2+Bs3NYc4TayFOZf
Cw4llz4WS2VA775JYCgBHiIgnbGrOchhKncpP6HJu9qW5Ta03CyU00RqcAPgmC0i
a9JK0WoKcuZUWT+0gFBk3w/qOkke36eSQs2evnXe5T5t/TfUoAJ7I+x1Wr2I3NlN
4UZGJaZ6XvomONMo6Nj1E/WuZkOomQx3M8o9SH62depcBXzwq3Y9hP8vFKLVopS5
kgRoT3+l3bQ9KIgETvvLDt5g+4WcgAFDsinWwCkFPwgflZznJqL/CYJ7aSCJ3qCH
xQrSjbqo52XZCeJYvp6qKeUlReyAfPOMzY2dbdH0tdl+Fo+13rgNy+ugMKUK826J
ckpumaesz8DG+H0yB9CxAoIBAQD8GJ6qycwfrWRGQ8boH7YCrvxAIC4/fjyRm2pB
wvzaxi1RseF2WS7Y9z8ZA77wXbxBexsePdjxyPKXncme69BYxlkL0MGkzMp48bMw
+8g5tGMib/NmWqeHVNqYq9yq6+8WIC370gMs++W5U+D35aAO6UcefvVivCDzyMBV
Yj+299Z6XY4RSOrxTd0rVbkYvALfIHPQlF7GhbaaUvAhX2fi/lZoIdK+rioh3OZn
YC0VzmRLsujKvzuS527rrzylBj78XKjfClyt8OJpJ7IF+b+ZQ95646clwLx+q8f+
ASocYmG/N0rfYxDAzU4DNzKrlmRCwmH1uVC2Hg5GSGtzAvLlAoIBAQDWIc8svfD6
SfPY7Awgnxrx4br0kU+uACA+H0ScW1SYMl6/+HjffZt9Bss+hJBHgJSMXisa69G5
h6996iMqMVDWIEKaF9gsEFyED1lPDwf24cdiUWDT5WDX4/yzrugEfEN1R0GfNbdG
GGdNr8Rr96bJLFfXBFCeECoUYWHVNdtoCoy8NTTEJQVUukZ8UnHfvg85dNb7DL0f
ce4tvFX6RIjXzIVlt02lBQO2O5Z7DWGqCjOBQkwtsp9pCTBAnrrpkp+evwDBNDkL
xW8OrEm000wbGSvg9XMz/S9EBxlt5pLLJJGqJ5/wGHBfz0SPnwBqM5CjvTEekqnz
WgmG/90E5vy7AoIBAQCBjOllHUUP9lw0m7oJKdqwMFqjXaZGrMnVjgeh+eFVUEiT
1hTma9heWVkMstcZ0SHgiLIb7W6iekDo14Z4a/jq1iuGneYVmcRnONZ8UrfHp8LW
PK/Zpra3Hk0j7hX9pDd+qFTZN0i4gk7A2bEf09pYL1uD+XyDG+jXPxBQEKhrj5uh
0Jgkm9NY5EnHbksrwdq77YJ26vh1jtuTHRIYJF5P0aJ36wHRSdGPC2VANLWWojT6
jduB7Zpg2RwwdCJ3L+mIaNnDnSCZptPDdEnRNlJXIgCgKIOKLCzx77db+h847PoM
eQ66E7/VROxVTLV2Zlfp0tjinTQ0EugFCExnk1ldAoIBAQCE+kwJcg+Dr4dScAx7
+bKnAdKzbMY5vXRIf+yA2SrotWcn+ms+B2gXNa/kLDjZXp1hql1Eg6wjdoLiRBQA
cM3NnA0gWqxxeNurW0jQEvqUM9Q5V2Y1UR5aFAhrobQOjQjrfQvgjmA5lJAaq4vk
rNAT4IjQS6qw7kLjkzJJUP/nVZ3eh4A0SvVLj76UGDMFiqczvD6Be4C7VWpfVrVi
DUuaEDXLXBFI6JtMgSbLVh0PlvQzUnOycVoTxZQEnU5gHSEpWV5jnUXL7JkyWIYR
WKLLtU8NjgA0CghfS7VcDbOdmiEntSHa3aJzrWjbdBey3ED3nlcxsE0AhiqifqTI
FZZfAoIBAHjYGHNMKaLRizOp95YITk1QeQhTW4Y63ukQ6JUzg4BzoF0svyeuoYse
emCr7Ib0C+PHpAPa2gEUq8HHNV4Pl814/ZIVMLnW54rvRU0A6tsg2k8lp6NQMePn
nueJmSnLWFDgpFZO+zqx10Tx5QfqgnvC95OHc6LmE5somY4vvtWEoxxQiHFvxYAL
7VAAUtkajtbUZNfS+XN8jHjStjWNCOrOS8RrJJnfvH1tiZl1rV2RzylfrWgQRc18
lueXDATLDVgSwN8ZaIWx499XfheNJ8H9Nb06nrcpBj0FyTt/38IIKYw7jV9DiwRz
SwzptZ0dSJAnW/VmFrJuBe2QZxbf/lE=
-----END PRIVATE KEY-----

3
db.env Normal file
View File

@ -0,0 +1,3 @@
MYSQL_PASSWORD=chengli47
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud

87
docker-compose.yml Normal file
View File

@ -0,0 +1,87 @@
version: '3'
services:
db:
image: mariadb
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: always
volumes:
- ./db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=chengli47
env_file:
- db.env
redis:
image: redis:alpine
restart: always
app:
image: nextcloud:apache
restart: always
volumes:
- ./nextcloud:/var/www/html
environment:
- VIRTUAL_HOST=next.airdog.site
- LETSENCRYPT_HOST=next.airdog.site
- LETSENCRYPT_EMAIL=ouch@thetrauma.org
- MYSQL_HOST=db
- REDIS_HOST=redis
env_file:
- db.env
depends_on:
- db
- redis
networks:
- proxy-tier
- default
cron:
image: nextcloud:apache
restart: always
volumes:
- ./nextcloud:/var/www/html
entrypoint: /cron.sh
depends_on:
- db
- redis
proxy:
build: ./proxy
restart: always
ports:
- 80:80
- 443:443
labels:
com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
volumes:
- ./certs:/etc/nginx/certs:ro
- ./vhost.d:/etc/nginx/vhost.d
- ./html:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- proxy-tier
letsencrypt-companion:
image: jrcs/letsencrypt-nginx-proxy-companion
restart: always
volumes:
- ./certs:/etc/nginx/certs
- ./vhost.d:/etc/nginx/vhost.d
- ./html:/usr/share/nginx/html
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- proxy-tier
depends_on:
- proxy
#volumes:
# db:
# nextcloud:
# certs:
# vhost.d:
# html:
networks:
proxy-tier:

87
docker-compose.yml.good Normal file
View File

@ -0,0 +1,87 @@
version: '3'
services:
db:
image: mariadb
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: always
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=chengli47
env_file:
- db.env
redis:
image: redis:alpine
restart: always
app:
image: nextcloud:apache
restart: always
volumes:
- nextcloud:/var/www/html
environment:
- VIRTUAL_HOST=next.airdog.site
- LETSENCRYPT_HOST=next.airdog.site
- LETSENCRYPT_EMAIL=ouch@thetrauma.org
- MYSQL_HOST=db
- REDIS_HOST=redis
env_file:
- db.env
depends_on:
- db
- redis
networks:
- proxy-tier
- default
cron:
image: nextcloud:apache
restart: always
volumes:
- nextcloud:/var/www/html
entrypoint: /cron.sh
depends_on:
- db
- redis
proxy:
build: ./proxy
restart: always
ports:
- 80:80
- 443:443
labels:
com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
volumes:
- certs:/etc/nginx/certs:ro
- vhost.d:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- proxy-tier
letsencrypt-companion:
image: jrcs/letsencrypt-nginx-proxy-companion
restart: always
volumes:
- certs:/etc/nginx/certs
- vhost.d:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- proxy-tier
depends_on:
- proxy
volumes:
db:
nextcloud:
certs:
vhost.d:
html:
networks:
proxy-tier:

119
nextcloud/.htaccess Normal file
View File

@ -0,0 +1,119 @@
<IfModule mod_headers.c>
<IfModule mod_setenvif.c>
<IfModule mod_fcgid.c>
SetEnvIfNoCase ^Authorization$ "(.+)" XAUTHORIZATION=$1
RequestHeader set XAuthorization %{XAUTHORIZATION}e env=XAUTHORIZATION
</IfModule>
<IfModule mod_proxy_fcgi.c>
SetEnvIfNoCase Authorization "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
</IfModule>
<IfModule mod_env.c>
# Add security and privacy related headers
# Avoid doubled headers by unsetting headers in "onsuccess" table,
# then add headers to "always" table: https://github.com/nextcloud/server/pull/19002
Header onsuccess unset Referrer-Policy
Header always set Referrer-Policy "no-referrer"
Header onsuccess unset X-Content-Type-Options
Header always set X-Content-Type-Options "nosniff"
Header onsuccess unset X-Download-Options
Header always set X-Download-Options "noopen"
Header onsuccess unset X-Frame-Options
Header always set X-Frame-Options "SAMEORIGIN"
Header onsuccess unset X-Permitted-Cross-Domain-Policies
Header always set X-Permitted-Cross-Domain-Policies "none"
Header onsuccess unset X-Robots-Tag
Header always set X-Robots-Tag "none"
Header onsuccess unset X-XSS-Protection
Header always set X-XSS-Protection "1; mode=block"
SetEnv modHeadersAvailable true
</IfModule>
# Add cache control for static resources
<FilesMatch "\.(css|js|svg|gif)$">
Header set Cache-Control "max-age=15778463"
</FilesMatch>
# Let browsers cache WOFF files for a week
<FilesMatch "\.woff2?$">
Header set Cache-Control "max-age=604800"
</FilesMatch>
</IfModule>
<IfModule mod_php7.c>
php_value mbstring.func_overload 0
php_value default_charset 'UTF-8'
php_value output_buffering 0
<IfModule mod_env.c>
SetEnv htaccessWorking true
</IfModule>
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} DavClnt
RewriteRule ^$ /remote.php/webdav/ [L,R=302]
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteRule ^\.well-known/host-meta /public.php?service=host-meta [QSA,L]
RewriteRule ^\.well-known/host-meta\.json /public.php?service=host-meta-json [QSA,L]
RewriteRule ^\.well-known/webfinger /public.php?service=webfinger [QSA,L]
RewriteRule ^\.well-known/nodeinfo /public.php?service=nodeinfo [QSA,L]
RewriteRule ^\.well-known/carddav /remote.php/dav/ [R=301,L]
RewriteRule ^\.well-known/caldav /remote.php/dav/ [R=301,L]
RewriteRule ^remote/(.*) remote.php [QSA,L]
RewriteRule ^(?:build|tests|config|lib|3rdparty|templates)/.* - [R=404,L]
RewriteCond %{REQUEST_URI} !^/\.well-known/(acme-challenge|pki-validation)/.*
RewriteRule ^(?:\.|autotest|occ|issue|indie|db_|console).* - [R=404,L]
</IfModule>
<IfModule mod_mime.c>
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
</IfModule>
<IfModule mod_dir.c>
DirectoryIndex index.php index.html
</IfModule>
AddDefaultCharset utf-8
Options -Indexes
<IfModule pagespeed_module>
ModPagespeed Off
</IfModule>
#### DO NOT CHANGE ANYTHING ABOVE THIS LINE ####
ErrorDocument 403 //
ErrorDocument 404 //
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteRule ^core/js/oc.js$ index.php [PT,E=PATH_INFO:$1]
RewriteRule ^core/preview.png$ index.php [PT,E=PATH_INFO:$1]
RewriteCond %{REQUEST_FILENAME} !\.(css|js|svg|gif|png|html|ttf|woff2?|ico|jpg|jpeg|map|webm|mp4)$
RewriteCond %{REQUEST_FILENAME} !core/img/favicon.ico$
RewriteCond %{REQUEST_FILENAME} !core/img/manifest.json$
RewriteCond %{REQUEST_FILENAME} !/remote.php
RewriteCond %{REQUEST_FILENAME} !/public.php
RewriteCond %{REQUEST_FILENAME} !/cron.php
RewriteCond %{REQUEST_FILENAME} !/core/ajax/update.php
RewriteCond %{REQUEST_FILENAME} !/status.php
RewriteCond %{REQUEST_FILENAME} !/ocs/v1.php
RewriteCond %{REQUEST_FILENAME} !/ocs/v2.php
RewriteCond %{REQUEST_FILENAME} !/robots.txt
RewriteCond %{REQUEST_FILENAME} !/updater/
RewriteCond %{REQUEST_FILENAME} !/ocs-provider/
RewriteCond %{REQUEST_FILENAME} !/ocm-provider/
RewriteCond %{REQUEST_URI} !^/\.well-known/(acme-challenge|pki-validation)/.*
RewriteCond %{REQUEST_FILENAME} !/richdocumentscode/proxy.php$
RewriteRule . index.php [PT,E=PATH_INFO:$1]
RewriteBase /
<IfModule mod_env.c>
SetEnv front_controller_active true
<IfModule mod_dir.c>
DirectorySlash off
</IfModule>
</IfModule>
</IfModule>

4
nextcloud/.user.ini Normal file
View File

@ -0,0 +1,4 @@
mbstring.func_overload=0
always_populate_raw_post_data=-1
default_charset='UTF-8'
output_buffering=0

View File

@ -0,0 +1,29 @@
name: Composer
on:
pull_request:
push:
branches:
- master
- stable*
jobs:
php:
runs-on: ubuntu-latest
name: Check vendor changes
steps:
- name: Checkout
uses: actions/checkout@master
- name: Set up php
uses: shivammathur/setup-php@master
with:
php-version: 7.4
coverage: none
- name: Update composer
run: sudo composer self-update && composer --version
- name: Vendor dependencies
run: composer run vendor
- name: Check vendor changes
run: |
bash -c "[[ ! \"`git status --porcelain `\" ]] || ( echo 'Uncommited vendor changes' && git status && git diff && exit 1 )"

262
nextcloud/3rdparty/.gitignore vendored Normal file
View File

@ -0,0 +1,262 @@
.DS_Store
bin
*/**/phpstan.neon
.php_cs.dist
# ignore demo files
james-heinrich/getid3/demos
james-heinrich/getid3/helperapps
aws/aws-sdk-php/.changes
doctrine/annotations/tests
doctrine/annotations/.travis.yml
doctrine/cache/tests
doctrine/cache/.travis.yml
doctrine/cache/composer.json
doctrine/collections/tests
doctrine/collections/.travis.yml
doctrine/collections/README.md
doctrine/collections/composer.json
doctrine/common/tests
doctrine/common/.travis.yml
doctrine/common/composer.json
doctrine/dbal/tests
doctrine/dbal/docs
doctrine/dbal/run-all.sh
doctrine/dbal/.travis.yml
doctrine/dbal/.gitignore
doctrine/dbal/.gitattributes
doctrine/dbal/.gitmodules
doctrine/dbal/build.*
doctrine/dbal/phpunit.xml.dist
doctrine/inflector/tests
doctrine/lexer/composer.json
doctrine/lexer/LICENSE
pear/archive_tar/.travis.sh
pear/archive_tar/.travis.yml
pear/archive_tar/tests/
pear/archive_tar/docs/
pear/archive_tar/scripts/
pear/archive_tar/sync-php4
pear/console_getopt/tests/
pear/pear_exception/tests/
phpseclib/phpseclib/.git*
phpseclib/phpseclib/*.yml
phpseclib/phpseclib/phpunit.xml.dist
phpseclib/phpseclib/build/
phpseclib/phpseclib/tests/
phpseclib/phpseclib/travis/
phpseclib/phpseclib/CHANGELOG.md
phpseclib/phpseclib/README.md
phpseclib/phpseclib/composer.json
phpseclib/phpseclib/composer.lock
phpseclib/phpseclib/phpunit.xml.dist
php-http/guzzle6-adapter/CHANGELOG.md
php-http/guzzle6-adapter/README.md
php-http/httplug/CHANGELOG.md
php-http/httplug/README.md
php-http/promise/CHANGELOG.md
php-http/promise/README.md
psr/http-client/CHANGELOG.md
psr/http-client/README.md
php-opencloud/openstack/doc
php-opencloud/openstack/tests
php-opencloud/openstack/samples
symfony/debug/Tests
symfony/console/Symfony/Component/Console/Tests
symfony/console/Symfony/Component/Console/.gitignore
symfony/console/Symfony/Component/Console/composer.json
symfony/console/Tests
symfony/routing/Tests/
symfony/routing/phpunit.xml.dist
symfony/routing/.gitignore
symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/
symfony/event-dispatcher/Symfony/EventDispatcher/Debug/Routing/Tests/
symfony/event-dispatcher/Symfony/EventDispatcher/Debug/phpunit.xml.dist
symfony/event-dispatcher/Symfony/EventDispatcher/Debug/.gitignore
symfony/event-dispatcher/Tests
symfony/finder/Tests
symfony/process/Symfony/Component/Process/Routing/Tests/
symfony/process/Symfony/Component/Process/phpunit.xml.dist
symfony/process/Symfony/Component/Process/Tests
symfony/process/Symfony/Component/Process/.gitignore
symfony/process/Tests
pimple/pimple/ext
pimple/pimple/.gitignore
pimple/pimple/.travis.yml
pimple/pimple/CHANGELOG
pimple/pimple/composer.json
pimple/pimple/LICENSE
pimple/pimple/phpunit.xml.dist
pimple/pimple/README.rst
pimple/pimple/src/Pimple/Tests
ircmaxell/password-compat/.travis.yml
ircmaxell/password-compat/README.md
ircmaxell/password-compat/phpunit.xml.dist
ircmaxell/password-compat/test/
ircmaxell/password-compat/version-test.php
ircmaxell/random-lib/test/
ircmaxell/random-lib/.gitignore
ircmaxell/random-lib/.travis.yml
ircmaxell/random-lib/LICENSE
ircmaxell/random-lib/README.md
ircmaxell/random-lib/composer.json
ircmaxell/random-lib/composer.lock
ircmaxell/random-lib/phpunit.xml.dist
icewind/streams/tests
icewind/streams/README.md
icewind/streams/LICENCE
icewind/streams/composer.json
icewind/searchdav/.github/
icewind/searchdav/.scrutinizer.yml
icewind/searchdav/tests
icewind/searchdav/README.md
icewind/searchdav/composer.json
justinrainbow/json-schema/demo
swiftmailer/swiftmailer/.travis.yml
swiftmailer/swiftmailer/phpunit.xml.dist
swiftmailer/swiftmailer/doc/
swiftmailer/swiftmailer/notes/
swiftmailer/swiftmailer/tests/
swiftmailer/swiftmailer/.gitattributes
swiftmailer/swiftmailer/.gitignore
swiftmailer/swiftmailer/CHANGES
swiftmailer/swiftmailer/README
swiftmailer/swiftmailer/VERSION
swiftmailer/swiftmailer/LICENSE
swiftmailer/swiftmailer/composer.json
**/.travis.yml
guzzlehttp/guzzle/build/
guzzlehttp/guzzle/docs/
guzzlehttp/guzzle/tests/
guzzlehttp/guzzle/.gitignore
guzzlehttp/guzzle/CHANGELOG.md
guzzlehttp/guzzle/composer.json
guzzlehttp/guzzle/MAKEFILE
guzzlehttp/guzzle/phpunit.xml.dist
guzzlehttp/guzzle/README.md
guzzlehttp/guzzle/UPGRADING.md
guzzlehttp/ringphp/docs/
guzzlehttp/ringphp/tests/
guzzlehttp/ringphp/.gitignore
guzzlehttp/ringphp/CHANGELOG.md
guzzlehttp/ringphp/Makefile
guzzlehttp/ringphp/README.rst
guzzlehttp/ringphp/composer.json
guzzlehttp/ringphp/phpunit.xml.dist
guzzlehttp/streams/tests/
guzzlehttp/streams/.gitignore
guzzlehttp/streams/.travis.yml
guzzlehttp/streams/CHANGELOG.rst
guzzlehttp/streams/Makefile
guzzlehttp/streams/README.rst
guzzlehttp/streams/composer.json
guzzlehttp/streams/phpunit.xml.dist
react/promise/tests/
react/promise/.gitignore
react/promise/CHANGELOG.md
react/promise/composer.json
react/promise/phpunit.xml.dist
react/promise/README.md
nikic/php-parser/bin/
nikic/php-parser/doc/
nikic/php-parser/test/
nikic/php-parser/test_old/
nikic/php-parser/grammar/analyze.php
nikic/php-parser/grammar/rebuildParser.php
nikic/php-parser/.gitignore
nikic/php-parser/CHANGELOG.md
nikic/php-parser/README.md
nikic/php-parser/UPGRADE-1.0.md
nikic/php-parser/UPGRADE-2.0.md
nikic/php-parser/UPGRADE-3.0.md
nikic/php-parser/UPGRADE-4.0.md
nikic/php-parser/composer.json
nikic/php-parser/grammar/parser.template
nikic/php-parser/grammar/php5.y
nikic/php-parser/grammar/php7.y
nikic/php-parser/grammar/rebuildParsers.php
nikic/php-parser/grammar/tokens.template
nikic/php-parser/grammar/tokens.y
nikic/php-parser/phpunit.xml.dist
interfasys/lognormalizer/.gitignore
interfasys/lognormalizer/.travis.yml
interfasys/lognormalizer/.scrutinizer.yml
interfasys/lognormalizer/CHANGELOG.md
interfasys/lognormalizer/README.md
interfasys/lognormalizer/composer.json
interfasys/lognormalizer/phpunit.xml
interfasys/lognormalizer/tests
deepdiver1975/tarstreamer/.gitignore
deepdiver1975/tarstreamer/.travis.yml
deepdiver1975/tarstreamer/.scrutinizer.yml
deepdiver1975/tarstreamer/composer.json
deepdiver1975/tarstreamer/tests
patchwork/jsqueeze/tests
patchwork/jsqueeze/phpunit.xml.dist
sabre/dav/examples
sabre/dav/tests
sabre/event/tests
sabre/http/examples
sabre/http/tests
sabre/uri/.gitattributes
sabre/uri/tests
sabre/vobject/CHANGELOG.md
sabre/vobject/tests
sabre/xml/tests
stecman/symfony-console-completion/tests
stecman/symfony-console-completion/.gitignore
stecman/symfony-console-completion/.travis.yml
stecman/symfony-console-completion/composer.json
stecman/symfony-console-completion/phpunit.xml.dist
stecman/symfony-console-completion/README.md
deepdiver/zipstreamer/tests
ircmaxell/security-lib/tests
bantu/ini-get-wrapper/tests
rackspace/php-opencloud/tests
rackspace/php-opencloud/doc
rackspace/php-opencloud/docs
rackspace/php-opencloud/samples
mtdowling/jmespath.php/tests
scssphp/scssphp/example
mikey179/vfsstream

26
nextcloud/3rdparty/LICENSE INFO vendored Normal file
View File

@ -0,0 +1,26 @@
Licenses:
Archive - New BSD License
aws-sdk - apache 2.0
class.phpmailer.php - LGPL
class.smtp.php - LGPL
Console - PHP License 3.0
Crypt_Blowfish - PHP License 3.0
chosen - MIT License
css - see chosen
DropBox - MIT
fullcalendar - GPL / MIT
getid3 - GPL
Google - MIT
js - see chosen
MDB2 - BSD
mediawiki - Apache 2.0
miniColors - GPL / MIT
openid - GPLv3
OS - New BSD License
PEAR - Simplified BSD License
phpass - Public domain
Sabre - New BSD License
smb4php - GPL
System.php - New BSD License
timepicker - GPL / MIT
XML - New BSD License

16
nextcloud/3rdparty/README.md vendored Normal file
View File

@ -0,0 +1,16 @@
3rdparty
========
Some 3rd party libraries that are necessary to run Nextcloud.
[![Dependency Status](https://www.versioneye.com/user/projects/576c043fcd6d510048bab256/badge.svg?style=flat-square)](https://www.versioneye.com/user/projects/576c043fcd6d510048bab256)
## Updating composer dependencies
To check in all required changes for a new, updated or deleted dependency, you just run
```bash
composer run vendor
```
to update the files. Then you can commit all changes.

7
nextcloud/3rdparty/autoload.php vendored Normal file
View File

@ -0,0 +1,7 @@
<?php
// autoload.php @generated by Composer
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit2f23f73bc0cc116b4b1eee1521aa8652::getLoader();

View File

@ -0,0 +1,141 @@
# Apache License
Version 2.0, January 2004
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
## 1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1
through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the
License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled
by, or are under common control with that entity. For the purposes of this definition, "control" means
(i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract
or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial
ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software
source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form,
including but not limited to compiled object code, generated documentation, and conversions to other media
types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License,
as indicated by a copyright notice that is included in or attached to the work (an example is provided in the
Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from)
the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent,
as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not
include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work
and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any
modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to
Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to
submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of
electronic, verbal, or written communication sent to the Licensor or its representatives, including but not
limited to communication on electronic mailing lists, source code control systems, and issue tracking systems
that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise designated in writing by the copyright
owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been
received by Licensor and subsequently incorporated within the Work.
## 2. Grant of Copyright License.
Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare
Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
## 3. Grant of Patent License.
Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent
license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such
license applies only to those patent claims licensable by such Contributor that are necessarily infringed by
their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such
Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim
or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work
constitutes direct or contributory patent infringement, then any patent licenses granted to You under this
License for that Work shall terminate as of the date such litigation is filed.
## 4. Redistribution.
You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You meet the following conditions:
1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
2. You must cause any modified files to carry prominent notices stating that You changed the files; and
3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent,
trademark, and attribution notices from the Source form of the Work, excluding those notices that do
not pertain to any part of the Derivative Works; and
4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that
You distribute must include a readable copy of the attribution notices contained within such NOTICE
file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed as part of the Derivative Works; within
the Source form or documentation, if provided along with the Derivative Works; or, within a display
generated by the Derivative Works, if and wherever such third-party notices normally appear. The
contents of the NOTICE file are for informational purposes only and do not modify the License. You may
add Your own attribution notices within Derivative Works that You distribute, alongside or as an
addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be
construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license
terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative
Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the
conditions stated in this License.
## 5. Submission of Contributions.
Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by
You to the Licensor shall be under the terms and conditions of this License, without any additional terms or
conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate
license agreement you may have executed with Licensor regarding such Contributions.
## 6. Trademarks.
This License does not grant permission to use the trade names, trademarks, service marks, or product names of
the Licensor, except as required for reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
## 7. Disclaimer of Warranty.
Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor
provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
## 8. Limitation of Liability.
In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless
required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any
Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential
damages of any character arising as a result of this License or out of the use or inability to use the Work
(including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has been advised of the possibility
of such damages.
## 9. Accepting Warranty or Additional Liability.
While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for,
acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole
responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold
each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS

View File

@ -0,0 +1,64 @@
# AWS SDK for PHP
<http://aws.amazon.com/php>
Copyright 2010-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License").
You may not use this file except in compliance with the License.
A copy of the License is located at
<http://aws.amazon.com/apache2.0>
or in the "license" file accompanying this file. This file is distributed
on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the specific language governing
permissions and limitations under the License.
# Guzzle
<https://github.com/guzzle/guzzle>
Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
# jmespath.php
<https://github.com/mtdowling/jmespath.php>
Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,67 @@
{
"name": "aws/aws-sdk-php",
"homepage": "http://aws.amazon.com/sdkforphp",
"description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
"keywords": ["aws","amazon","sdk","s3","ec2","dynamodb","cloud","glacier"],
"type": "library",
"license": "Apache-2.0",
"authors": [
{
"name": "Amazon Web Services",
"homepage": "http://aws.amazon.com"
}
],
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues"
},
"require": {
"php": ">=5.5",
"guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0",
"guzzlehttp/psr7": "^1.4.1",
"guzzlehttp/promises": "^1.0",
"mtdowling/jmespath.php": "^2.5",
"ext-pcre": "*",
"ext-json": "*",
"ext-simplexml": "*"
},
"require-dev": {
"ext-openssl": "*",
"ext-dom": "*",
"ext-pcntl": "*",
"ext-sockets": "*",
"phpunit/phpunit": "^4.8.35|^5.4.3",
"behat/behat": "~3.0",
"doctrine/cache": "~1.4",
"aws/aws-php-sns-message-validator": "~1.0",
"nette/neon": "^2.3",
"andrewsville/php-token-reflection": "^1.4",
"psr/cache": "^1.0",
"psr/simple-cache": "^1.0",
"sebastian/comparator": "^1.2.3"
},
"suggest": {
"ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
"ext-curl": "To send requests using cURL",
"ext-sockets": "To use client-side monitoring",
"doctrine/cache": "To use the DoctrineCacheAdapter",
"aws/aws-php-sns-message-validator": "To validate incoming SNS notifications"
},
"autoload": {
"psr-4": {
"Aws\\": "src/"
},
"files": ["src/functions.php"]
},
"autoload-dev": {
"psr-4": {
"Aws\\Test\\": "tests/"
},
"classmap": ["build/"]
},
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
}
}

View File

@ -0,0 +1,49 @@
<?php
namespace Aws\ACMPCA;
use Aws\AwsClient;
/**
* This client is used to interact with the **AWS Certificate Manager Private Certificate Authority** service.
* @method \Aws\Result createCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise createCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result createCertificateAuthorityAuditReport(array $args = [])
* @method \GuzzleHttp\Promise\Promise createCertificateAuthorityAuditReportAsync(array $args = [])
* @method \Aws\Result createPermission(array $args = [])
* @method \GuzzleHttp\Promise\Promise createPermissionAsync(array $args = [])
* @method \Aws\Result deleteCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result deletePermission(array $args = [])
* @method \GuzzleHttp\Promise\Promise deletePermissionAsync(array $args = [])
* @method \Aws\Result describeCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise describeCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result describeCertificateAuthorityAuditReport(array $args = [])
* @method \GuzzleHttp\Promise\Promise describeCertificateAuthorityAuditReportAsync(array $args = [])
* @method \Aws\Result getCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise getCertificateAsync(array $args = [])
* @method \Aws\Result getCertificateAuthorityCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise getCertificateAuthorityCertificateAsync(array $args = [])
* @method \Aws\Result getCertificateAuthorityCsr(array $args = [])
* @method \GuzzleHttp\Promise\Promise getCertificateAuthorityCsrAsync(array $args = [])
* @method \Aws\Result importCertificateAuthorityCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise importCertificateAuthorityCertificateAsync(array $args = [])
* @method \Aws\Result issueCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise issueCertificateAsync(array $args = [])
* @method \Aws\Result listCertificateAuthorities(array $args = [])
* @method \GuzzleHttp\Promise\Promise listCertificateAuthoritiesAsync(array $args = [])
* @method \Aws\Result listPermissions(array $args = [])
* @method \GuzzleHttp\Promise\Promise listPermissionsAsync(array $args = [])
* @method \Aws\Result listTags(array $args = [])
* @method \GuzzleHttp\Promise\Promise listTagsAsync(array $args = [])
* @method \Aws\Result restoreCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise restoreCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result revokeCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise revokeCertificateAsync(array $args = [])
* @method \Aws\Result tagCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise tagCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result untagCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise untagCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result updateCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateCertificateAuthorityAsync(array $args = [])
*/
class ACMPCAClient extends AwsClient {}

View File

@ -0,0 +1,9 @@
<?php
namespace Aws\ACMPCA\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **AWS Certificate Manager Private Certificate Authority** service.
*/
class ACMPCAException extends AwsException {}

View File

@ -0,0 +1,157 @@
<?php
namespace Aws;
use GuzzleHttp\Promise;
/**
* A configuration provider is a function that returns a promise that is
* fulfilled with a configuration object. This class provides base functionality
* usable by specific configuration provider implementations
*/
abstract class AbstractConfigurationProvider
{
const ENV_PROFILE = 'AWS_PROFILE';
const ENV_CONFIG_FILE = 'AWS_CONFIG_FILE';
public static $cacheKey;
protected static $interfaceClass;
protected static $exceptionClass;
/**
* Wraps a config provider and saves provided configuration in an
* instance of Aws\CacheInterface. Forwards calls when no config found
* in cache and updates cache with the results.
*
* @param callable $provider Configuration provider function to wrap
* @param CacheInterface $cache Cache to store configuration
* @param string|null $cacheKey (optional) Cache key to use
*
* @return callable
*/
public static function cache(
callable $provider,
CacheInterface $cache,
$cacheKey = null
) {
$cacheKey = $cacheKey ?: static::$cacheKey;
return function () use ($provider, $cache, $cacheKey) {
$found = $cache->get($cacheKey);
if ($found instanceof static::$interfaceClass) {
return Promise\promise_for($found);
}
return $provider()
->then(function ($config) use (
$cache,
$cacheKey
) {
$cache->set($cacheKey, $config);
return $config;
});
};
}
/**
* Creates an aggregate configuration provider that invokes the provided
* variadic providers one after the other until a provider returns
* configuration.
*
* @return callable
*/
public static function chain()
{
$links = func_get_args();
if (empty($links)) {
throw new \InvalidArgumentException('No providers in chain');
}
return function () use ($links) {
/** @var callable $parent */
$parent = array_shift($links);
$promise = $parent();
while ($next = array_shift($links)) {
$promise = $promise->otherwise($next);
}
return $promise;
};
}
/**
* Gets the environment's HOME directory if available.
*
* @return null|string
*/
protected static function getHomeDir()
{
// On Linux/Unix-like systems, use the HOME environment variable
if ($homeDir = getenv('HOME')) {
return $homeDir;
}
// Get the HOMEDRIVE and HOMEPATH values for Windows hosts
$homeDrive = getenv('HOMEDRIVE');
$homePath = getenv('HOMEPATH');
return ($homeDrive && $homePath) ? $homeDrive . $homePath : null;
}
/**
* Gets default config file location from environment, falling back to aws
* default location
*
* @return string
*/
protected static function getDefaultConfigFilename()
{
if ($filename = getenv(self::ENV_CONFIG_FILE)) {
return $filename;
}
return self::getHomeDir() . '/.aws/config';
}
/**
* Wraps a config provider and caches previously provided configuration.
*
* @param callable $provider Config provider function to wrap.
*
* @return callable
*/
public static function memoize(callable $provider)
{
return function () use ($provider) {
static $result;
static $isConstant;
// Constant config will be returned constantly.
if ($isConstant) {
return $result;
}
// Create the initial promise that will be used as the cached value
if (null === $result) {
$result = $provider();
}
// Return config and set flag that provider is already set
return $result
->then(function ($config) use (&$isConstant) {
$isConstant = true;
return $config;
});
};
}
/**
* Reject promise with standardized exception.
*
* @param $msg
* @return Promise\RejectedPromise
*/
protected static function reject($msg)
{
$exceptionClass = static::$exceptionClass;
return new Promise\RejectedPromise(new $exceptionClass($msg));
}
}

View File

@ -0,0 +1,45 @@
<?php
namespace Aws\AccessAnalyzer;
use Aws\AwsClient;
/**
* This client is used to interact with the **Access Analyzer** service.
* @method \Aws\Result createAnalyzer(array $args = [])
* @method \GuzzleHttp\Promise\Promise createAnalyzerAsync(array $args = [])
* @method \Aws\Result createArchiveRule(array $args = [])
* @method \GuzzleHttp\Promise\Promise createArchiveRuleAsync(array $args = [])
* @method \Aws\Result deleteAnalyzer(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteAnalyzerAsync(array $args = [])
* @method \Aws\Result deleteArchiveRule(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteArchiveRuleAsync(array $args = [])
* @method \Aws\Result getAnalyzedResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise getAnalyzedResourceAsync(array $args = [])
* @method \Aws\Result getAnalyzer(array $args = [])
* @method \GuzzleHttp\Promise\Promise getAnalyzerAsync(array $args = [])
* @method \Aws\Result getArchiveRule(array $args = [])
* @method \GuzzleHttp\Promise\Promise getArchiveRuleAsync(array $args = [])
* @method \Aws\Result getFinding(array $args = [])
* @method \GuzzleHttp\Promise\Promise getFindingAsync(array $args = [])
* @method \Aws\Result listAnalyzedResources(array $args = [])
* @method \GuzzleHttp\Promise\Promise listAnalyzedResourcesAsync(array $args = [])
* @method \Aws\Result listAnalyzers(array $args = [])
* @method \GuzzleHttp\Promise\Promise listAnalyzersAsync(array $args = [])
* @method \Aws\Result listArchiveRules(array $args = [])
* @method \GuzzleHttp\Promise\Promise listArchiveRulesAsync(array $args = [])
* @method \Aws\Result listFindings(array $args = [])
* @method \GuzzleHttp\Promise\Promise listFindingsAsync(array $args = [])
* @method \Aws\Result listTagsForResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise listTagsForResourceAsync(array $args = [])
* @method \Aws\Result startResourceScan(array $args = [])
* @method \GuzzleHttp\Promise\Promise startResourceScanAsync(array $args = [])
* @method \Aws\Result tagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise tagResourceAsync(array $args = [])
* @method \Aws\Result untagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise untagResourceAsync(array $args = [])
* @method \Aws\Result updateArchiveRule(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateArchiveRuleAsync(array $args = [])
* @method \Aws\Result updateFindings(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateFindingsAsync(array $args = [])
*/
class AccessAnalyzerClient extends AwsClient {}

View File

@ -0,0 +1,9 @@
<?php
namespace Aws\AccessAnalyzer\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **Access Analyzer** service.
*/
class AccessAnalyzerException extends AwsException {}

View File

@ -0,0 +1,36 @@
<?php
namespace Aws\Acm;
use Aws\AwsClient;
/**
* This client is used to interact with the **AWS Certificate Manager** service.
*
* @method \Aws\Result addTagsToCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise addTagsToCertificateAsync(array $args = [])
* @method \Aws\Result deleteCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteCertificateAsync(array $args = [])
* @method \Aws\Result describeCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise describeCertificateAsync(array $args = [])
* @method \Aws\Result exportCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise exportCertificateAsync(array $args = [])
* @method \Aws\Result getCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise getCertificateAsync(array $args = [])
* @method \Aws\Result importCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise importCertificateAsync(array $args = [])
* @method \Aws\Result listCertificates(array $args = [])
* @method \GuzzleHttp\Promise\Promise listCertificatesAsync(array $args = [])
* @method \Aws\Result listTagsForCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise listTagsForCertificateAsync(array $args = [])
* @method \Aws\Result removeTagsFromCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise removeTagsFromCertificateAsync(array $args = [])
* @method \Aws\Result renewCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise renewCertificateAsync(array $args = [])
* @method \Aws\Result requestCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise requestCertificateAsync(array $args = [])
* @method \Aws\Result resendValidationEmail(array $args = [])
* @method \GuzzleHttp\Promise\Promise resendValidationEmailAsync(array $args = [])
* @method \Aws\Result updateCertificateOptions(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateCertificateOptionsAsync(array $args = [])
*/
class AcmClient extends AwsClient {}

View File

@ -0,0 +1,9 @@
<?php
namespace Aws\Acm\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **AWS Certificate Manager** service.
*/
class AcmException extends AwsException {}

View File

@ -0,0 +1,195 @@
<?php
namespace Aws\AlexaForBusiness;
use Aws\AwsClient;
/**
* This client is used to interact with the **Alexa For Business** service.
* @method \Aws\Result approveSkill(array $args = [])
* @method \GuzzleHttp\Promise\Promise approveSkillAsync(array $args = [])
* @method \Aws\Result associateContactWithAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateContactWithAddressBookAsync(array $args = [])
* @method \Aws\Result associateDeviceWithNetworkProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateDeviceWithNetworkProfileAsync(array $args = [])
* @method \Aws\Result associateDeviceWithRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateDeviceWithRoomAsync(array $args = [])
* @method \Aws\Result associateSkillGroupWithRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateSkillGroupWithRoomAsync(array $args = [])
* @method \Aws\Result associateSkillWithSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateSkillWithSkillGroupAsync(array $args = [])
* @method \Aws\Result associateSkillWithUsers(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateSkillWithUsersAsync(array $args = [])
* @method \Aws\Result createAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise createAddressBookAsync(array $args = [])
* @method \Aws\Result createBusinessReportSchedule(array $args = [])
* @method \GuzzleHttp\Promise\Promise createBusinessReportScheduleAsync(array $args = [])
* @method \Aws\Result createConferenceProvider(array $args = [])
* @method \GuzzleHttp\Promise\Promise createConferenceProviderAsync(array $args = [])
* @method \Aws\Result createContact(array $args = [])
* @method \GuzzleHttp\Promise\Promise createContactAsync(array $args = [])
* @method \Aws\Result createGatewayGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise createGatewayGroupAsync(array $args = [])
* @method \Aws\Result createNetworkProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise createNetworkProfileAsync(array $args = [])
* @method \Aws\Result createProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise createProfileAsync(array $args = [])
* @method \Aws\Result createRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise createRoomAsync(array $args = [])
* @method \Aws\Result createSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise createSkillGroupAsync(array $args = [])
* @method \Aws\Result createUser(array $args = [])
* @method \GuzzleHttp\Promise\Promise createUserAsync(array $args = [])
* @method \Aws\Result deleteAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteAddressBookAsync(array $args = [])
* @method \Aws\Result deleteBusinessReportSchedule(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteBusinessReportScheduleAsync(array $args = [])
* @method \Aws\Result deleteConferenceProvider(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteConferenceProviderAsync(array $args = [])
* @method \Aws\Result deleteContact(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteContactAsync(array $args = [])
* @method \Aws\Result deleteDevice(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteDeviceAsync(array $args = [])
* @method \Aws\Result deleteDeviceUsageData(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteDeviceUsageDataAsync(array $args = [])
* @method \Aws\Result deleteGatewayGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteGatewayGroupAsync(array $args = [])
* @method \Aws\Result deleteNetworkProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteNetworkProfileAsync(array $args = [])
* @method \Aws\Result deleteProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteProfileAsync(array $args = [])
* @method \Aws\Result deleteRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteRoomAsync(array $args = [])
* @method \Aws\Result deleteRoomSkillParameter(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteRoomSkillParameterAsync(array $args = [])
* @method \Aws\Result deleteSkillAuthorization(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteSkillAuthorizationAsync(array $args = [])
* @method \Aws\Result deleteSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteSkillGroupAsync(array $args = [])
* @method \Aws\Result deleteUser(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteUserAsync(array $args = [])
* @method \Aws\Result disassociateContactFromAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise disassociateContactFromAddressBookAsync(array $args = [])
* @method \Aws\Result disassociateDeviceFromRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise disassociateDeviceFromRoomAsync(array $args = [])
* @method \Aws\Result disassociateSkillFromSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise disassociateSkillFromSkillGroupAsync(array $args = [])
* @method \Aws\Result disassociateSkillFromUsers(array $args = [])
* @method \GuzzleHttp\Promise\Promise disassociateSkillFromUsersAsync(array $args = [])
* @method \Aws\Result disassociateSkillGroupFromRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise disassociateSkillGroupFromRoomAsync(array $args = [])
* @method \Aws\Result forgetSmartHomeAppliances(array $args = [])
* @method \GuzzleHttp\Promise\Promise forgetSmartHomeAppliancesAsync(array $args = [])
* @method \Aws\Result getAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise getAddressBookAsync(array $args = [])
* @method \Aws\Result getConferencePreference(array $args = [])
* @method \GuzzleHttp\Promise\Promise getConferencePreferenceAsync(array $args = [])
* @method \Aws\Result getConferenceProvider(array $args = [])
* @method \GuzzleHttp\Promise\Promise getConferenceProviderAsync(array $args = [])
* @method \Aws\Result getContact(array $args = [])
* @method \GuzzleHttp\Promise\Promise getContactAsync(array $args = [])
* @method \Aws\Result getDevice(array $args = [])
* @method \GuzzleHttp\Promise\Promise getDeviceAsync(array $args = [])
* @method \Aws\Result getGateway(array $args = [])
* @method \GuzzleHttp\Promise\Promise getGatewayAsync(array $args = [])
* @method \Aws\Result getGatewayGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise getGatewayGroupAsync(array $args = [])
* @method \Aws\Result getInvitationConfiguration(array $args = [])
* @method \GuzzleHttp\Promise\Promise getInvitationConfigurationAsync(array $args = [])
* @method \Aws\Result getNetworkProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise getNetworkProfileAsync(array $args = [])
* @method \Aws\Result getProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise getProfileAsync(array $args = [])
* @method \Aws\Result getRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise getRoomAsync(array $args = [])
* @method \Aws\Result getRoomSkillParameter(array $args = [])
* @method \GuzzleHttp\Promise\Promise getRoomSkillParameterAsync(array $args = [])
* @method \Aws\Result getSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise getSkillGroupAsync(array $args = [])
* @method \Aws\Result listBusinessReportSchedules(array $args = [])
* @method \GuzzleHttp\Promise\Promise listBusinessReportSchedulesAsync(array $args = [])
* @method \Aws\Result listConferenceProviders(array $args = [])
* @method \GuzzleHttp\Promise\Promise listConferenceProvidersAsync(array $args = [])
* @method \Aws\Result listDeviceEvents(array $args = [])
* @method \GuzzleHttp\Promise\Promise listDeviceEventsAsync(array $args = [])
* @method \Aws\Result listGatewayGroups(array $args = [])
* @method \GuzzleHttp\Promise\Promise listGatewayGroupsAsync(array $args = [])
* @method \Aws\Result listGateways(array $args = [])
* @method \GuzzleHttp\Promise\Promise listGatewaysAsync(array $args = [])
* @method \Aws\Result listSkills(array $args = [])
* @method \GuzzleHttp\Promise\Promise listSkillsAsync(array $args = [])
* @method \Aws\Result listSkillsStoreCategories(array $args = [])
* @method \GuzzleHttp\Promise\Promise listSkillsStoreCategoriesAsync(array $args = [])
* @method \Aws\Result listSkillsStoreSkillsByCategory(array $args = [])
* @method \GuzzleHttp\Promise\Promise listSkillsStoreSkillsByCategoryAsync(array $args = [])
* @method \Aws\Result listSmartHomeAppliances(array $args = [])
* @method \GuzzleHttp\Promise\Promise listSmartHomeAppliancesAsync(array $args = [])
* @method \Aws\Result listTags(array $args = [])
* @method \GuzzleHttp\Promise\Promise listTagsAsync(array $args = [])
* @method \Aws\Result putConferencePreference(array $args = [])
* @method \GuzzleHttp\Promise\Promise putConferencePreferenceAsync(array $args = [])
* @method \Aws\Result putInvitationConfiguration(array $args = [])
* @method \GuzzleHttp\Promise\Promise putInvitationConfigurationAsync(array $args = [])
* @method \Aws\Result putRoomSkillParameter(array $args = [])
* @method \GuzzleHttp\Promise\Promise putRoomSkillParameterAsync(array $args = [])
* @method \Aws\Result putSkillAuthorization(array $args = [])
* @method \GuzzleHttp\Promise\Promise putSkillAuthorizationAsync(array $args = [])
* @method \Aws\Result registerAVSDevice(array $args = [])
* @method \GuzzleHttp\Promise\Promise registerAVSDeviceAsync(array $args = [])
* @method \Aws\Result rejectSkill(array $args = [])
* @method \GuzzleHttp\Promise\Promise rejectSkillAsync(array $args = [])
* @method \Aws\Result resolveRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise resolveRoomAsync(array $args = [])
* @method \Aws\Result revokeInvitation(array $args = [])
* @method \GuzzleHttp\Promise\Promise revokeInvitationAsync(array $args = [])
* @method \Aws\Result searchAddressBooks(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchAddressBooksAsync(array $args = [])
* @method \Aws\Result searchContacts(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchContactsAsync(array $args = [])
* @method \Aws\Result searchDevices(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchDevicesAsync(array $args = [])
* @method \Aws\Result searchNetworkProfiles(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchNetworkProfilesAsync(array $args = [])
* @method \Aws\Result searchProfiles(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchProfilesAsync(array $args = [])
* @method \Aws\Result searchRooms(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchRoomsAsync(array $args = [])
* @method \Aws\Result searchSkillGroups(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchSkillGroupsAsync(array $args = [])
* @method \Aws\Result searchUsers(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchUsersAsync(array $args = [])
* @method \Aws\Result sendAnnouncement(array $args = [])
* @method \GuzzleHttp\Promise\Promise sendAnnouncementAsync(array $args = [])
* @method \Aws\Result sendInvitation(array $args = [])
* @method \GuzzleHttp\Promise\Promise sendInvitationAsync(array $args = [])
* @method \Aws\Result startDeviceSync(array $args = [])
* @method \GuzzleHttp\Promise\Promise startDeviceSyncAsync(array $args = [])
* @method \Aws\Result startSmartHomeApplianceDiscovery(array $args = [])
* @method \GuzzleHttp\Promise\Promise startSmartHomeApplianceDiscoveryAsync(array $args = [])
* @method \Aws\Result tagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise tagResourceAsync(array $args = [])
* @method \Aws\Result untagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise untagResourceAsync(array $args = [])
* @method \Aws\Result updateAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateAddressBookAsync(array $args = [])
* @method \Aws\Result updateBusinessReportSchedule(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateBusinessReportScheduleAsync(array $args = [])
* @method \Aws\Result updateConferenceProvider(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateConferenceProviderAsync(array $args = [])
* @method \Aws\Result updateContact(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateContactAsync(array $args = [])
* @method \Aws\Result updateDevice(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateDeviceAsync(array $args = [])
* @method \Aws\Result updateGateway(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateGatewayAsync(array $args = [])
* @method \Aws\Result updateGatewayGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateGatewayGroupAsync(array $args = [])
* @method \Aws\Result updateNetworkProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateNetworkProfileAsync(array $args = [])
* @method \Aws\Result updateProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateProfileAsync(array $args = [])
* @method \Aws\Result updateRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateRoomAsync(array $args = [])
* @method \Aws\Result updateSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateSkillGroupAsync(array $args = [])
*/
class AlexaForBusinessClient extends AwsClient {}

View File

@ -0,0 +1,9 @@
<?php
namespace Aws\AlexaForBusiness\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **Alexa For Business** service.
*/
class AlexaForBusinessException extends AwsException {}

View File

@ -0,0 +1,83 @@
<?php
namespace Aws\Amplify;
use Aws\AwsClient;
/**
* This client is used to interact with the **AWS Amplify** service.
* @method \Aws\Result createApp(array $args = [])
* @method \GuzzleHttp\Promise\Promise createAppAsync(array $args = [])
* @method \Aws\Result createBackendEnvironment(array $args = [])
* @method \GuzzleHttp\Promise\Promise createBackendEnvironmentAsync(array $args = [])
* @method \Aws\Result createBranch(array $args = [])
* @method \GuzzleHttp\Promise\Promise createBranchAsync(array $args = [])
* @method \Aws\Result createDeployment(array $args = [])
* @method \GuzzleHttp\Promise\Promise createDeploymentAsync(array $args = [])
* @method \Aws\Result createDomainAssociation(array $args = [])
* @method \GuzzleHttp\Promise\Promise createDomainAssociationAsync(array $args = [])
* @method \Aws\Result createWebhook(array $args = [])
* @method \GuzzleHttp\Promise\Promise createWebhookAsync(array $args = [])
* @method \Aws\Result deleteApp(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteAppAsync(array $args = [])
* @method \Aws\Result deleteBackendEnvironment(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteBackendEnvironmentAsync(array $args = [])
* @method \Aws\Result deleteBranch(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteBranchAsync(array $args = [])
* @method \Aws\Result deleteDomainAssociation(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteDomainAssociationAsync(array $args = [])
* @method \Aws\Result deleteJob(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteJobAsync(array $args = [])
* @method \Aws\Result deleteWebhook(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteWebhookAsync(array $args = [])
* @method \Aws\Result generateAccessLogs(array $args = [])
* @method \GuzzleHttp\Promise\Promise generateAccessLogsAsync(array $args = [])
* @method \Aws\Result getApp(array $args = [])
* @method \GuzzleHttp\Promise\Promise getAppAsync(array $args = [])
* @method \Aws\Result getArtifactUrl(array $args = [])
* @method \GuzzleHttp\Promise\Promise getArtifactUrlAsync(array $args = [])
* @method \Aws\Result getBackendEnvironment(array $args = [])
* @method \GuzzleHttp\Promise\Promise getBackendEnvironmentAsync(array $args = [])
* @method \Aws\Result getBranch(array $args = [])
* @method \GuzzleHttp\Promise\Promise getBranchAsync(array $args = [])
* @method \Aws\Result getDomainAssociation(array $args = [])
* @method \GuzzleHttp\Promise\Promise getDomainAssociationAsync(array $args = [])
* @method \Aws\Result getJob(array $args = [])
* @method \GuzzleHttp\Promise\Promise getJobAsync(array $args = [])
* @method \Aws\Result getWebhook(array $args = [])
* @method \GuzzleHttp\Promise\Promise getWebhookAsync(array $args = [])
* @method \Aws\Result listApps(array $args = [])
* @method \GuzzleHttp\Promise\Promise listAppsAsync(array $args = [])
* @method \Aws\Result listArtifacts(array $args = [])
* @method \GuzzleHttp\Promise\Promise listArtifactsAsync(array $args = [])
* @method \Aws\Result listBackendEnvironments(array $args = [])
* @method \GuzzleHttp\Promise\Promise listBackendEnvironmentsAsync(array $args = [])
* @method \Aws\Result listBranches(array $args = [])
* @method \GuzzleHttp\Promise\Promise listBranchesAsync(array $args = [])
* @method \Aws\Result listDomainAssociations(array $args = [])
* @method \GuzzleHttp\Promise\Promise listDomainAssociationsAsync(array $args = [])
* @method \Aws\Result listJobs(array $args = [])
* @method \GuzzleHttp\Promise\Promise listJobsAsync(array $args = [])
* @method \Aws\Result listTagsForResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise listTagsForResourceAsync(array $args = [])
* @method \Aws\Result listWebhooks(array $args = [])
* @method \GuzzleHttp\Promise\Promise listWebhooksAsync(array $args = [])
* @method \Aws\Result startDeployment(array $args = [])
* @method \GuzzleHttp\Promise\Promise startDeploymentAsync(array $args = [])
* @method \Aws\Result startJob(array $args = [])
* @method \GuzzleHttp\Promise\Promise startJobAsync(array $args = [])
* @method \Aws\Result stopJob(array $args = [])
* @method \GuzzleHttp\Promise\Promise stopJobAsync(array $args = [])
* @method \Aws\Result tagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise tagResourceAsync(array $args = [])
* @method \Aws\Result untagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise untagResourceAsync(array $args = [])
* @method \Aws\Result updateApp(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateAppAsync(array $args = [])
* @method \Aws\Result updateBranch(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateBranchAsync(array $args = [])
* @method \Aws\Result updateDomainAssociation(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateDomainAssociationAsync(array $args = [])
* @method \Aws\Result updateWebhook(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateWebhookAsync(array $args = [])
*/
class AmplifyClient extends AwsClient {}

View File

@ -0,0 +1,9 @@
<?php
namespace Aws\Amplify\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **AWS Amplify** service.
*/
class AmplifyException extends AwsException {}

View File

@ -0,0 +1,67 @@
<?php
namespace Aws\Api;
/**
* Base class that is used by most API shapes
*/
abstract class AbstractModel implements \ArrayAccess
{
/** @var array */
protected $definition;
/** @var ShapeMap */
protected $shapeMap;
/**
* @param array $definition Service description
* @param ShapeMap $shapeMap Shapemap used for creating shapes
*/
public function __construct(array $definition, ShapeMap $shapeMap)
{
$this->definition = $definition;
$this->shapeMap = $shapeMap;
}
public function toArray()
{
return $this->definition;
}
public function offsetGet($offset)
{
return isset($this->definition[$offset])
? $this->definition[$offset] : null;
}
public function offsetSet($offset, $value)
{
$this->definition[$offset] = $value;
}
public function offsetExists($offset)
{
return isset($this->definition[$offset]);
}
public function offsetUnset($offset)
{
unset($this->definition[$offset]);
}
protected function shapeAt($key)
{
if (!isset($this->definition[$key])) {
throw new \InvalidArgumentException('Expected shape definition at '
. $key);
}
return $this->shapeFor($this->definition[$key]);
}
protected function shapeFor(array $definition)
{
return isset($definition['shape'])
? $this->shapeMap->resolve($definition)
: Shape::create($definition, $this->shapeMap);
}
}

View File

@ -0,0 +1,244 @@
<?php
namespace Aws\Api;
use Aws\Exception\UnresolvedApiException;
/**
* API providers.
*
* An API provider is a function that accepts a type, service, and version and
* returns an array of API data on success or NULL if no API data can be created
* for the provided arguments.
*
* You can wrap your calls to an API provider with the
* {@see ApiProvider::resolve} method to ensure that API data is created. If the
* API data is not created, then the resolve() method will throw a
* {@see Aws\Exception\UnresolvedApiException}.
*
* use Aws\Api\ApiProvider;
* $provider = ApiProvider::defaultProvider();
* // Returns an array or NULL.
* $data = $provider('api', 's3', '2006-03-01');
* // Returns an array or throws.
* $data = ApiProvider::resolve($provider, 'api', 'elasticfood', '2020-01-01');
*
* You can compose multiple providers into a single provider using
* {@see Aws\or_chain}. This method accepts providers as arguments and
* returns a new function that will invoke each provider until a non-null value
* is returned.
*
* $a = ApiProvider::filesystem(sys_get_temp_dir() . '/aws-beta-models');
* $b = ApiProvider::manifest();
*
* $c = \Aws\or_chain($a, $b);
* $data = $c('api', 'betaservice', '2015-08-08'); // $a handles this.
* $data = $c('api', 's3', '2006-03-01'); // $b handles this.
* $data = $c('api', 'invalid', '2014-12-15'); // Neither handles this.
*/
class ApiProvider
{
/** @var array A map of public API type names to their file suffix. */
private static $typeMap = [
'api' => 'api-2',
'paginator' => 'paginators-1',
'waiter' => 'waiters-2',
'docs' => 'docs-2',
];
/** @var array API manifest */
private $manifest;
/** @var string The directory containing service models. */
private $modelsDir;
/**
* Resolves an API provider and ensures a non-null return value.
*
* @param callable $provider Provider function to invoke.
* @param string $type Type of data ('api', 'waiter', 'paginator').
* @param string $service Service name.
* @param string $version API version.
*
* @return array
* @throws UnresolvedApiException
*/
public static function resolve(callable $provider, $type, $service, $version)
{
// Execute the provider and return the result, if there is one.
$result = $provider($type, $service, $version);
if (is_array($result)) {
if (!isset($result['metadata']['serviceIdentifier'])) {
$result['metadata']['serviceIdentifier'] = $service;
}
return $result;
}
// Throw an exception with a message depending on the inputs.
if (!isset(self::$typeMap[$type])) {
$msg = "The type must be one of: " . implode(', ', self::$typeMap);
} elseif ($service) {
$msg = "The {$service} service does not have version: {$version}.";
} else {
$msg = "You must specify a service name to retrieve its API data.";
}
throw new UnresolvedApiException($msg);
}
/**
* Default SDK API provider.
*
* This provider loads pre-built manifest data from the `data` directory.
*
* @return self
*/
public static function defaultProvider()
{
return new self(__DIR__ . '/../data', \Aws\manifest());
}
/**
* Loads API data after resolving the version to the latest, compatible,
* available version based on the provided manifest data.
*
* Manifest data is essentially an associative array of service names to
* associative arrays of API version aliases.
*
* [
* ...
* 'ec2' => [
* 'latest' => '2014-10-01',
* '2014-10-01' => '2014-10-01',
* '2014-09-01' => '2014-10-01',
* '2014-06-15' => '2014-10-01',
* ...
* ],
* 'ecs' => [...],
* 'elasticache' => [...],
* ...
* ]
*
* @param string $dir Directory containing service models.
* @param array $manifest The API version manifest data.
*
* @return self
*/
public static function manifest($dir, array $manifest)
{
return new self($dir, $manifest);
}
/**
* Loads API data from the specified directory.
*
* If "latest" is specified as the version, this provider must glob the
* directory to find which is the latest available version.
*
* @param string $dir Directory containing service models.
*
* @return self
* @throws \InvalidArgumentException if the provided `$dir` is invalid.
*/
public static function filesystem($dir)
{
return new self($dir);
}
/**
* Retrieves a list of valid versions for the specified service.
*
* @param string $service Service name
*
* @return array
*/
public function getVersions($service)
{
if (!isset($this->manifest)) {
$this->buildVersionsList($service);
}
if (!isset($this->manifest[$service]['versions'])) {
return [];
}
return array_values(array_unique($this->manifest[$service]['versions']));
}
/**
* Execute the provider.
*
* @param string $type Type of data ('api', 'waiter', 'paginator').
* @param string $service Service name.
* @param string $version API version.
*
* @return array|null
*/
public function __invoke($type, $service, $version)
{
// Resolve the type or return null.
if (isset(self::$typeMap[$type])) {
$type = self::$typeMap[$type];
} else {
return null;
}
// Resolve the version or return null.
if (!isset($this->manifest)) {
$this->buildVersionsList($service);
}
if (!isset($this->manifest[$service]['versions'][$version])) {
return null;
}
$version = $this->manifest[$service]['versions'][$version];
$path = "{$this->modelsDir}/{$service}/{$version}/{$type}.json";
try {
return \Aws\load_compiled_json($path);
} catch (\InvalidArgumentException $e) {
return null;
}
}
/**
* @param string $modelsDir Directory containing service models.
* @param array $manifest The API version manifest data.
*/
private function __construct($modelsDir, array $manifest = null)
{
$this->manifest = $manifest;
$this->modelsDir = rtrim($modelsDir, '/');
if (!is_dir($this->modelsDir)) {
throw new \InvalidArgumentException(
"The specified models directory, {$modelsDir}, was not found."
);
}
}
/**
* Build the versions list for the specified service by globbing the dir.
*/
private function buildVersionsList($service)
{
$dir = "{$this->modelsDir}/{$service}/";
if (!is_dir($dir)) {
return;
}
// Get versions, remove . and .., and sort in descending order.
$results = array_diff(scandir($dir, SCANDIR_SORT_DESCENDING), ['..', '.']);
if (!$results) {
$this->manifest[$service] = ['versions' => []];
} else {
$this->manifest[$service] = [
'versions' => [
'latest' => $results[0]
]
];
$this->manifest[$service]['versions'] += array_combine($results, $results);
}
}
}

View File

@ -0,0 +1,41 @@
<?php
namespace Aws\Api;
/**
* DateTime overrides that make DateTime work more seamlessly as a string,
* with JSON documents, and with JMESPath.
*/
class DateTimeResult extends \DateTime implements \JsonSerializable
{
/**
* Create a new DateTimeResult from a unix timestamp.
*
* @param $unixTimestamp
*
* @return DateTimeResult
*/
public static function fromEpoch($unixTimestamp)
{
return new self(gmdate('c', $unixTimestamp));
}
/**
* Serialize the DateTimeResult as an ISO 8601 date string.
*
* @return string
*/
public function __toString()
{
return $this->format('c');
}
/**
* Serialize the date as an ISO 8601 date when serializing as JSON.
*
* @return mixed|string
*/
public function jsonSerialize()
{
return (string) $this;
}
}

View File

@ -0,0 +1,128 @@
<?php
namespace Aws\Api;
/**
* Encapsulates the documentation strings for a given service-version and
* provides methods for extracting the desired parts related to a service,
* operation, error, or shape (i.e., parameter).
*/
class DocModel
{
/** @var array */
private $docs;
/**
* @param array $docs
*
* @throws \RuntimeException
*/
public function __construct(array $docs)
{
if (!extension_loaded('tidy')) {
throw new \RuntimeException('The "tidy" PHP extension is required.');
}
$this->docs = $docs;
}
/**
* Convert the doc model to an array.
*
* @return array
*/
public function toArray()
{
return $this->docs;
}
/**
* Retrieves documentation about the service.
*
* @return null|string
*/
public function getServiceDocs()
{
return isset($this->docs['service']) ? $this->docs['service'] : null;
}
/**
* Retrieves documentation about an operation.
*
* @param string $operation Name of the operation
*
* @return null|string
*/
public function getOperationDocs($operation)
{
return isset($this->docs['operations'][$operation])
? $this->docs['operations'][$operation]
: null;
}
/**
* Retrieves documentation about an error.
*
* @param string $error Name of the error
*
* @return null|string
*/
public function getErrorDocs($error)
{
return isset($this->docs['shapes'][$error]['base'])
? $this->docs['shapes'][$error]['base']
: null;
}
/**
* Retrieves documentation about a shape, specific to the context.
*
* @param string $shapeName Name of the shape.
* @param string $parentName Name of the parent/context shape.
* @param string $ref Name used by the context to reference the shape.
*
* @return null|string
*/
public function getShapeDocs($shapeName, $parentName, $ref)
{
if (!isset($this->docs['shapes'][$shapeName])) {
return '';
}
$result = '';
$d = $this->docs['shapes'][$shapeName];
if (isset($d['refs']["{$parentName}\$${ref}"])) {
$result = $d['refs']["{$parentName}\$${ref}"];
} elseif (isset($d['base'])) {
$result = $d['base'];
}
if (isset($d['append'])) {
$result .= $d['append'];
}
return $this->clean($result);
}
private function clean($content)
{
if (!$content) {
return '';
}
$tidy = new \tidy();
$tidy->parseString($content, [
'indent' => true,
'doctype' => 'omit',
'output-html' => true,
'show-body-only' => true,
'drop-empty-paras' => true,
'drop-font-tags' => true,
'drop-proprietary-attributes' => true,
'hide-comments' => true,
'logical-emphasis' => true
]);
$tidy->cleanRepair();
return (string) $content;
}
}

View File

@ -0,0 +1,94 @@
<?php
namespace Aws\Api\ErrorParser;
use Aws\Api\Parser\MetadataParserTrait;
use Aws\Api\Parser\PayloadParserTrait;
use Aws\Api\Service;
use Aws\Api\StructureShape;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
abstract class AbstractErrorParser
{
use MetadataParserTrait;
use PayloadParserTrait;
/**
* @var Service
*/
protected $api;
/**
* @param Service $api
*/
public function __construct(Service $api = null)
{
$this->api = $api;
}
abstract protected function payload(
ResponseInterface $response,
StructureShape $member
);
protected function extractPayload(
StructureShape $member,
ResponseInterface $response
) {
if ($member instanceof StructureShape) {
// Structure members parse top-level data into a specific key.
return $this->payload($response, $member);
} else {
// Streaming data is just the stream from the response body.
return $response->getBody();
}
}
protected function populateShape(
array &$data,
ResponseInterface $response,
CommandInterface $command = null
) {
$data['body'] = [];
if (!empty($command) && !empty($this->api)) {
// If modeled error code is indicated, check for known error shape
if (!empty($data['code'])) {
$errors = $this->api->getOperation($command->getName())->getErrors();
foreach ($errors as $key => $error) {
// If error code matches a known error shape, populate the body
if ($data['code'] == $error['name']
&& $error instanceof StructureShape
) {
$modeledError = $error;
$data['body'] = $this->extractPayload(
$modeledError,
$response
);
foreach ($error->getMembers() as $name => $member) {
switch ($member['location']) {
case 'header':
$this->extractHeader($name, $member, $response, $data['body']);
break;
case 'headers':
$this->extractHeaders($name, $member, $response, $data['body']);
break;
case 'statusCode':
$this->extractStatus($name, $response, $data['body']);
break;
}
}
break;
}
}
}
}
return $data;
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace Aws\Api\ErrorParser;
use Aws\Api\Parser\PayloadParserTrait;
use Aws\Api\StructureShape;
use Psr\Http\Message\ResponseInterface;
/**
* Provides basic JSON error parsing functionality.
*/
trait JsonParserTrait
{
use PayloadParserTrait;
private function genericHandler(ResponseInterface $response)
{
$code = (string) $response->getStatusCode();
return [
'request_id' => (string) $response->getHeaderLine('x-amzn-requestid'),
'code' => null,
'message' => null,
'type' => $code[0] == '4' ? 'client' : 'server',
'parsed' => $this->parseJson($response->getBody(), $response)
];
}
protected function payload(
ResponseInterface $response,
StructureShape $member
) {
$jsonBody = $this->parseJson($response->getBody(), $response);
if ($jsonBody) {
return $this->parser->parse($member, $jsonBody);
}
}
}

View File

@ -0,0 +1,47 @@
<?php
namespace Aws\Api\ErrorParser;
use Aws\Api\Parser\JsonParser;
use Aws\Api\Service;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
/**
* Parsers JSON-RPC errors.
*/
class JsonRpcErrorParser extends AbstractErrorParser
{
use JsonParserTrait;
private $parser;
public function __construct(Service $api = null, JsonParser $parser = null)
{
parent::__construct($api);
$this->parser = $parser ?: new JsonParser();
}
public function __invoke(
ResponseInterface $response,
CommandInterface $command = null
) {
$data = $this->genericHandler($response);
// Make the casing consistent across services.
if ($data['parsed']) {
$data['parsed'] = array_change_key_case($data['parsed']);
}
if (isset($data['parsed']['__type'])) {
$parts = explode('#', $data['parsed']['__type']);
$data['code'] = isset($parts[1]) ? $parts[1] : $parts[0];
$data['message'] = isset($data['parsed']['message'])
? $data['parsed']['message']
: null;
}
$this->populateShape($data, $response, $command);
return $data;
}
}

View File

@ -0,0 +1,58 @@
<?php
namespace Aws\Api\ErrorParser;
use Aws\Api\Parser\JsonParser;
use Aws\Api\Service;
use Aws\Api\StructureShape;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
/**
* Parses JSON-REST errors.
*/
class RestJsonErrorParser extends AbstractErrorParser
{
use JsonParserTrait;
private $parser;
public function __construct(Service $api = null, JsonParser $parser = null)
{
parent::__construct($api);
$this->parser = $parser ?: new JsonParser();
}
public function __invoke(
ResponseInterface $response,
CommandInterface $command = null
) {
$data = $this->genericHandler($response);
// Merge in error data from the JSON body
if ($json = $data['parsed']) {
$data = array_replace($data, $json);
}
// Correct error type from services like Amazon Glacier
if (!empty($data['type'])) {
$data['type'] = strtolower($data['type']);
}
// Retrieve the error code from services like Amazon Elastic Transcoder
if ($code = $response->getHeaderLine('x-amzn-errortype')) {
$colon = strpos($code, ':');
$data['code'] = $colon ? substr($code, 0, $colon) : $code;
}
// Retrieve error message directly
$data['message'] = isset($data['parsed']['message'])
? $data['parsed']['message']
: (isset($data['parsed']['Message'])
? $data['parsed']['Message']
: null);
$this->populateShape($data, $response, $command);
return $data;
}
}

View File

@ -0,0 +1,111 @@
<?php
namespace Aws\Api\ErrorParser;
use Aws\Api\Parser\PayloadParserTrait;
use Aws\Api\Parser\XmlParser;
use Aws\Api\Service;
use Aws\Api\StructureShape;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
/**
* Parses XML errors.
*/
class XmlErrorParser extends AbstractErrorParser
{
use PayloadParserTrait;
protected $parser;
public function __construct(Service $api = null, XmlParser $parser = null)
{
parent::__construct($api);
$this->parser = $parser ?: new XmlParser();
}
public function __invoke(
ResponseInterface $response,
CommandInterface $command = null
) {
$code = (string) $response->getStatusCode();
$data = [
'type' => $code[0] == '4' ? 'client' : 'server',
'request_id' => null,
'code' => null,
'message' => null,
'parsed' => null
];
$body = $response->getBody();
if ($body->getSize() > 0) {
$this->parseBody($this->parseXml($body, $response), $data);
} else {
$this->parseHeaders($response, $data);
}
$this->populateShape($data, $response, $command);
return $data;
}
private function parseHeaders(ResponseInterface $response, array &$data)
{
if ($response->getStatusCode() == '404') {
$data['code'] = 'NotFound';
}
$data['message'] = $response->getStatusCode() . ' '
. $response->getReasonPhrase();
if ($requestId = $response->getHeaderLine('x-amz-request-id')) {
$data['request_id'] = $requestId;
$data['message'] .= " (Request-ID: $requestId)";
}
}
private function parseBody(\SimpleXMLElement $body, array &$data)
{
$data['parsed'] = $body;
$prefix = $this->registerNamespacePrefix($body);
if ($tempXml = $body->xpath("//{$prefix}Code[1]")) {
$data['code'] = (string) $tempXml[0];
}
if ($tempXml = $body->xpath("//{$prefix}Message[1]")) {
$data['message'] = (string) $tempXml[0];
}
$tempXml = $body->xpath("//{$prefix}RequestId[1]");
if (isset($tempXml[0])) {
$data['request_id'] = (string)$tempXml[0];
}
}
protected function registerNamespacePrefix(\SimpleXMLElement $element)
{
$namespaces = $element->getDocNamespaces();
if (!isset($namespaces[''])) {
return '';
}
// Account for the default namespace being defined and PHP not
// being able to handle it :(.
$element->registerXPathNamespace('ns', $namespaces['']);
return 'ns:';
}
protected function payload(
ResponseInterface $response,
StructureShape $member
) {
$xmlBody = $this->parseXml($response->getBody(), $response);
$prefix = $this->registerNamespacePrefix($xmlBody);
$errorBody = $xmlBody->xpath("//{$prefix}Error");
if (is_array($errorBody) && !empty($errorBody[0])) {
return $this->parser->parse($member, $errorBody[0]);
}
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace Aws\Api;
/**
* Represents a list shape.
*/
class ListShape extends Shape
{
private $member;
public function __construct(array $definition, ShapeMap $shapeMap)
{
$definition['type'] = 'list';
parent::__construct($definition, $shapeMap);
}
/**
* @return Shape
* @throws \RuntimeException if no member is specified
*/
public function getMember()
{
if (!$this->member) {
if (!isset($this->definition['member'])) {
throw new \RuntimeException('No member attribute specified');
}
$this->member = Shape::create(
$this->definition['member'],
$this->shapeMap
);
}
return $this->member;
}
}

View File

@ -0,0 +1,54 @@
<?php
namespace Aws\Api;
/**
* Represents a map shape.
*/
class MapShape extends Shape
{
/** @var Shape */
private $value;
/** @var Shape */
private $key;
public function __construct(array $definition, ShapeMap $shapeMap)
{
$definition['type'] = 'map';
parent::__construct($definition, $shapeMap);
}
/**
* @return Shape
* @throws \RuntimeException if no value is specified
*/
public function getValue()
{
if (!$this->value) {
if (!isset($this->definition['value'])) {
throw new \RuntimeException('No value specified');
}
$this->value = Shape::create(
$this->definition['value'],
$this->shapeMap
);
}
return $this->value;
}
/**
* @return Shape
*/
public function getKey()
{
if (!$this->key) {
$this->key = isset($this->definition['key'])
? Shape::create($this->definition['key'], $this->shapeMap)
: new Shape(['type' => 'string'], $this->shapeMap);
}
return $this->key;
}
}

View File

@ -0,0 +1,97 @@
<?php
namespace Aws\Api;
/**
* Represents an API operation.
*/
class Operation extends AbstractModel
{
private $input;
private $output;
private $errors;
public function __construct(array $definition, ShapeMap $shapeMap)
{
$definition['type'] = 'structure';
if (!isset($definition['http']['method'])) {
$definition['http']['method'] = 'POST';
}
if (!isset($definition['http']['requestUri'])) {
$definition['http']['requestUri'] = '/';
}
parent::__construct($definition, $shapeMap);
}
/**
* Returns an associative array of the HTTP attribute of the operation:
*
* - method: HTTP method of the operation
* - requestUri: URI of the request (can include URI template placeholders)
*
* @return array
*/
public function getHttp()
{
return $this->definition['http'];
}
/**
* Get the input shape of the operation.
*
* @return StructureShape
*/
public function getInput()
{
if (!$this->input) {
if ($input = $this['input']) {
$this->input = $this->shapeFor($input);
} else {
$this->input = new StructureShape([], $this->shapeMap);
}
}
return $this->input;
}
/**
* Get the output shape of the operation.
*
* @return StructureShape
*/
public function getOutput()
{
if (!$this->output) {
if ($output = $this['output']) {
$this->output = $this->shapeFor($output);
} else {
$this->output = new StructureShape([], $this->shapeMap);
}
}
return $this->output;
}
/**
* Get an array of operation error shapes.
*
* @return Shape[]
*/
public function getErrors()
{
if ($this->errors === null) {
if ($errors = $this['errors']) {
foreach ($errors as $key => $error) {
$errors[$key] = $this->shapeFor($error);
}
$this->errors = $errors;
} else {
$this->errors = [];
}
}
return $this->errors;
}
}

View File

@ -0,0 +1,46 @@
<?php
namespace Aws\Api\Parser;
use Aws\Api\Service;
use Aws\Api\StructureShape;
use Aws\CommandInterface;
use Aws\ResultInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
/**
* @internal
*/
abstract class AbstractParser
{
/** @var \Aws\Api\Service Representation of the service API*/
protected $api;
/** @var callable */
protected $parser;
/**
* @param Service $api Service description.
*/
public function __construct(Service $api)
{
$this->api = $api;
}
/**
* @param CommandInterface $command Command that was executed.
* @param ResponseInterface $response Response that was received.
*
* @return ResultInterface
*/
abstract public function __invoke(
CommandInterface $command,
ResponseInterface $response
);
abstract public function parseMemberFromStream(
StreamInterface $stream,
StructureShape $member,
$response
);
}

View File

@ -0,0 +1,185 @@
<?php
namespace Aws\Api\Parser;
use Aws\Api\DateTimeResult;
use Aws\Api\Shape;
use Aws\Api\StructureShape;
use Aws\Result;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
/**
* @internal
*/
abstract class AbstractRestParser extends AbstractParser
{
use PayloadParserTrait;
/**
* Parses a payload from a response.
*
* @param ResponseInterface $response Response to parse.
* @param StructureShape $member Member to parse
* @param array $result Result value
*
* @return mixed
*/
abstract protected function payload(
ResponseInterface $response,
StructureShape $member,
array &$result
);
public function __invoke(
CommandInterface $command,
ResponseInterface $response
) {
$output = $this->api->getOperation($command->getName())->getOutput();
$result = [];
if ($payload = $output['payload']) {
$this->extractPayload($payload, $output, $response, $result);
}
foreach ($output->getMembers() as $name => $member) {
switch ($member['location']) {
case 'header':
$this->extractHeader($name, $member, $response, $result);
break;
case 'headers':
$this->extractHeaders($name, $member, $response, $result);
break;
case 'statusCode':
$this->extractStatus($name, $response, $result);
break;
}
}
if (!$payload
&& $response->getBody()->getSize() > 0
&& count($output->getMembers()) > 0
) {
// if no payload was found, then parse the contents of the body
$this->payload($response, $output, $result);
}
return new Result($result);
}
private function extractPayload(
$payload,
StructureShape $output,
ResponseInterface $response,
array &$result
) {
$member = $output->getMember($payload);
if (!empty($member['eventstream'])) {
$result[$payload] = new EventParsingIterator(
$response->getBody(),
$member,
$this
);
} else if ($member instanceof StructureShape) {
// Structure members parse top-level data into a specific key.
$result[$payload] = [];
$this->payload($response, $member, $result[$payload]);
} else {
// Streaming data is just the stream from the response body.
$result[$payload] = $response->getBody();
}
}
/**
* Extract a single header from the response into the result.
*/
private function extractHeader(
$name,
Shape $shape,
ResponseInterface $response,
&$result
) {
$value = $response->getHeaderLine($shape['locationName'] ?: $name);
switch ($shape->getType()) {
case 'float':
case 'double':
$value = (float) $value;
break;
case 'long':
$value = (int) $value;
break;
case 'boolean':
$value = filter_var($value, FILTER_VALIDATE_BOOLEAN);
break;
case 'blob':
$value = base64_decode($value);
break;
case 'timestamp':
try {
if (!empty($shape['timestampFormat'])
&& $shape['timestampFormat'] === 'unixTimestamp') {
$value = DateTimeResult::fromEpoch($value);
}
$value = new DateTimeResult($value);
break;
} catch (\Exception $e) {
// If the value cannot be parsed, then do not add it to the
// output structure.
return;
}
case 'string':
try {
if ($shape['jsonvalue']) {
$value = $this->parseJson(base64_decode($value), $response);
}
// If value is not set, do not add to output structure.
if (!isset($value)) {
return;
}
break;
} catch (\Exception $e) {
//If the value cannot be parsed, then do not add it to the
//output structure.
return;
}
}
$result[$name] = $value;
}
/**
* Extract a map of headers with an optional prefix from the response.
*/
private function extractHeaders(
$name,
Shape $shape,
ResponseInterface $response,
&$result
) {
// Check if the headers are prefixed by a location name
$result[$name] = [];
$prefix = $shape['locationName'];
$prefixLen = strlen($prefix);
foreach ($response->getHeaders() as $k => $values) {
if (!$prefixLen) {
$result[$name][$k] = implode(', ', $values);
} elseif (stripos($k, $prefix) === 0) {
$result[$name][substr($k, $prefixLen)] = implode(', ', $values);
}
}
}
/**
* Places the status code of the response into the result array.
*/
private function extractStatus(
$name,
ResponseInterface $response,
array &$result
) {
$result[$name] = (int) $response->getStatusCode();
}
}

View File

@ -0,0 +1,54 @@
<?php
namespace Aws\Api\Parser;
use Aws\Api\StructureShape;
use Aws\CommandInterface;
use Aws\Exception\AwsException;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
use GuzzleHttp\Psr7;
/**
* @internal Decorates a parser and validates the x-amz-crc32 header.
*/
class Crc32ValidatingParser extends AbstractParser
{
/**
* @param callable $parser Parser to wrap.
*/
public function __construct(callable $parser)
{
$this->parser = $parser;
}
public function __invoke(
CommandInterface $command,
ResponseInterface $response
) {
if ($expected = $response->getHeaderLine('x-amz-crc32')) {
$hash = hexdec(Psr7\hash($response->getBody(), 'crc32b'));
if ($expected != $hash) {
throw new AwsException(
"crc32 mismatch. Expected {$expected}, found {$hash}.",
$command,
[
'code' => 'ClientChecksumMismatch',
'connection_error' => true,
'response' => $response
]
);
}
}
$fn = $this->parser;
return $fn($command, $response);
}
public function parseMemberFromStream(
StreamInterface $stream,
StructureShape $member,
$response
) {
return $this->parser->parseMemberFromStream($stream, $member, $response);
}
}

View File

@ -0,0 +1,335 @@
<?php
namespace Aws\Api\Parser;
use \Iterator;
use Aws\Api\DateTimeResult;
use GuzzleHttp\Psr7;
use Psr\Http\Message\StreamInterface;
use Aws\Api\Parser\Exception\ParserException;
/**
* @internal Implements a decoder for a binary encoded event stream that will
* decode, validate, and provide individual events from the stream.
*/
class DecodingEventStreamIterator implements Iterator
{
const HEADERS = 'headers';
const PAYLOAD = 'payload';
const LENGTH_TOTAL = 'total_length';
const LENGTH_HEADERS = 'headers_length';
const CRC_PRELUDE = 'prelude_crc';
const BYTES_PRELUDE = 12;
const BYTES_TRAILING = 4;
private static $preludeFormat = [
self::LENGTH_TOTAL => 'decodeUint32',
self::LENGTH_HEADERS => 'decodeUint32',
self::CRC_PRELUDE => 'decodeUint32',
];
private static $lengthFormatMap = [
1 => 'decodeUint8',
2 => 'decodeUint16',
4 => 'decodeUint32',
8 => 'decodeUint64',
];
private static $headerTypeMap = [
0 => 'decodeBooleanTrue',
1 => 'decodeBooleanFalse',
2 => 'decodeInt8',
3 => 'decodeInt16',
4 => 'decodeInt32',
5 => 'decodeInt64',
6 => 'decodeBytes',
7 => 'decodeString',
8 => 'decodeTimestamp',
9 => 'decodeUuid',
];
/** @var StreamInterface Stream of eventstream shape to parse. */
private $stream;
/** @var array Currently parsed event. */
private $currentEvent;
/** @var int Current in-order event key. */
private $key;
/** @var resource|\HashContext CRC32 hash context for event validation */
private $hashContext;
/** @var int $currentPosition */
private $currentPosition;
/**
* DecodingEventStreamIterator constructor.
*
* @param StreamInterface $stream
*/
public function __construct(StreamInterface $stream)
{
$this->stream = $stream;
$this->rewind();
}
private function parseHeaders($headerBytes)
{
$headers = [];
$bytesRead = 0;
while ($bytesRead < $headerBytes) {
list($key, $numBytes) = $this->decodeString(1);
$bytesRead += $numBytes;
list($type, $numBytes) = $this->decodeUint8();
$bytesRead += $numBytes;
$f = self::$headerTypeMap[$type];
list($value, $numBytes) = $this->{$f}();
$bytesRead += $numBytes;
if (isset($headers[$key])) {
throw new ParserException('Duplicate key in event headers.');
}
$headers[$key] = $value;
}
return [$headers, $bytesRead];
}
private function parsePrelude()
{
$prelude = [];
$bytesRead = 0;
$calculatedCrc = null;
foreach (self::$preludeFormat as $key => $decodeFunction) {
if ($key === self::CRC_PRELUDE) {
$hashCopy = hash_copy($this->hashContext);
$calculatedCrc = hash_final($this->hashContext, true);
$this->hashContext = $hashCopy;
}
list($value, $numBytes) = $this->{$decodeFunction}();
$bytesRead += $numBytes;
$prelude[$key] = $value;
}
if (unpack('N', $calculatedCrc)[1] !== $prelude[self::CRC_PRELUDE]) {
throw new ParserException('Prelude checksum mismatch.');
}
return [$prelude, $bytesRead];
}
private function parseEvent()
{
$event = [];
if ($this->stream->tell() < $this->stream->getSize()) {
$this->hashContext = hash_init('crc32b');
$bytesLeft = $this->stream->getSize() - $this->stream->tell();
list($prelude, $numBytes) = $this->parsePrelude();
if ($prelude[self::LENGTH_TOTAL] > $bytesLeft) {
throw new ParserException('Message length too long.');
}
$bytesLeft -= $numBytes;
if ($prelude[self::LENGTH_HEADERS] > $bytesLeft) {
throw new ParserException('Headers length too long.');
}
list(
$event[self::HEADERS],
$numBytes
) = $this->parseHeaders($prelude[self::LENGTH_HEADERS]);
$event[self::PAYLOAD] = Psr7\stream_for(
$this->readAndHashBytes(
$prelude[self::LENGTH_TOTAL] - self::BYTES_PRELUDE
- $numBytes - self::BYTES_TRAILING
)
);
$calculatedCrc = hash_final($this->hashContext, true);
$messageCrc = $this->stream->read(4);
if ($calculatedCrc !== $messageCrc) {
throw new ParserException('Message checksum mismatch.');
}
}
return $event;
}
// Iterator Functionality
/**
* @return array
*/
public function current()
{
return $this->currentEvent;
}
/**
* @return int
*/
public function key()
{
return $this->key;
}
public function next()
{
$this->currentPosition = $this->stream->tell();
if ($this->valid()) {
$this->key++;
$this->currentEvent = $this->parseEvent();
}
}
public function rewind()
{
$this->stream->rewind();
$this->key = 0;
$this->currentPosition = 0;
$this->currentEvent = $this->parseEvent();
}
/**
* @return bool
*/
public function valid()
{
return $this->currentPosition < $this->stream->getSize();
}
// Decoding Utilities
private function readAndHashBytes($num)
{
$bytes = $this->stream->read($num);
hash_update($this->hashContext, $bytes);
return $bytes;
}
private function decodeBooleanTrue()
{
return [true, 0];
}
private function decodeBooleanFalse()
{
return [false, 0];
}
private function uintToInt($val, $size)
{
$signedCap = pow(2, $size - 1);
if ($val > $signedCap) {
$val -= (2 * $signedCap);
}
return $val;
}
private function decodeInt8()
{
$val = (int)unpack('C', $this->readAndHashBytes(1))[1];
return [$this->uintToInt($val, 8), 1];
}
private function decodeUint8()
{
return [unpack('C', $this->readAndHashBytes(1))[1], 1];
}
private function decodeInt16()
{
$val = (int)unpack('n', $this->readAndHashBytes(2))[1];
return [$this->uintToInt($val, 16), 2];
}
private function decodeUint16()
{
return [unpack('n', $this->readAndHashBytes(2))[1], 2];
}
private function decodeInt32()
{
$val = (int)unpack('N', $this->readAndHashBytes(4))[1];
return [$this->uintToInt($val, 32), 4];
}
private function decodeUint32()
{
return [unpack('N', $this->readAndHashBytes(4))[1], 4];
}
private function decodeInt64()
{
$val = $this->unpackInt64($this->readAndHashBytes(8))[1];
return [$this->uintToInt($val, 64), 8];
}
private function decodeUint64()
{
return [$this->unpackInt64($this->readAndHashBytes(8))[1], 8];
}
private function unpackInt64($bytes)
{
if (version_compare(PHP_VERSION, '5.6.3', '<')) {
$d = unpack('N2', $bytes);
return [1 => $d[1] << 32 | $d[2]];
}
return unpack('J', $bytes);
}
private function decodeBytes($lengthBytes=2)
{
if (!isset(self::$lengthFormatMap[$lengthBytes])) {
throw new ParserException('Undefined variable length format.');
}
$f = self::$lengthFormatMap[$lengthBytes];
list($len, $bytes) = $this->{$f}();
return [$this->readAndHashBytes($len), $len + $bytes];
}
private function decodeString($lengthBytes=2)
{
if (!isset(self::$lengthFormatMap[$lengthBytes])) {
throw new ParserException('Undefined variable length format.');
}
$f = self::$lengthFormatMap[$lengthBytes];
list($len, $bytes) = $this->{$f}();
return [$this->readAndHashBytes($len), $len + $bytes];
}
private function decodeTimestamp()
{
list($val, $bytes) = $this->decodeInt64();
return [
DateTimeResult::createFromFormat('U.u', $val / 1000),
$bytes
];
}
private function decodeUuid()
{
$val = unpack('H32', $this->readAndHashBytes(16))[1];
return [
substr($val, 0, 8) . '-'
. substr($val, 8, 4) . '-'
. substr($val, 12, 4) . '-'
. substr($val, 16, 4) . '-'
. substr($val, 20, 12),
16
];
}
}

View File

@ -0,0 +1,107 @@
<?php
namespace Aws\Api\Parser;
use \Iterator;
use Aws\Exception\EventStreamDataException;
use Aws\Api\Parser\Exception\ParserException;
use Aws\Api\StructureShape;
use Psr\Http\Message\StreamInterface;
/**
* @internal Implements a decoder for a binary encoded event stream that will
* decode, validate, and provide individual events from the stream.
*/
class EventParsingIterator implements Iterator
{
/** @var StreamInterface */
private $decodingIterator;
/** @var StructureShape */
private $shape;
/** @var AbstractParser */
private $parser;
public function __construct(
StreamInterface $stream,
StructureShape $shape,
AbstractParser $parser
) {
$this->decodingIterator = new DecodingEventStreamIterator($stream);
$this->shape = $shape;
$this->parser = $parser;
}
public function current()
{
return $this->parseEvent($this->decodingIterator->current());
}
public function key()
{
return $this->decodingIterator->key();
}
public function next()
{
$this->decodingIterator->next();
}
public function rewind()
{
$this->decodingIterator->rewind();
}
public function valid()
{
return $this->decodingIterator->valid();
}
private function parseEvent(array $event)
{
if (!empty($event['headers'][':message-type'])) {
if ($event['headers'][':message-type'] === 'error') {
return $this->parseError($event);
}
if ($event['headers'][':message-type'] !== 'event') {
throw new ParserException('Failed to parse unknown message type.');
}
}
if (empty($event['headers'][':event-type'])) {
throw new ParserException('Failed to parse without event type.');
}
$eventShape = $this->shape->getMember($event['headers'][':event-type']);
$parsedEvent = [];
foreach ($eventShape['members'] as $shape => $details) {
if (!empty($details['eventpayload'])) {
$payloadShape = $eventShape->getMember($shape);
if ($payloadShape['type'] === 'blob') {
$parsedEvent[$shape] = $event['payload'];
} else {
$parsedEvent[$shape] = $this->parser->parseMemberFromStream(
$event['payload'],
$payloadShape,
null
);
}
} else {
$parsedEvent[$shape] = $event['headers'][$shape];
}
}
return [
$event['headers'][':event-type'] => $parsedEvent
];
}
private function parseError(array $event)
{
throw new EventStreamDataException(
$event['headers'][':error-code'],
$event['headers'][':error-message']
);
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace Aws\Api\Parser\Exception;
use Aws\HasMonitoringEventsTrait;
use Aws\MonitoringEventsInterface;
use Aws\ResponseContainerInterface;
use Psr\Http\Message\ResponseInterface;
class ParserException extends \RuntimeException implements
MonitoringEventsInterface,
ResponseContainerInterface
{
use HasMonitoringEventsTrait;
private $errorCode;
private $requestId;
private $response;
public function __construct($message = '', $code = 0, $previous = null, array $context = [])
{
$this->errorCode = isset($context['error_code']) ? $context['error_code'] : null;
$this->requestId = isset($context['request_id']) ? $context['request_id'] : null;
$this->response = isset($context['response']) ? $context['response'] : null;
parent::__construct($message, $code, $previous);
}
/**
* Get the error code, if any.
*
* @return string|null
*/
public function getErrorCode()
{
return $this->errorCode;
}
/**
* Get the request ID, if any.
*
* @return string|null
*/
public function getRequestId()
{
return $this->requestId;
}
/**
* Get the received HTTP response if any.
*
* @return ResponseInterface|null
*/
public function getResponse()
{
return $this->response;
}
}

View File

@ -0,0 +1,62 @@
<?php
namespace Aws\Api\Parser;
use Aws\Api\DateTimeResult;
use Aws\Api\Shape;
/**
* @internal Implements standard JSON parsing.
*/
class JsonParser
{
public function parse(Shape $shape, $value)
{
if ($value === null) {
return $value;
}
switch ($shape['type']) {
case 'structure':
$target = [];
foreach ($shape->getMembers() as $name => $member) {
$locationName = $member['locationName'] ?: $name;
if (isset($value[$locationName])) {
$target[$name] = $this->parse($member, $value[$locationName]);
}
}
return $target;
case 'list':
$member = $shape->getMember();
$target = [];
foreach ($value as $v) {
$target[] = $this->parse($member, $v);
}
return $target;
case 'map':
$values = $shape->getValue();
$target = [];
foreach ($value as $k => $v) {
$target[$k] = $this->parse($values, $v);
}
return $target;
case 'timestamp':
if (!empty($shape['timestampFormat'])
&& $shape['timestampFormat'] !== 'unixTimestamp') {
return new DateTimeResult($value);
}
// The Unix epoch (or Unix time or POSIX time or Unix
// timestamp) is the number of seconds that have elapsed since
// January 1, 1970 (midnight UTC/GMT).
return DateTimeResult::fromEpoch($value);
case 'blob':
return base64_decode($value);
default:
return $value;
}
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace Aws\Api\Parser;
use Aws\Api\StructureShape;
use Aws\Api\Service;
use Aws\Result;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
/**
* @internal Implements JSON-RPC parsing (e.g., DynamoDB)
*/
class JsonRpcParser extends AbstractParser
{
use PayloadParserTrait;
/**
* @param Service $api Service description
* @param JsonParser $parser JSON body builder
*/
public function __construct(Service $api, JsonParser $parser = null)
{
parent::__construct($api);
$this->parser = $parser ?: new JsonParser();
}
public function __invoke(
CommandInterface $command,
ResponseInterface $response
) {
$operation = $this->api->getOperation($command->getName());
$result = null === $operation['output']
? null
: $this->parseMemberFromStream(
$response->getBody(),
$operation->getOutput(),
$response
);
return new Result($result ?: []);
}
public function parseMemberFromStream(
StreamInterface $stream,
StructureShape $member,
$response
) {
return $this->parser->parse($member, $this->parseJson($stream, $response));
}
}

View File

@ -0,0 +1,91 @@
<?php
namespace Aws\Api\Parser;
use Aws\Api\DateTimeResult;
use Aws\Api\Shape;
use Psr\Http\Message\ResponseInterface;
trait MetadataParserTrait
{
/**
* Extract a single header from the response into the result.
*/
protected function extractHeader(
$name,
Shape $shape,
ResponseInterface $response,
&$result
) {
$value = $response->getHeaderLine($shape['locationName'] ?: $name);
switch ($shape->getType()) {
case 'float':
case 'double':
$value = (float) $value;
break;
case 'long':
$value = (int) $value;
break;
case 'boolean':
$value = filter_var($value, FILTER_VALIDATE_BOOLEAN);
break;
case 'blob':
$value = base64_decode($value);
break;
case 'timestamp':
try {
if (!empty($shape['timestampFormat'])
&& $shape['timestampFormat'] === 'unixTimestamp') {
$value = DateTimeResult::fromEpoch($value);
}
$value = new DateTimeResult($value);
break;
} catch (\Exception $e) {
// If the value cannot be parsed, then do not add it to the
// output structure.
return;
}
case 'string':
if ($shape['jsonvalue']) {
$value = $this->parseJson(base64_decode($value), $response);
}
break;
}
$result[$name] = $value;
}
/**
* Extract a map of headers with an optional prefix from the response.
*/
protected function extractHeaders(
$name,
Shape $shape,
ResponseInterface $response,
&$result
) {
// Check if the headers are prefixed by a location name
$result[$name] = [];
$prefix = $shape['locationName'];
$prefixLen = strlen($prefix);
foreach ($response->getHeaders() as $k => $values) {
if (!$prefixLen) {
$result[$name][$k] = implode(', ', $values);
} elseif (stripos($k, $prefix) === 0) {
$result[$name][substr($k, $prefixLen)] = implode(', ', $values);
}
}
}
/**
* Places the status code of the response into the result array.
*/
protected function extractStatus(
$name,
ResponseInterface $response,
array &$result
) {
$result[$name] = (int) $response->getStatusCode();
}
}

View File

@ -0,0 +1,61 @@
<?php
namespace Aws\Api\Parser;
use Aws\Api\Parser\Exception\ParserException;
use Psr\Http\Message\ResponseInterface;
trait PayloadParserTrait
{
/**
* @param string $json
*
* @throws ParserException
*
* @return array
*/
private function parseJson($json, $response)
{
$jsonPayload = json_decode($json, true);
if (JSON_ERROR_NONE !== json_last_error()) {
throw new ParserException(
'Error parsing JSON: ' . json_last_error_msg(),
0,
null,
['response' => $response]
);
}
return $jsonPayload;
}
/**
* @param string $xml
*
* @throws ParserException
*
* @return \SimpleXMLElement
*/
protected function parseXml($xml, $response)
{
$priorSetting = libxml_use_internal_errors(true);
try {
libxml_clear_errors();
$xmlPayload = new \SimpleXMLElement($xml);
if ($error = libxml_get_last_error()) {
throw new \RuntimeException($error->message);
}
} catch (\Exception $e) {
throw new ParserException(
"Error parsing XML: {$e->getMessage()}",
0,
$e,
['response' => $response]
);
} finally {
libxml_use_internal_errors($priorSetting);
}
return $xmlPayload;
}
}

View File

@ -0,0 +1,60 @@
<?php
namespace Aws\Api\Parser;
use Aws\Api\Service;
use Aws\Api\StructureShape;
use Aws\Result;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
/**
* @internal Parses query (XML) responses (e.g., EC2, SQS, and many others)
*/
class QueryParser extends AbstractParser
{
use PayloadParserTrait;
/** @var bool */
private $honorResultWrapper;
/**
* @param Service $api Service description
* @param XmlParser $xmlParser Optional XML parser
* @param bool $honorResultWrapper Set to false to disable the peeling
* back of result wrappers from the
* output structure.
*/
public function __construct(
Service $api,
XmlParser $xmlParser = null,
$honorResultWrapper = true
) {
parent::__construct($api);
$this->parser = $xmlParser ?: new XmlParser();
$this->honorResultWrapper = $honorResultWrapper;
}
public function __invoke(
CommandInterface $command,
ResponseInterface $response
) {
$output = $this->api->getOperation($command->getName())->getOutput();
$xml = $this->parseXml($response->getBody(), $response);
if ($this->honorResultWrapper && $output['resultWrapper']) {
$xml = $xml->{$output['resultWrapper']};
}
return new Result($this->parser->parse($output, $xml));
}
public function parseMemberFromStream(
StreamInterface $stream,
StructureShape $member,
$response
) {
$xml = $this->parseXml($stream, $response);
return $this->parser->parse($member, $xml);
}
}

View File

@ -0,0 +1,49 @@
<?php
namespace Aws\Api\Parser;
use Aws\Api\Service;
use Aws\Api\StructureShape;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
/**
* @internal Implements REST-JSON parsing (e.g., Glacier, Elastic Transcoder)
*/
class RestJsonParser extends AbstractRestParser
{
use PayloadParserTrait;
/**
* @param Service $api Service description
* @param JsonParser $parser JSON body builder
*/
public function __construct(Service $api, JsonParser $parser = null)
{
parent::__construct($api);
$this->parser = $parser ?: new JsonParser();
}
protected function payload(
ResponseInterface $response,
StructureShape $member,
array &$result
) {
$jsonBody = $this->parseJson($response->getBody(), $response);
if ($jsonBody) {
$result += $this->parser->parse($member, $jsonBody);
}
}
public function parseMemberFromStream(
StreamInterface $stream,
StructureShape $member,
$response
) {
$jsonBody = $this->parseJson($stream, $response);
if ($jsonBody) {
return $this->parser->parse($member, $jsonBody);
}
return [];
}
}

View File

@ -0,0 +1,42 @@
<?php
namespace Aws\Api\Parser;
use Aws\Api\StructureShape;
use Aws\Api\Service;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
/**
* @internal Implements REST-XML parsing (e.g., S3, CloudFront, etc...)
*/
class RestXmlParser extends AbstractRestParser
{
use PayloadParserTrait;
/**
* @param Service $api Service description
* @param XmlParser $parser XML body parser
*/
public function __construct(Service $api, XmlParser $parser = null)
{
parent::__construct($api);
$this->parser = $parser ?: new XmlParser();
}
protected function payload(
ResponseInterface $response,
StructureShape $member,
array &$result
) {
$result += $this->parseMemberFromStream($response->getBody(), $member, $response);
}
public function parseMemberFromStream(
StreamInterface $stream,
StructureShape $member,
$response
) {
$xml = $this->parseXml($stream, $response);
return $this->parser->parse($member, $xml);
}
}

View File

@ -0,0 +1,164 @@
<?php
namespace Aws\Api\Parser;
use Aws\Api\DateTimeResult;
use Aws\Api\ListShape;
use Aws\Api\MapShape;
use Aws\Api\Shape;
use Aws\Api\StructureShape;
/**
* @internal Implements standard XML parsing for REST-XML and Query protocols.
*/
class XmlParser
{
public function parse(StructureShape $shape, \SimpleXMLElement $value)
{
return $this->dispatch($shape, $value);
}
private function dispatch($shape, \SimpleXMLElement $value)
{
static $methods = [
'structure' => 'parse_structure',
'list' => 'parse_list',
'map' => 'parse_map',
'blob' => 'parse_blob',
'boolean' => 'parse_boolean',
'integer' => 'parse_integer',
'float' => 'parse_float',
'double' => 'parse_float',
'timestamp' => 'parse_timestamp',
];
$type = $shape['type'];
if (isset($methods[$type])) {
return $this->{$methods[$type]}($shape, $value);
}
return (string) $value;
}
private function parse_structure(
StructureShape $shape,
\SimpleXMLElement $value
) {
$target = [];
foreach ($shape->getMembers() as $name => $member) {
// Extract the name of the XML node
$node = $this->memberKey($member, $name);
if (isset($value->{$node})) {
$target[$name] = $this->dispatch($member, $value->{$node});
} else {
$memberShape = $shape->getMember($name);
if (!empty($memberShape['xmlAttribute'])) {
$target[$name] = $this->parse_xml_attribute(
$shape,
$memberShape,
$value
);
}
}
}
return $target;
}
private function memberKey(Shape $shape, $name)
{
if (null !== $shape['locationName']) {
return $shape['locationName'];
}
if ($shape instanceof ListShape && $shape['flattened']) {
return $shape->getMember()['locationName'] ?: $name;
}
return $name;
}
private function parse_list(ListShape $shape, \SimpleXMLElement $value)
{
$target = [];
$member = $shape->getMember();
if (!$shape['flattened']) {
$value = $value->{$member['locationName'] ?: 'member'};
}
foreach ($value as $v) {
$target[] = $this->dispatch($member, $v);
}
return $target;
}
private function parse_map(MapShape $shape, \SimpleXMLElement $value)
{
$target = [];
if (!$shape['flattened']) {
$value = $value->entry;
}
$mapKey = $shape->getKey();
$mapValue = $shape->getValue();
$keyName = $shape->getKey()['locationName'] ?: 'key';
$valueName = $shape->getValue()['locationName'] ?: 'value';
foreach ($value as $node) {
$key = $this->dispatch($mapKey, $node->{$keyName});
$value = $this->dispatch($mapValue, $node->{$valueName});
$target[$key] = $value;
}
return $target;
}
private function parse_blob(Shape $shape, $value)
{
return base64_decode((string) $value);
}
private function parse_float(Shape $shape, $value)
{
return (float) (string) $value;
}
private function parse_integer(Shape $shape, $value)
{
return (int) (string) $value;
}
private function parse_boolean(Shape $shape, $value)
{
return $value == 'true';
}
private function parse_timestamp(Shape $shape, $value)
{
if (!empty($shape['timestampFormat'])
&& $shape['timestampFormat'] === 'unixTimestamp') {
return DateTimeResult::fromEpoch((string) $value);
}
return new DateTimeResult($value);
}
private function parse_xml_attribute(Shape $shape, Shape $memberShape, $value)
{
$namespace = $shape['xmlNamespace']['uri']
? $shape['xmlNamespace']['uri']
: '';
$prefix = $shape['xmlNamespace']['prefix']
? $shape['xmlNamespace']['prefix']
: '';
if (!empty($prefix)) {
$prefix .= ':';
}
$key = str_replace($prefix, '', $memberShape['locationName']);
$attributes = $value->attributes($namespace);
return isset($attributes[$key]) ? (string) $attributes[$key] : null;
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace Aws\Api\Serializer;
use Aws\Api\Shape;
use Aws\Api\ListShape;
/**
* @internal
*/
class Ec2ParamBuilder extends QueryParamBuilder
{
protected function queryName(Shape $shape, $default = null)
{
return ($shape['queryName']
?: ucfirst($shape['locationName']))
?: $default;
}
protected function isFlat(Shape $shape)
{
return false;
}
protected function format_list(
ListShape $shape,
array $value,
$prefix,
&$query
) {
// Handle empty list serialization
if (!$value) {
$query[$prefix] = false;
} else {
$items = $shape->getMember();
foreach ($value as $k => $v) {
$this->format($items, $v, $prefix . '.' . ($k + 1), $query);
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More