rugged 1.4.4 → 1.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95c68c86d88030f5507db5f743c42f255b238a48dc0f42aac68d293ceea6492a
4
- data.tar.gz: c2c101cd24f637cc3128f9df9bdeac8babf5e7cf515d9264f37ad4c18369bc2c
3
+ metadata.gz: dd69fad6044328285033c8e2b1b4c5d55f9efc8bab4f8e2eefe854d7b3b24f0b
4
+ data.tar.gz: 4de981e42df7d71268ccd5de9570841d7f4ea328f786e4c28aa370d05c083dbe
5
5
  SHA512:
6
- metadata.gz: e95ff7c974ae560ab586bbbf8f15e5dfb2e1ad696d6266b3b2bbd91d4e8a57403a9a8910e304c279ccd6fe88818ecde2ff6485bbbe8a609eb05649220686c89b
7
- data.tar.gz: cf4ef21bd39e2861c4936b12b197a1f99eb67fe7655603f062d8f9226bf110c251ef19437fa46793107baeea1522070ae31570563a9a9b4f7a855ad2c4156d43
6
+ metadata.gz: 94d5255852031c4ba5ef3843c1d229f3e9eba4dd76255c17cf128c2751d0258eb1b629e6d9f8a549fe7ecfa5ef21dcd97ddd8411b0691e7a34d920aee6bd6e42
7
+ data.tar.gz: 6109923550772868a369a3c8da2d12a1ff049e8661d5c99b1d5752cddc5d6e4715c4bae50840313c7cceb52d87ab0b08d7a70912a92b4ff00b4123371270724b
@@ -4,5 +4,5 @@
4
4
  # For full terms see the included LICENSE file.
5
5
 
6
6
  module Rugged
7
- Version = VERSION = '1.4.4'
7
+ Version = VERSION = '1.4.5'
8
8
  end
@@ -3,7 +3,7 @@
3
3
 
4
4
  cmake_minimum_required(VERSION 3.5.1)
5
5
 
6
- project(libgit2 VERSION "1.4.4" LANGUAGES C)
6
+ project(libgit2 VERSION "1.4.5" LANGUAGES C)
7
7
 
8
8
  # Add find modules to the path
9
9
  set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
@@ -7,10 +7,10 @@
7
7
  #ifndef INCLUDE_git_version_h__
8
8
  #define INCLUDE_git_version_h__
9
9
 
10
- #define LIBGIT2_VERSION "1.4.4"
10
+ #define LIBGIT2_VERSION "1.4.5"
11
11
  #define LIBGIT2_VER_MAJOR 1
12
12
  #define LIBGIT2_VER_MINOR 4
13
- #define LIBGIT2_VER_REVISION 4
13
+ #define LIBGIT2_VER_REVISION 5
14
14
  #define LIBGIT2_VER_PATCH 0
15
15
 
16
16
  #define LIBGIT2_SOVERSION "1.4"
@@ -421,15 +421,119 @@ static int request_creds(git_credential **out, ssh_subtransport *t, const char *
421
421
  return 0;
422
422
  }
423
423
 
