@@ -16,12 +16,15 @@
16 16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*******************************************************************************
17 17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
18 18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This file manages low-level SSL communications.
19 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
20 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This file implements a singleton. A single SSL connection may be active
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** at a time. State information is stored in static variables. The identity
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of the server is held in global variables that are set by url_parse().
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** at a time. State information is stored in static variables.
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The SSL connections can be either a client or a server. But all
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** connections for a single process must be of the same type, either client
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or server.
23 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SSL support is abstracted out into this module because Fossil can
25 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be compiled without SSL support (which requires OpenSSL library)
26 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
27 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -41,11 +44,11 @@
41 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
42 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** There can only be a single OpenSSL IO connection open at a time.
43 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** State information about that IO is stored in the following
44 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** local variables:
45 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int sslIsInit = 0; /* True after global initialization */
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int sslIsInit = 0; /* 0: uninit 1: init as client 2: init as server */
47 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static BIO *iBio = 0; /* OpenSSL I/O abstraction */
48 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static char *sslErrMsg = 0; /* Text of most recent OpenSSL error */
49 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static SSL_CTX *sslCtx; /* SSL context */
50 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static SSL *ssl;
51 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static struct { /* Accept this SSL cert for this session only */
@@ -52,10 +55,120 @@
52 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zHost; /* Subject or host name */
53 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zHash; /* SHA2-256 hash of the cert */
54 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} sException;
55 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int sslNoCertVerify = 0; /* Do not verify SSL certs */
56 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This is a self-signed cert in the PEM format that can be used when
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** no other certs are available.
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char sslSelfCert[] =
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "-----BEGIN CERTIFICATE-----\n"
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "MIIDMTCCAhkCFGrDmuJkkzWERP/ITBvzwwI2lv0TMA0GCSqGSIb3DQEBCwUAMFQx\n"
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "CzAJBgNVBAYTAlVTMQswCQYDVQQIDAJOQzESMBAGA1UEBwwJQ2hhcmxvdHRlMRMw\n"
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "EQYDVQQKDApGb3NzaWwtU0NNMQ8wDQYDVQQDDAZGb3NzaWwwIBcNMjExMjI3MTEz\n"
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "MTU2WhgPMjEyMTEyMjcxMTMxNTZaMFQxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJO\n"
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "QzESMBAGA1UEBwwJQ2hhcmxvdHRlMRMwEQYDVQQKDApGb3NzaWwtU0NNMQ8wDQYD\n"
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "VQQDDAZGb3NzaWwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCCbTU2\n"
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "6GRQHQqLq7vyZ0OxpAxmgfAKCxt6eIz+jBi2ZM/CB5vVXWVh2+SkSiWEA3UZiUqX\n"
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "xZlzmS/CglZdiwLLDJML8B4OiV72oivFH/vJ7+cbvh1dTxnYiHuww7GfQngPrLfe\n"
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "fiIYPDk1GTUJHBQ7Ue477F7F8vKuHdVgwktF/JDM6M60aSqlo2D/oysirrb+dlur\n"
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Tlv0rjsYOfq6bLAajoL3qi/vek6DNssoywbge4PfbTgS9g7Gcgncbcet5pvaS12J\n"
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "avhFcd4JU4Ity49Hl9S/C2MfZ1tE53xVggRwKz4FPj65M5uymTdcxtjKXtCxIE1k\n"
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "KxJxXQh7rIYjm+RTAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFkdtpqcybAzJN8G\n"
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "+ONuUm5sXNbWta7JGvm8l0BTSBcCUtJA3hn16iJqXA9KmLnaF2denC4EYk+KlVU1\n"
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "QXxskPJ4jB8A5B05jMijYv0nzCxKhviI8CR7GLEEGKzeg9pbW0+O3vaVehoZtdFX\n"
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "z3SsCssr9QjCLiApQxMzW1Iv3od2JXeHBwfVMFrWA1VCEUCRs8OSW/VOqDPJLVEi\n"
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "G6wxc4kN9dLK+5S29q3nzl24/qzXoF8P9Re5KBCbrwaHgy+OEEceq5jkmfGFxXjw\n"
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "pvVCNry5uAhH5NqbXZampUWqiWtM4eTaIPo7Y2mDA1uWhuWtO6F9PsnFJlQHCnwy\n"
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "s/TsrXk=\n"
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "-----END CERTIFICATE-----\n";
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This is the private-key corresponding to the cert above
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char sslSelfPKey[] =
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "-----BEGIN PRIVATE KEY-----\n"
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCCbTU26GRQHQqL\n"
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "q7vyZ0OxpAxmgfAKCxt6eIz+jBi2ZM/CB5vVXWVh2+SkSiWEA3UZiUqXxZlzmS/C\n"
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "glZdiwLLDJML8B4OiV72oivFH/vJ7+cbvh1dTxnYiHuww7GfQngPrLfefiIYPDk1\n"
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "GTUJHBQ7Ue477F7F8vKuHdVgwktF/JDM6M60aSqlo2D/oysirrb+dlurTlv0rjsY\n"
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Ofq6bLAajoL3qi/vek6DNssoywbge4PfbTgS9g7Gcgncbcet5pvaS12JavhFcd4J\n"
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "U4Ity49Hl9S/C2MfZ1tE53xVggRwKz4FPj65M5uymTdcxtjKXtCxIE1kKxJxXQh7\n"
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "rIYjm+RTAgMBAAECggEANfTH1vc8yIe7HRzmm9lsf8jF+II4s2705y2H5qY+cvYx\n"
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "nKtZJGOG1X0KkYy7CGoFv5K0cSUl3lS5FVamM/yWIzoIex/Sz2C1EIL2aI5as6ez\n"
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "jB6SN0/J+XI8+Vt7186/rHxfdIPpxuzjHbxX3HTpScETNWcLrghbrPxakbTPPxwt\n"
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "+x7QlPmmkFNuMfvkzToFf9NdwL++44TeBPOpvD/Lrw+eyqdth9RJPq9cM96plh9V\n"
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "HuRqeD8+QNafaXBdSQs3FJK/cDK/vWGKZWIfFVSDbDhwYljkXGijreFjtXQfkkpF\n"
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "rl1J87/H9Ee7z8fTD2YXQHl+0/rghAVtac3u54dpQQKBgQC2XG3OEeMrOp9dNkUd\n"
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "F8VffUg0ecwG+9L3LCe7U71K0kPmXjV6xNnuYcNQu84kptc5vI8wD23p29LaxdNc\n"
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "9m0lcw06/YYBOPkNphcHkINYZTvVJF10mL3isymzMaTtwDkZUkOjL1B+MTiFT/qp\n"
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "ARKrTYGJ4HxY7+tUkI5pUmg4PQKBgQC3GA4d1Rz3Pb/RRpcsZgWknKsKhoN36mSn\n"
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "xFJ3wPBvVv2B1ltTMzh/+the0ty6clzMrvoLERzRcheDsNrc/j/TUVG8sVdBYJwX\n"
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "tMZyFW4NVMOErT/1ukh6jBqIMBo6NJL3EV/AKj0yniksgKOr0/AAduAccnGST8Jd\n"
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SHOdjwvHzwKBgGZBq/zqgNTDuYseHGE07CMgcDWkumiMGv8ozlq3mSR0hUiPOTPP\n"
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "YFjQjyIdPXnF6FfiyPPtIvgIoNK2LVAqiod+XUPf152l4dnqcW13dn9BvOxGyPTR\n"
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "lWCikFaAFviOWjY9r9m4dU1dslDmySqthFd0TZgPvgps9ivkJ0cdw30NAoGAMC/E\n"
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "h1VvKiK2OP27C5ROJ+STn1GHiCfIFd81VQ8SODtMvL8NifgRBp2eFFaqgOdYRQZI\n"
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "CGGYlAbS6XXCJCdF5Peh62dA75PdgN+y2pOJQzjrvB9cle9Q4++7i9wdCvSLOTr5\n"
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "WDnFoWy+qVexu6crovOmR9ZWzYrwPFy1EOJ010ECgYBl7Q+jmjOSqsVwhFZ0U7LG\n"
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "diN+vXhWfn1wfOWd8u79oaqU/Oy7xyKW2p3H5z2KFrBM/vib53Lh4EwFZjcX+jVG\n"
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "krAmbL+M/hP7z3TD2UbESAzR/c6l7FU45xN84Lsz5npkR8H/uAHuqLgb9e430Mjx\n"
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "YNMwdb8rChHHChNZu6zuxw==\n"
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "-----END PRIVATE KEY-----\n";
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Read a PEM certificate from memory and push it into an SSL_CTX.
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the number of errors.
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int sslctx_use_cert_from_mem(
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SSL_CTX *ctx,
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *pData,
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nData
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ BIO *in;
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = 1;
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ X509 *x = 0;
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ X509 *cert = 0;
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ in = BIO_new_mem_buf(pData, nData);
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( in==0 ) goto end_of_ucfm;
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // x = X509_new_ex(ctx->libctx, ctx->propq);
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x = X509_new();
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x==0 ) goto end_of_ucfm;
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cert = PEM_read_bio_X509(in, &x, 0, 0);
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( cert==0 ) goto end_of_ucfm;
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SSL_CTX_use_certificate(ctx, x)<=0;
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ end_of_ucfm:
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ X509_free(x);
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ BIO_free(in);
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Read a PEM private key from memory and add it to an SSL_CTX.
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the number of errors.
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int sslctx_use_pkey_from_mem(
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SSL_CTX *ctx,
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *pData,
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nData
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = 1;
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ BIO *in;
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ EVP_PKEY *pkey = 0;
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ in = BIO_new_mem_buf(pData, nData);
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( in==0 ) goto end_of_upkfm;
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pkey = PEM_read_bio_PrivateKey(in, 0, 0, 0);
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pkey==0 ) goto end_of_upkfm;
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SSL_CTX_use_PrivateKey(ctx, pkey)<=0;
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ EVP_PKEY_free(pkey);
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ end_of_upkfm:
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ BIO_free(in);
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
57 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
58 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Clear the SSL error message
59 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
60 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void ssl_clear_errmsg(void){
61 174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(sslErrMsg);
@@ -134,11 +247,11 @@
134 247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
135 248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
136 249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Call this routine once before any other use of the SSL interface.
137 250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine does initial configuration of the SSL module.
138 251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void ssl_global_init(void){
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void ssl_global_init_client(void){
140 253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zCaSetting = 0, *zCaFile = 0, *zCaDirectory = 0;
141 254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *identityFile;
142 255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
143 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sslIsInit==0 ){
144 257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SSL_library_init();
@@ -193,10 +306,12 @@
193 306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Register a callback to tell the user what to do when the server asks
194 307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for a cert */
195 308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SSL_CTX_set_client_cert_cb(sslCtx, ssl_client_cert_callback);
196 309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
197 310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sslIsInit = 1;
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( sslIsInit==1 );
198 313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
199 314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
200 315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
201 316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
202 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Call this routine to shutdown the SSL module prior to program exit.
@@ -208,14 +323,14 @@
208 323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sslIsInit = 0;
209 324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
210 325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
211 326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
212 327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Close the currently open SSL connection. If no connection is open,
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Close the currently open client SSL connection. If no connection is open,
214 329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** this routine is a no-op.
215 330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void ssl_close(void){
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void ssl_close_client(void){
217 332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iBio!=NULL ){
218 333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(void)BIO_reset(iBio);
219 334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
BIO_free_all(iBio);
220 335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iBio = NULL;
221 336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -280,34 +395,36 @@
280 395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void ssl_disable_cert_verification(void){
281 396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sslNoCertVerify = 1;
282 397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
283 398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
284 399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Open an SSL connection. The identify of the server is determined
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** as follows:
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Open an SSL connection as a client that is to connect to the server
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** identified by pUrlData.
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The identify of the server is determined as follows:
287 404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
288 405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pUrlData->name Name of the server. Ex: fossil-scm.org
289 406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** g.url.name Name of the proxy server, if proxying.
290 407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pUrlData->port TCP/IP port to use. Ex: 80
291 408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
292 409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return the number of errors.
293 410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ssl_open(UrlData *pUrlData){
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ssl_open_client(UrlData *pUrlData){
295 412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
X509 *cert;
296 413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zRemoteHost;
297 414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ssl_global_init();
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ssl_global_init_client();
299 416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pUrlData->useProxy ){
300 417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
301 418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *connStr = mprintf("%s:%d", g.url.name, pUrlData->port);
302 419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
BIO *sBio = BIO_new_connect(connStr);
303 420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(connStr);
304 421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( BIO_do_connect(sBio)<=0 ){
305 422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssl_set_errmsg("SSL: cannot connect to proxy %s:%d (%s)",
306 423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pUrlData->name, pUrlData->port,
307 424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ERR_reason_error_string(ERR_get_error()));
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ssl_close();
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ssl_close_client();
309 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
310 427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
311 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = establish_proxy_tunnel(pUrlData, sBio);
312 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc<200||rc>299 ){
313 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssl_set_errmsg("SSL: proxy connect failed with HTTP status code %d", rc);
@@ -355,29 +472,29 @@
355 472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(connStr);
356 473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( BIO_do_connect(iBio)<=0 ){
357 474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssl_set_errmsg("SSL: cannot connect to host %s:%d (%s)",
358 475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pUrlData->name, pUrlData->port,
359 476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ERR_reason_error_string(ERR_get_error()));
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ssl_close();
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ssl_close_client();
361 478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
362 479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
363 480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
364 481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
365 482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( BIO_do_handshake(iBio)<=0 ) {
366 483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssl_set_errmsg("Error establishing SSL connection %s:%d (%s)",
367 484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pUrlData->useProxy?pUrlData->hostname:pUrlData->name,
368 485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pUrlData->useProxy?pUrlData->proxyOrigPort:pUrlData->port,
369 486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ERR_reason_error_string(ERR_get_error()));
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ssl_close();
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ssl_close_client();
371 488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
372 489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
373 490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check if certificate is valid */
374 491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cert = SSL_get_peer_certificate(ssl);
375 492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
376 493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if ( cert==NULL ){
377 494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssl_set_errmsg("No SSL certificate was presented by the peer");
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ssl_close();
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ssl_close_client();
379 496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
380 497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
381 498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
382 499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Debugging hint: On unix-like system, run something like:
383 500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -441,11 +558,11 @@
441 558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( cReply!='y' && cReply!='Y'
442 559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& fossil_stricmp(blob_str(&ans),zHash)!=0
443 560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
444 561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
X509_free(cert);
445 562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssl_set_errmsg("SSL cert declined");
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ssl_close();
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ssl_close_client();
447 564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&ans);
448 565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
449 566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
450 567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&ans);
451 568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssl_one_time_exception(pUrlData, zHash);
@@ -528,11 +645,12 @@
528 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(sException.zHash);
529 646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sException.zHash = fossil_strdup(zHash);
530 647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
531 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
532 649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Send content out over the SSL connection.
650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Send content out over the SSL connection from the client to
651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the server.
534 652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
535 653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t ssl_send(void *NotUsed, void *pContent, size_t N){
536 654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t total = 0;
537 655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( N>0 ){
538 656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int sent = BIO_write(iBio, pContent, N);
@@ -548,11 +666,12 @@
548 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
549 667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return total;
550 668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
551 669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
552 670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Receive content back from the SSL connection.
671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Receive content back from the client SSL connection. In other
672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** words read the reply back from the server.
554 673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
555 674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t ssl_receive(void *NotUsed, void *pContent, size_t N){
556 675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t total = 0;
557 676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( N>0 ){
558 677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int got = BIO_read(iBio, pContent, N);
@@ -566,50 +685,366 @@
566 685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
N -= got;
567 686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pContent = (void*)&((char*)pContent)[got];
568 687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
569 688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return total;
570 689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Initialize the SSL library so that it is able to handle
693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** server-side connections. Invoke fossil_fatal() if there are
694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** any problems.
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If zKeyFile and zCertFile are not NULL, then they are the names
697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of disk files that hold the certificate and private-key for the
698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** server. If zCertFile is not NULL but zKeyFile is NULL, then
699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zCertFile is assumed to be a concatenation of the certificate and
700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the private-key in the PEM format.
701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If zCertFile is NULL, then "ssl-cert" setting is consulted
703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to get the certificate and private-key (concatenated together, in
704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the PEM format). If there is no ssl-cert setting, then
705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a built-in self-signed cert is used.
706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void ssl_init_server(const char *zCertFile, const char *zKeyFile){
708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sslIsInit==0 ){
709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTlsCert;
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SSL_library_init();
711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SSL_load_error_strings();
712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OpenSSL_add_all_algorithms();
713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sslCtx = SSL_CTX_new(SSLv23_server_method());
714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sslCtx==0 ){
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ERR_print_errors_fp(stderr);
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Error initializing the SSL server");
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zCertFile && zCertFile[0] ){
719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SSL_CTX_use_certificate_file(sslCtx,zCertFile,SSL_FILETYPE_PEM)<=0 ){
720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ERR_print_errors_fp(stderr);
721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Error loading CERT file \"%s\"", zCertFile);
722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zKeyFile==0 ) zKeyFile = zCertFile;
724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SSL_CTX_use_PrivateKey_file(sslCtx, zKeyFile, SSL_FILETYPE_PEM)<=0 ){
725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ERR_print_errors_fp(stderr);
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Error loading PRIVATE KEY from file \"%s\"", zKeyFile);
727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else
729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (zTlsCert = db_get("ssl-cert",0))!=0 ){
730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sslctx_use_cert_from_mem(sslCtx, zTlsCert, -1)
731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || sslctx_use_pkey_from_mem(sslCtx, zTlsCert, -1)
732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Error loading the CERT from the"
734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " 'ssl-cert' setting");
735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( sslctx_use_cert_from_mem(sslCtx, sslSelfCert, -1)
737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || sslctx_use_pkey_from_mem(sslCtx, sslSelfPKey, -1) ){
738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Error loading self-signed CERT");
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !SSL_CTX_check_private_key(sslCtx) ){
741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("PRIVATE KEY \"%s\" does not match CERT \"%s\"",
742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zKeyFile, zCertFile);
743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sslIsInit = 2;
745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( sslIsInit==2 );
747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct SslServerConn {
751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SSL *ssl; /* The SSL codec */
752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int atEof; /* True when EOF reached. */
753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fd0; /* Read channel, or socket */
754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fd1; /* Write channel */
755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } SslServerConn;
756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Create a new server-side codec. The arguments are the file
759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** descriptors from which teh codec reads and writes, respectively.
760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the writeFd is negative, then use then the readFd is a socket
762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** over which we both read and write.
763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *ssl_new_server(int readFd, int writeFd){
765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SslServerConn *pServer = fossil_malloc_zero(sizeof(*pServer));
766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pServer->ssl = SSL_new(sslCtx);
767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pServer->fd0 = readFd;
768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pServer->fd1 = writeFd;
769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( writeFd<0 ){
770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SSL_set_fd(pServer->ssl, readFd);
771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SSL_set_rfd(pServer->ssl, readFd);
773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SSL_set_wfd(pServer->ssl, writeFd);
774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SSL_accept(pServer->ssl);
776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (void*)pServer;
777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Close a server-side code previously returned from ssl_new_server().
781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void ssl_close_server(void *pServerArg){
783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SslServerConn *pServer = (SslServerConn*)pServerArg;
784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SSL_free(pServer->ssl);
785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ close(pServer->fd0);
786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pServer->fd1>=0 ) close(pServer->fd0);
787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(pServer);
788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return TRUE if there are no more bytes available to be read from
792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the client.
793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ssl_eof(void *pServerArg){
795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SslServerConn *pServer = (SslServerConn*)pServerArg;
796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return pServer->atEof;
797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Read cleartext bytes that have been received from the client and
801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** decrypted by the SSL server codec.
802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t ssl_read_server(void *pServerArg, char *zBuf, size_t nBuf){
804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n;
805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SslServerConn *pServer = (SslServerConn*)pServerArg;
806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pServer->atEof ) return 0;
807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nBuf>0x7fffffff ){ fossil_fatal("SSL read too big"); }
808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n = SSL_read(pServer->ssl, zBuf, (int)nBuf);
809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( n<nBuf ) pServer->atEof = 1;
810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return n;
811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Read a single line of text from the client.
815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *ssl_gets(void *pServerArg, char *zBuf, int nBuf){
817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = 0;
818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SslServerConn *pServer = (SslServerConn*)pServerArg;
820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pServer->atEof ) return 0;
822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<nBuf-1; i++){
823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n = SSL_read(pServer->ssl, &zBuf[i], 1);
824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( n<=0 ){
825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zBuf[i]=='\n' ) break;
828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zBuf[i+1] = 0;
830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return zBuf;
831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Write cleartext bytes into the SSL server codec so that they can
836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be encrypted and sent back to the client.
837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t ssl_write_server(void *pServerArg, char *zBuf, size_t nBuf){
839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n;
840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SslServerConn *pServer = (SslServerConn*)pServerArg;
841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pServer->atEof ) return 0;
842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nBuf>0x7fffffff ){ fossil_fatal("SSL write too big"); }
843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n = SSL_write(pServer->ssl, zBuf, (int)nBuf);
844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return n;
845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
571 846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
572 847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* FOSSIL_ENABLE_SSL */
573 848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
574 849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
575 850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** COMMAND: tls-config*
851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COMMAND: ssl-config
576 852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Usage: %fossil tls-config [SUBCOMMAND] [OPTIONS...] [ARGS...]
853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: %fossil ssl-config [SUBCOMMAND] [OPTIONS...] [ARGS...]
578 854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
579 855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This command is used to view or modify the TLS (Transport Layer
580 856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Security) configuration for Fossil. TLS (formerly SSL) is the
581 857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** encryption technology used for secure HTTPS transport.
582 858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
583 859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Sub-commands:
584 860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** show Show the TLS configuration
861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** clear-cert Remove information about server certificates.
862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This is a subset of the "scrub" command.
863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** load-cert PEM-FILES... Identify server certificate files. These
865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** should be in the PEM format. There are
866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** normally two files, the certificate and the
867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** private-key. By default, the text of both
868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** files is concatenated and added to the
869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "ssl-cert" setting. Use --filename to store
870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** just the filenames.
871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** remove-exception DOMAINS Remove TLS cert exceptions for the domains
873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** listed. Or remove them all if the --all
874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** option is specified.
875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** scrub ?--force? Remove all SSL configuration data from the
877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** repository. Use --force to omit the
878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** confirmation.
586 879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** remove-exception DOMAIN... Remove TLS cert exceptions
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** for the domains listed. Or if
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the --all option is specified,
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** remove all TLS cert exceptions.
880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** show ?-v? Show the TLS configuration. Add -v to see
881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** additional explaination
591 882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
592 883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void test_tlsconfig_info(void){
593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if !defined(FOSSIL_ENABLE_SSL)
594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_print("TLS disabled in this build\n");
595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
596 884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zCmd;
597 885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t nCmd;
598 886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nHit = 0;
599 887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_find_and_open_repository(OPEN_OK_NOT_FOUND|OPEN_SUBSTITUTE,0);
600 888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_open_config(1,0);
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zCmd = g.argc>=3 ? g.argv[2] : "show";
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nCmd = strlen(zCmd);
889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc==2 || (g.argc>=3 && g.argv[2][0]=='-') ){
890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zCmd = "show";
891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCmd = 4;
892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zCmd = g.argv[2];
894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCmd = strlen(zCmd);
895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncmp("clear-cert",zCmd,nCmd)==0 && nCmd>=4 ){
897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bForce = find_option("force","f",0)!=0;
898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ verify_all_options();
899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !bForce ){
900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob ans;
901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char cReply;
902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ prompt_user(
903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Confirm removing of the SSL server certificate from this repository.\n"
904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "The removal cannot be undone. Continue (y/N)? ", &ans);
905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cReply = blob_str(&ans)[0];
906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( cReply!='y' && cReply!='Y' ){
907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_exit(1);
908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_unprotect(PROTECT_ALL);
911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "PRAGMA secure_delete=ON;"
913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "DELETE FROM config "
914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE name IN ('ssl-cert','ssl-cert-file','ssl-cert-key');"
915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_protect_pop();
917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else
918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncmp("load-cert",zCmd,nCmd)==0 && nCmd>=4 ){
919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bFN = find_option("filename",0,0)!=0;
920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob allText = BLOB_INITIALIZER;
922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int haveCert = 0;
923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int haveKey = 0;
924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ verify_all_options();
925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_begin_transaction();
926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_unprotect(PROTECT_ALL);
927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "PRAGMA secure_delete=ON;"
929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "DELETE FROM config "
930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE name IN ('ssl-cert','ssl-cert-file','ssl-cert-key');"
931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nHit = 0;
933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=3; i<g.argc; i++){
934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob x;
935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isCert;
936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isKey;
937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !file_isfile(g.argv[i], ExtFILE) ){
938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("no such file: \"%s\"", g.argv[i]);
939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_read_from_file(&x, g.argv[i], ExtFILE);
941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isCert = strstr(blob_str(&x),"-----BEGIN CERTIFICATE-----")!=0;
942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isKey = strstr(blob_str(&x),"-----BEGIN PRIVATE KEY-----")!=0;
943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !isCert && !isKey ){
944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("not a certificate or a private key: \"%s\"", g.argv[i]);
945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isCert ){
947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( haveCert ){
948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("more than one certificate provided");
949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ haveCert = 1;
951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bFN ){
952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_set("ssl-cert-file", file_canonical_name_dup(g.argv[i]), 0);
953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&allText, blob_buffer(&x), blob_size(&x));
955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isKey && !haveKey ){
957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ haveKey = 1;
958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isKey = 0;
959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isKey ){
962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( haveKey ){
963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("more than one private key provided");
964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ haveKey = 1;
966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bFN ){
967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_set("ssl-key-file", file_canonical_name_dup(g.argv[i]), 0);
968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&allText, blob_buffer(&x), blob_size(&x));
970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_protect_pop();
974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !haveCert ){
975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !haveKey ){
976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("missing certificate and private-key");
977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("missing certificate");
979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( !haveKey ){
981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("missing private-key");
982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !bFN ){
984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_set("ssl-cert", blob_str(&allText), 0);
985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_commit_transaction();
987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else
988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncmp("scrub",zCmd,nCmd)==0 && nCmd>4 ){
989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bForce = find_option("force","f",0)!=0;
990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ verify_all_options();
991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !bForce ){
992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob ans;
993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char cReply;
994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ prompt_user(
995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Scrubbing the SSL configuration will permanently delete information.\n"
996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Changes cannot be undone. Continue (y/N)? ", &ans);
997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cReply = blob_str(&ans)[0];
998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( cReply!='y' && cReply!='Y' ){
999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_exit(1);
1000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_unprotect(PROTECT_ALL);
1003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
1004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "PRAGMA secure_delete=ON;"
1005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "DELETE FROM config WHERE name GLOB 'ssl-*';"
1006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_protect_pop();
1008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else
603 1009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp("show",zCmd,nCmd)==0 ){
604 1010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName, *zValue;
605 1011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t nName;
606 1012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
1013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int verbose = find_option("verbose","v",0)!=0;
1014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ verify_all_options();
1015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if !defined(FOSSIL_ENABLE_SSL)
1017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("OpenSSL-version: (none)\n");
1018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( verbose ){
1019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\n"
1020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " The OpenSSL library is not used by this build of Fossil\n\n"
1021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
607 1024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("OpenSSL-version: %s (0x%09x)\n",
608 1025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SSLeay_version(SSLEAY_VERSION), OPENSSL_VERSION_NUMBER);
1026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( verbose ){
1027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\n"
1028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " The version of the OpenSSL library being used\n"
1029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " by this instance of Fossil. Version 3.0.0 or\n"
1030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " later is recommended.\n\n"
1031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
609 1034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("OpenSSL-cert-file: %s\n", X509_get_default_cert_file());
610 1035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("OpenSSL-cert-dir: %s\n", X509_get_default_cert_dir());
1036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( verbose ){
1037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\n"
1038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " The default locations for the set of root certificates\n"
1039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " used by the \"fossil sync\" and similar commands to verify\n"
1040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " the identity of servers for \"https:\" URLs. These values\n"
1041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " come into play when Fossil is used as a TLS client. These\n"
1042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " values are built into your OpenSSL library.\n\n"
1043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
611 1046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zName = X509_get_default_cert_file_env();
612 1047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zValue = fossil_getenv(zName);
613 1048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zValue==0 ) zValue = "";
614 1049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nName = strlen(zName);
615 1050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("%s:%*s%s\n", zName, 18-nName, "", zValue);
@@ -616,25 +1051,86 @@
616 1051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zName = X509_get_default_cert_dir_env();
617 1052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zValue = fossil_getenv(zName);
618 1053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zValue==0 ) zValue = "";
619 1054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nName = strlen(zName);
620 1055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("%s:%*s%s\n", zName, 18-nName, "", zValue);
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nHit++;
1056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( verbose ){
1057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\n"
1058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " Alternative locations for the root certificates used by Fossil\n"
1059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " when it is acting as a SSL client in order to verify the identity\n"
1060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " of servers. If specified, these alternative locations override\n"
1061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " the built-in locations.\n\n"
1062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* FOSSIL_ENABLE_SSL */
1065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
622 1066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("ssl-ca-location: %s\n", db_get("ssl-ca-location",""));
1067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( verbose ){
1068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\n"
1069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " This setting is the name of a file or directory that contains\n"
1070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " the complete set of root certificates to used by Fossil when it\n"
1071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " is acting as a SSL client. If defined, this setting takes\n"
1072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " priority over built-in paths and environment variables\n\n"
1073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
623 1076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("ssl-identity: %s\n", db_get("ssl-identity",""));
1077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( verbose ){
1078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\n"
1079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " This setting is the name of a file that contains the PEM-format\n"
1080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " certificate and private-key used by Fossil clients to authentice\n"
1081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " with servers. Few servers actually require this, so this setting\n"
1082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " is usually blank.\n\n"
1083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zValue = db_get("ssl-cert",0);
1087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zValue ){
1088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("ssl-cert: (%d-byte PEM)\n", (int)strlen(zValue));
1089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("ssl-cert:\n");
1091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( verbose ){
1093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\n"
1094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " This setting is the PEM-formatted value of the SSL server\n"
1095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " certificate and private-key, used by Fossil when it is acting\n"
1096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " as a server via the \"fossil server\" command or similar.\n\n"
1097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("ssl-cert-file: %s\n", db_get("ssl-cert-file",""));
1101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("ssl-key-file: %s\n", db_get("ssl-key-file",""));
1102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( verbose ){
1103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\n"
1104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " This settings are the names of files that contin the certificate\n"
1105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " private-key used by Fossil when it is acting as a server.\n\n"
1106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
624 1109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q,
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT name FROM global_config"
1110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT name, '' FROM global_config"
626 1111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE name GLOB 'cert:*'"
627 1112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"UNION ALL "
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT name FROM config"
1113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT name, date(mtime,'unixepoch') FROM config"
629 1114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE name GLOB 'cert:*'"
630 1115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" ORDER BY name"
631 1116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
1117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nHit = 0;
632 1118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( db_step(&q)==SQLITE_ROW ){
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_print("exception: %s\n", db_column_text(&q,0)+5);
1119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("exception: %-40s %s\n",
1120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q,0)+5, db_column_text(&q,1));
1121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nHit++;
634 1122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
635 1123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
1124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nHit && verbose ){
1125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\n"
1126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " The exceptions are server certificates that the Fossil client\n"
1127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " is unable to verify using root certificates, but which should be\n"
1128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " accepted anyhow.\n\n"
1129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
636 1132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
637 1133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp("remove-exception",zCmd,nCmd)==0 ){
638 1134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
639 1135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob sql;
640 1136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zSep = "(";
@@ -673,10 +1169,54 @@
673 1169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_commit_transaction();
674 1170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&sql);
675 1171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
676 1172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*default*/{
677 1173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_fatal("unknown sub-command \"%s\".\nshould be one of:"
678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " remove-exception show",
1174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " clear-certs load-certs remove-exception scrub show",
679 1175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zCmd);
680 1176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
1177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WEBPAGE: .well-known
1181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the "--acme" option was supplied to "fossil server" or "fossil http" or
1183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** similar, then this page returns the content of files found in the
1184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ".well-known" subdirectory of the same directory that contains the
1185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** repository file. This facilitates Automated Certificate
1186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Management using tools like "certbot".
1187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The content is returned directly, without any interpretation, using
1189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a generic mimetype.
1190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void wellknown_page(void){
1192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zPath = 0;
1193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTail = P("name");
1194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob content;
1195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
1196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char c;
1197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !g.fAllowACME ) goto wellknown_notfound;
1198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.zRepositoryName==0 ) goto wellknown_notfound;
1199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zTail==0 ) goto wellknown_notfound;
1200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zPath = mprintf("%z/.well-known/%s", file_dirname(g.zRepositoryName), zTail);
1201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; (c = zTail[i])!=0; i++){
1202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_isalnum(c) ) continue;
1203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( c=='.' ){
1204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i==0 || zTail[i-1]=='/' || zTail[i-1]=='.' ) goto wellknown_notfound;
1205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continue;
1206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( c==',' || c!='-' || c=='/' || c==':' || c=='_' || c=='~' ) continue;
1208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto wellknown_notfound;
1209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strstr("/..", zPath)!=0 ) goto wellknown_notfound;
1211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !file_isfile(zPath, ExtFILE) ) goto wellknown_notfound;
1212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_read_from_file(&content, zPath, ExtFILE);
1213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_set_content(&content);
1214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_set_content_type(mimetype_from_name(zPath));
1215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_reply();
1216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
1217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wellknown_notfound:
1219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(zPath);
1220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ webpage_notfound_error(0);
1221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
682 1222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
683 1223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!