summaryrefslogtreecommitdiff
path: root/src/gmrequest.c
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2020-08-03 09:26:29 +0300
committerJaakko Keränen <jaakko.keranen@iki.fi>2020-08-03 09:26:29 +0300
commit922ad3220909b7314ca629949b44d7d3aa0336b2 (patch)
tree7e049981dd15e896d10d44b443228f00425b1a6f /src/gmrequest.c
parente4681eca785d1b090da2d26dc2a0e32abf0217b9 (diff)
Working on server certificates
Diffstat (limited to 'src/gmrequest.c')
-rw-r--r--src/gmrequest.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/gmrequest.c b/src/gmrequest.c
index f43e4220..32b386b2 100644
--- a/src/gmrequest.c
+++ b/src/gmrequest.c
@@ -20,6 +20,7 @@ struct Impl_GmRequest {
20 iObject object; 20 iObject object;
21 iMutex mutex; 21 iMutex mutex;
22 enum iGmRequestState state; 22 enum iGmRequestState state;
23 enum iGmRequestCertification certState;
23 iString url; 24 iString url;
24 iTlsRequest *req; 25 iTlsRequest *req;
25 enum iGmStatusCode code; 26 enum iGmStatusCode code;
@@ -37,6 +38,7 @@ iDefineAudienceGetter(GmRequest, finished)
37void init_GmRequest(iGmRequest *d) { 38void init_GmRequest(iGmRequest *d) {
38 init_Mutex(&d->mutex); 39 init_Mutex(&d->mutex);
39 d->state = initialized_GmRequestState; 40 d->state = initialized_GmRequestState;
41 d->certState = notApplicable_GmRequestCertification;
40 init_String(&d->url); 42 init_String(&d->url);
41 d->req = NULL; 43 d->req = NULL;
42 d->code = none_GmStatusCode; 44 d->code = none_GmStatusCode;
@@ -166,6 +168,7 @@ static void requestFinished_GmRequest_(iAnyObject *obj) {
166 d->state = finished_GmRequestState; 168 d->state = finished_GmRequestState;
167#if 1 169#if 1
168 /* Check the server certificate. */ { 170 /* Check the server certificate. */ {
171 d->certState = invalid_GmRequestCertification; /* check trust */
169 const iTlsCertificate *cert = serverCertificate_TlsRequest(d->req); 172 const iTlsCertificate *cert = serverCertificate_TlsRequest(d->req);
170 printf("Server certificate:\n%s\n", cstrLocal_String(pem_TlsCertificate(cert))); 173 printf("Server certificate:\n%s\n", cstrLocal_String(pem_TlsCertificate(cert)));
171 iBlock *sha = fingerprint_TlsCertificate(cert); 174 iBlock *sha = fingerprint_TlsCertificate(cert);
@@ -208,6 +211,7 @@ void submit_GmRequest(iGmRequest *d) {
208 /* TODO: Check supported file types: images, audio */ 211 /* TODO: Check supported file types: images, audio */
209 /* TODO: Detect text files based on contents? E.g., is the content valid UTF-8. */ 212 /* TODO: Detect text files based on contents? E.g., is the content valid UTF-8. */
210 d->code = success_GmStatusCode; 213 d->code = success_GmStatusCode;
214 d->certState = notApplicable_GmRequestCertification;
211 if (endsWithCase_String(path, ".gmi")) { 215 if (endsWithCase_String(path, ".gmi")) {
212 setCStr_String(&d->header, "text/gemini; charset=utf-8"); 216 setCStr_String(&d->header, "text/gemini; charset=utf-8");
213 } 217 }
@@ -235,11 +239,13 @@ void submit_GmRequest(iGmRequest *d) {
235 } 239 }
236 iRelease(f); 240 iRelease(f);
237 d->state = finished_GmRequestState; 241 d->state = finished_GmRequestState;
242 d->certState = notApplicable_GmRequestCertification;
238 iNotifyAudience(d, finished, GmRequestFinished); 243 iNotifyAudience(d, finished, GmRequestFinished);
239 return; 244 return;
240 } 245 }
241 else if (equalCase_Rangecc(&url.protocol, "data")) { 246 else if (equalCase_Rangecc(&url.protocol, "data")) {
242 d->code = success_GmStatusCode; 247 d->code = success_GmStatusCode;
248 d->certState = notApplicable_GmRequestCertification;
243 iString *src = collectNewCStr_String(url.protocol.start + 5); 249 iString *src = collectNewCStr_String(url.protocol.start + 5);
244 iRangecc header = { constBegin_String(src), constBegin_String(src) }; 250 iRangecc header = { constBegin_String(src), constBegin_String(src) };
245 while (header.end < constEnd_String(src) && *header.end != ',') { 251 while (header.end < constEnd_String(src) && *header.end != ',') {