424
+ #define KNOWN_HOSTS_FILE ".ssh/known_hosts"
425
+
426
+ /*
427
+ * Load the known_hosts file.
428
+ *
429
+ * Returns success but leaves the output NULL if we couldn't find the file.
430
+ */
431
+ static int load_known_hosts(LIBSSH2_KNOWNHOSTS **hosts, LIBSSH2_SESSION *session)
432
+ {
433
+ git_str path = GIT_STR_INIT, home = GIT_STR_INIT;
434
+ LIBSSH2_KNOWNHOSTS *known_hosts = NULL;
435
+ int error;
436
+
437
+ GIT_ASSERT_ARG(hosts);
438
+
439
+ if ((error = git__getenv(&home, "HOME")) < 0)
440
+ return error;
441
+
442
+ if ((error = git_str_joinpath(&path, git_str_cstr(&home), KNOWN_HOSTS_FILE)) < 0)
443
+ goto out;
444
+
445
+ if ((known_hosts = libssh2_knownhost_init(session)) == NULL) {
446
+ ssh_error(session, "error initializing known hosts");
447
+ error = -1;
448
+ goto out;
449
+ }
450
+
451
+ /*
452
+ * Try to read the file and consider not finding it as not trusting the
453
+ * host rather than an error.
454
+ */
455
+ error = libssh2_knownhost_readfile(known_hosts, git_str_cstr(&path), LIBSSH2_KNOWNHOST_FILE_OPENSSH);
456
+ if (error == LIBSSH2_ERROR_FILE)
457
+ error = 0;
458
+ if (error < 0)
459
+ ssh_error(session, "error reading known_hosts");
460
+
461
+ out:
462
+ *hosts = known_hosts;
463
+
464
+ git_str_clear(&home);
465
+ git_str_clear(&path);
466
+
467
+ return error;
468
+ }
469
+
470
+ static const char *hostkey_type_to_string(int type)
471
+ {
472
+ switch (type) {
473
+ case LIBSSH2_KNOWNHOST_KEY_SSHRSA:
474
+ return "ssh-rsa";
475
+ case LIBSSH2_KNOWNHOST_KEY_SSHDSS:
476
+ return "ssh-dss";
477
+ #ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_256
478
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_256:
479
+ return "ecdsa-sha2-nistp256";
480
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_384:
481
+ return "ecdsa-sha2-nistp384";
482
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:
483
+ return "ecdsa-sha2-nistp521";
484
+ #endif
485
+ #ifdef LIBSSH2_KNOWNHOST_KEY_ED25519
486
+ case LIBSSH2_KNOWNHOST_KEY_ED25519:
487
+ return "ssh-ed25519";
488
+ #endif
489
+ }
490
+
491
+ return NULL;
492
+ }
493
+
494
+ /*
495
+ * We figure out what kind of key we want to ask the remote for by trying to
496
+ * look it up with a nonsense key and using that mismatch to figure out what key
497
+ * we do have stored for the host.
498
+ *
499
+ * Returns the string to pass to libssh2_session_method_pref or NULL if we were
500
+ * unable to find anything or an error happened.
501
+ */
502
+ static const char *find_hostkey_preference(LIBSSH2_KNOWNHOSTS *known_hosts, const char *hostname, int port)
503
+ {
504
+ struct libssh2_knownhost *host = NULL;
505
+ /* Specify no key type so we don't filter on that */
506
+ int type = LIBSSH2_KNOWNHOST_TYPE_PLAIN | LIBSSH2_KNOWNHOST_KEYENC_RAW;
507
+ const char key = '\0';
508
+ int error;
509
+
510
+ /*
511
+ * In case of mismatch, we can find the type of key from known_hosts in
512
+ * the returned host's information as it means that an entry was found
513
+ * but our nonsense key obviously didn't match.
514
+ */
515
+ error = libssh2_knownhost_checkp(known_hosts, hostname, port, &key, 1, type, &host);
516
+ if (error == LIBSSH2_KNOWNHOST_CHECK_MISMATCH)
517
+ return hostkey_type_to_string(host->typemask & LIBSSH2_KNOWNHOST_KEY_MASK);
518
+
519
+ return NULL;
520
+ }
521
+
424
522
  static int _git_ssh_session_create(
425
523
  LIBSSH2_SESSION **session,
524
+ LIBSSH2_KNOWNHOSTS **hosts,
525
+ const char *hostname,
526
+ int port,
426
527
  git_stream *io)
427
528
  {
428
529
  int rc = 0;
429
530
  LIBSSH2_SESSION *s;
531
+ LIBSSH2_KNOWNHOSTS *known_hosts;
430
532
  git_socket_stream *socket = GIT_CONTAINER_OF(io, git_socket_stream, parent);
533
+ const char *keytype = NULL;
431
534
 
432
535
  GIT_ASSERT_ARG(session);
536
+ GIT_ASSERT_ARG(hosts);
433
537
 
434
538
  s = libssh2_session_init();
435
539
  if (!s) {
@@ -437,21 +541,225 @@ static int _git_ssh_session_create(
437
541
  return -1;
438
542
  }
439
543
 
544
+ if ((rc = load_known_hosts(&known_hosts, s)) < 0) {
545
+ ssh_error(s, "error loading known_hosts");
546
+ libssh2_session_free(s);
547
+ return -1;
548
+ }
549
+
550
+ if ((keytype = find_hostkey_preference(known_hosts, hostname, port)) != NULL) {
551
+ do {
552
+ rc = libssh2_session_method_pref(s, LIBSSH2_METHOD_HOSTKEY, keytype);
553
+ } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc);
554
+ if (rc != LIBSSH2_ERROR_NONE) {
555
+ ssh_error(s, "failed to set hostkey preference");
556
+ goto on_error;
557
+ }
558
+ }
559
+
560
+
440
561
  do {
441
562
  rc = libssh2_session_handshake(s, socket->s);
442
563
  } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc);
