@@ -289,10 +289,11 @@
289 289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pContent = (void*)&((char*)pContent)[got];
290 290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
291 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return total;
292 292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
293 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0
294 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
295 296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Read client certificate and key, if set, and store them in the SSL context
296 297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to allow communication with servers which are configured to verify client
297 298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** certificates and certificate chains.
298 299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** We only support PEM and don't support password protected keys.
@@ -352,11 +353,88 @@
352 353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(keyfile);
353 354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(certfile);
354 355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(capath);
355 356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(cafile);
356 357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If an certgroup has been specified on the command line, then use it to look
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** up certificates and keys, and then store the URL-certgroup association in
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the global database. If no certgroup has been specified on the command line,
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** see if there's an entry for the url in global_config, and use it if
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** applicable.
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void ssl_load_client_authfiles(void){
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zGroupName = NULL;
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *cafile;
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *capath;
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *certfile;
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *keyfile;
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.urlCertGroup ){
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zName;
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zName = mprintf("certgroup:%s", g.urlName);
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_set(zName, g.urlCertGroup, 1);
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zName);
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zGroupName = strdup(g.urlCertGroup);
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_swap_connections();
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zGroupName = db_text(0, "SELECT value FROM global_config"
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE name='certgroup:%q'", g.urlName);
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_swap_connections();
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !zGroupName ){
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* No cert group specified or found cached */
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_swap_connections();
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cafile = db_text(0, "SELECT filepath FROM certs WHERE name=%Q"
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND type='cafile'", zGroupName);
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ capath = db_text(0, "SELECT filepath FROM certs WHERE name=%Q"
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND type='capath'", zGroupName);
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_swap_connections();
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( cafile || capath ){
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The OpenSSL documentation warns that if several CA certificates match
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the same name, key identifier and serial number conditions, only the
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** first will be examined. The caveat situation occurs when one stores an
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expired CA certificate among the valid ones.
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Simply put: Do not mix expired and valid certificates.
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SSL_CTX_load_verify_locations(sslCtx, cafile, capath)==0 ){
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("SSL: Unable to load CA verification file/path");
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_swap_connections();
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ keyfile = db_text(0, "SELECT filepath FROM certs WHERE name=%Q"
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND type='ckey'", zGroupName);
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ certfile = db_text(0, "SELECT filepath FROM certs WHERE name=%Q"
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND type='ccert'", zGroupName);
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_swap_connections();
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SSL_CTX_use_certificate_file(sslCtx, certfile, SSL_FILETYPE_PEM)<=0 ){
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("SSL: Unable to open client certificate in %s.", certfile);
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SSL_CTX_use_PrivateKey_file(sslCtx, keyfile, SSL_FILETYPE_PEM)<=0 ){
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("SSL: Unable to open client key in %s.", keyfile);
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !SSL_CTX_check_private_key(sslCtx) ){
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("SSL: Private key does not match the certificate public "
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "key.");
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(keyfile);
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(certfile);
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(capath);
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(cafile);
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
357 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0
358 436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
359 437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Get SSL authentication file reference from environment variable. If set,
360 438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** then store varaible in global config. If environment variable was not set,
361 439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** attempt to get variable from global config.
362 440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**/
@@ -378,10 +456,11 @@
378 456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
379 457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(zTmp);
380 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
381 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return zVar;
382 460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
383 462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
384 463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
385 464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** COMMAND: cert
386 465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
387 466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Usage: %fossil cert SUBCOMMAND ...
@@ -408,10 +487,11 @@
408 487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
409 488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** %fossil cert delete NAME
410 489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
411 490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Remove the credential group NAME and all it's associated URL
412 491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** associations.
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
413 493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
414 494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void cert_cmd(void){
415 495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n;
416 496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zCmd = "list";
417 497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc>=3 ){
418 498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!