443
564
 
444
565
  if (rc != LIBSSH2_ERROR_NONE) {
445
566
  ssh_error(s, "failed to start SSH session");
446
- libssh2_session_free(s);
447
- return -1;
567
+ goto on_error;
448
568
  }
449
569
 
450
570
  libssh2_session_set_blocking(s, 1);
451
571
 
452
572
  *session = s;
573
+ *hosts = known_hosts;
453
574
 
454
575
  return 0;
576
+
577
+ on_error:
578
+ libssh2_knownhost_free(known_hosts);
579
+ libssh2_session_free(s);
580
+ return -1;
581
+ }
582
+
583
+
584
+ /*
585
+ * Returns the typemask argument to pass to libssh2_knownhost_check{,p} based on
586
+ * the type of key that libssh2_session_hostkey returns.
587
+ */
588
+ static int fingerprint_type_mask(int keytype)
589
+ {
590
+ int mask = LIBSSH2_KNOWNHOST_TYPE_PLAIN | LIBSSH2_KNOWNHOST_KEYENC_RAW;
591
+ return mask;
592
+
593
+ switch (keytype) {
594
+ case LIBSSH2_HOSTKEY_TYPE_RSA:
595
+ mask |= LIBSSH2_KNOWNHOST_KEY_SSHRSA;
596
+ break;
597
+ case LIBSSH2_HOSTKEY_TYPE_DSS:
598
+ mask |= LIBSSH2_KNOWNHOST_KEY_SSHDSS;
599
+ break;
600
+ #ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
601
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
602
+ mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_256;
603
+ break;
604
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
605
+ mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_384;
606
+ break;
607
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_521:
608
+ mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_521;
609
+ break;
610
+ #endif
611
+ #ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
612
+ case LIBSSH2_HOSTKEY_TYPE_ED25519:
613
+ mask |= LIBSSH2_KNOWNHOST_KEY_ED25519;
614
+ break;
615
+ #endif
616
+ }
617
+
618
+ return mask;
619
+ }
620
+
621
+ /*
622
+ * Check the host against the user's known_hosts file.
623
+ *
624
+ * Returns 1/0 for valid/''not-valid or <0 for an error
625
+ */
626
+ static int check_against_known_hosts(
627
+ LIBSSH2_SESSION *session,
628
+ LIBSSH2_KNOWNHOSTS *known_hosts,
629
+ const char *hostname,
630
+ int port,
631
+ const char *key,
632
+ size_t key_len,
633
+ int key_type)
634
+ {
635
+ int check, typemask, ret = 0;
636
+ struct libssh2_knownhost *host = NULL;
637
+
638
+ if (known_hosts == NULL)
639
+ return 0;
640
+
641
+ typemask = fingerprint_type_mask(key_type);
642
+ check = libssh2_knownhost_checkp(known_hosts, hostname, port, key, key_len, typemask, &host);
643
+ if (check == LIBSSH2_KNOWNHOST_CHECK_FAILURE) {
644
+ ssh_error(session, "error checking for known host");
645
+ return -1;
646
+ }
647
+
648
+ ret = check == LIBSSH2_KNOWNHOST_CHECK_MATCH ? 1 : 0;
649
+
650
+ return ret;
651
+ }
652
+
653
+ /*
654
+ * Perform the check for the session's certificate against known hosts if
655
+ * possible and then ask the user if they have a callback.
656
+ *
657
+ * Returns 1/0 for valid/not-valid or <0 for an error
658
+ */
659
+ static int check_certificate(
660
+ LIBSSH2_SESSION *session,
661
+ LIBSSH2_KNOWNHOSTS *known_hosts,
662
+ git_transport_certificate_check_cb check_cb,
663
+ void *check_cb_payload,
664
+ const char *host,
665
+ int port)
666
+ {
667
+ git_cert_hostkey cert = {{ 0 }};
668
+ const char *key;
669
+ size_t cert_len;
670
+ int cert_type, cert_valid = 0, error = 0;
671
+
672
+ if ((key = libssh2_session_hostkey(session, &cert_len, &cert_type)) == NULL) {
673
+ ssh_error(session, "failed to retrieve hostkey");
674
+ return -1;
675
+ }
676
+
677
+ if ((cert_valid = check_against_known_hosts(session, known_hosts, host, port, key, cert_len, cert_type)) < 0)
678
+ return -1;
679
+
680
+ cert.parent.cert_type = GIT_CERT_HOSTKEY_LIBSSH2;
681
+ if (key != NULL) {
682
+ cert.type |= GIT_CERT_SSH_RAW;
683
+ cert.hostkey = key;
684
+ cert.hostkey_len = cert_len;
685
+ switch (cert_type) {
686
+ case LIBSSH2_HOSTKEY_TYPE_RSA:
687
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_RSA;
688
+ break;
689
+ case LIBSSH2_HOSTKEY_TYPE_DSS:
690
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_DSS;
691
+ break;
692
+
693
+ #ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
694
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
695
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256;
696
+ break;
697
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
698
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384;
699
+ break;
700
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:
701
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521;
702
+ break;
703
+ #endif
704
+
705
+ #ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
706
+ case LIBSSH2_HOSTKEY_TYPE_ED25519:
707
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ED25519;
708
+ break;
709
+ #endif
710
+ default:
711
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_UNKNOWN;
712
+ }
713
+ }
714
+
715
+ #ifdef LIBSSH2_HOSTKEY_HASH_SHA256
716
+ key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256);
717
+ if (key != NULL) {
718
+ cert.type |= GIT_CERT_SSH_SHA256;
719
+ memcpy(&cert.hash_sha256, key, 32);
720
+ }
721
+ #endif
722
+
723
+ key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
724
+ if (key != NULL) {
725
+ cert.type |= GIT_CERT_SSH_SHA1;
726
+ memcpy(&cert.hash_sha1, key, 20);
727
+ }
728
+
729
+ key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5);
730
+ if (key != NULL) {
731
+ cert.type |= GIT_CERT_SSH_MD5;
732
+ memcpy(&cert.hash_md5, key, 16);
733
+ }
734
+
735
+ if (cert.type == 0) {
736
+ git_error_set(GIT_ERROR_SSH, "unable to get the host key");
737
+ return -1;
738
+ }
739
+
740
+ git_error_clear();
741
+ error = 0;
742
+ if (!cert_valid) {
743
+ git_error_set(GIT_ERROR_SSH, "invalid or unknown remote ssh hostkey");
744
+ error = GIT_ECERTIFICATE;
745
+ }
746
+
747
+ if (check_cb != NULL) {
748
+ git_cert_hostkey *cert_ptr = &cert;
749
+ git_error_state previous_error = {0};
750
+
751
+ git_error_state_capture(&previous_error, error);
752
+ error = check_cb((git_cert *) cert_ptr, cert_valid, host, check_cb_payload);
753
+ if (error == GIT_PASSTHROUGH) {
754
+ error = git_error_state_restore(&previous_error);
755
+ } else if (error < 0 && !git_error_last()) {
756
+ git_error_set(GIT_ERROR_NET, "user canceled hostkey check");
757
+ }
758
+
759
+ git_error_state_free(&previous_error);
760
+ }
761
+
762
+ return error;
455
763
  }
456
764
 
457
765
  #define SSH_DEFAULT_PORT "22"
@@ -462,11 +770,12 @@ static int _git_ssh_setup_conn(
462
770
  const char *cmd,
463
771
  git_smart_subtransport_stream **stream)
464
772
  {
465
- int auth_methods, error = 0;
773
+ int auth_methods, error = 0, port;
466
774
  ssh_stream *s;
467
775
  git_credential *cred = NULL;
468
776
  LIBSSH2_SESSION *session=NULL;
469
777
  LIBSSH2_CHANNEL *channel=NULL;
778
+ LIBSSH2_KNOWNHOSTS *known_hosts = NULL;
470
779
 
471
780
  t->current_stream = NULL;
472
781
 
@@ -490,96 +799,20 @@ static int _git_ssh_setup_conn(
490
799
  (error = git_stream_connect(s->io)) < 0)
491
800
  goto done;
492
801
 
493
- if ((error = _git_ssh_session_create(&session, s->io)) < 0)
494
- goto done;
495
-
496
- if (t->owner->connect_opts.callbacks.certificate_check != NULL) {
497
- git_cert_hostkey cert = {{ 0 }}, *cert_ptr;
498
- const char *key;
499
- size_t cert_len;
500
- int cert_type;
501
-
502
- cert.parent.cert_type = GIT_CERT_HOSTKEY_LIBSSH2;
503
-
504
- key = libssh2_session_hostkey(session, &cert_len, &cert_type);
505
- if (key != NULL) {
506
- cert.type |= GIT_CERT_SSH_RAW;
507
- cert.hostkey = key;
508
- cert.hostkey_len = cert_len;
509
- switch (cert_type) {
510
- case LIBSSH2_HOSTKEY_TYPE_RSA:
511
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_RSA;
512
- break;
513
- case LIBSSH2_HOSTKEY_TYPE_DSS:
514
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_DSS;
515
- break;
516
-
517
- #ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
518
- case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
519
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256;
520
- break;
521
- case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
522
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384;
523
- break;
524
- case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:
525
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521;
526
- break;
527
- #endif
528
-
529
- #ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
530
- case LIBSSH2_HOSTKEY_TYPE_ED25519:
531
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ED25519;
532
- break;
533
- #endif
534
- default:
535
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_UNKNOWN;
536
- }
537
- }
538
-
539
- #ifdef LIBSSH2_HOSTKEY_HASH_SHA256
540
- key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256);
541
- if (key != NULL) {
542
- cert.type |= GIT_CERT_SSH_SHA256;
543
- memcpy(&cert.hash_sha256, key, 32);
544
- }
545
- #endif
546
-
547
- key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
548
- if (key != NULL) {
549
- cert.type |= GIT_CERT_SSH_SHA1;
550
- memcpy(&cert.hash_sha1, key, 20);
551
- }
552
-
553
- key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5);
554
- if (key != NULL) {
555
- cert.type |= GIT_CERT_SSH_MD5;
556
- memcpy(&cert.hash_md5, key, 16);
557
- }
558
-
559
- if (cert.type == 0) {
560
- git_error_set(GIT_ERROR_SSH, "unable to get the host key");
561
- error = -1;
562
- goto done;
563
- }
564
-
565
- /* We don't currently trust any hostkeys */
566
- git_error_clear();
567
-
568
- cert_ptr = &cert;
569
-
570
- error = t->owner->connect_opts.callbacks.certificate_check(
571
- (git_cert *)cert_ptr,
572
- 0,
573
- s->url.host,
574
- t->owner->connect_opts.callbacks.payload);
802
+ /*
803
+ * Try to parse the port as a number, if we can't then fall back to
804
+ * default. It would be nice if we could get the port that was resolved
805
+ * as part of the stream connection, but that's not something that's
806
+ * exposed.
807
+ */
808
+ if (git__strntol32(&port, s->url.port, strlen(s->url.port), NULL, 10) < 0)
809
+ port = -1;
575
810
 
576
- if (error < 0 && error != GIT_PASSTHROUGH) {
577
- if (!git_error_last())
578
- git_error_set(GIT_ERROR_NET, "user cancelled hostkey check");
811
+ if ((error = _git_ssh_session_create(&session, &known_hosts, s->url.host, port, s->io)) < 0)
812
+ goto done;
579
813
 
580
- goto done;
581
- }
582
- }
814
+ if ((error = check_certificate(session, known_hosts, t->owner->connect_opts.callbacks.certificate_check, t->owner->connect_opts.callbacks.payload, s->url.host, port)) < 0)
815
+ goto done;
583
816
 
584
817
  /* we need the username to ask for auth methods */
585
818
  if (!s->url.username) {
@@ -651,6 +884,8 @@ done:
651
884
  if (error < 0) {
652
885
  ssh_stream_free(*stream);
653
886
 
887
+ if (known_hosts)
888
+ libssh2_knownhost_free(known_hosts);
654
889
  if (session)
655
890
  libssh2_session_free(session);
656
891
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rugged
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.4
4
+ version: 1.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Chacon
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-07-13 00:00:00.000000000 Z
12
+ date: 2023-01-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake-compiler