@@ -2772,7 +2772,7 @@ static void add_gpgsig_to_commit(struct strbuf *commit_data,
27722772{
27732773 struct string_list siglines = STRING_LIST_INIT_NODUP ;
27742774
2775- if (!sig -> hash_algo )
2775+ if (!sig || ! sig -> hash_algo )
27762776 return ;
27772777
27782778 strbuf_addstr (commit_data , header );
@@ -2815,6 +2815,57 @@ static void import_one_signature(struct signature_data *sig_sha1,
28152815 die (_ ("parse_one_signature() returned unknown hash algo" ));
28162816}
28172817
2818+ static void finalize_commit_buffer (struct strbuf * new_data ,
2819+ struct signature_data * sig_sha1 ,
2820+ struct signature_data * sig_sha256 ,
2821+ struct strbuf * msg )
2822+ {
2823+ add_gpgsig_to_commit (new_data , "gpgsig " , sig_sha1 );
2824+ add_gpgsig_to_commit (new_data , "gpgsig-sha256 " , sig_sha256 );
2825+
2826+ strbuf_addch (new_data , '\n' );
2827+ strbuf_addbuf (new_data , msg );
2828+ }
2829+
2830+ static void handle_strip_if_invalid (struct strbuf * new_data ,
2831+ struct signature_data * sig_sha1 ,
2832+ struct signature_data * sig_sha256 ,
2833+ struct strbuf * msg )
2834+ {
2835+ struct strbuf tmp_buf = STRBUF_INIT ;
2836+ struct signature_check signature_check = { 0 };
2837+ int ret ;
2838+
2839+ /* Check signature in a temporary commit buffer */
2840+ strbuf_addbuf (& tmp_buf , new_data );
2841+ finalize_commit_buffer (& tmp_buf , sig_sha1 , sig_sha256 , msg );
2842+ ret = verify_commit_buffer (tmp_buf .buf , tmp_buf .len , & signature_check );
2843+
2844+ if (ret ) {
2845+ const char * signer = signature_check .signer ?
2846+ signature_check .signer : _ ("unknown" );
2847+ const char * subject ;
2848+ int subject_len = find_commit_subject (msg -> buf , & subject );
2849+
2850+ if (subject_len > 100 )
2851+ warning (_ ("stripping invalid signature for commit '%.100s...'\n"
2852+ " allegedly by %s" ), subject , signer );
2853+ else if (subject_len > 0 )
2854+ warning (_ ("stripping invalid signature for commit '%.*s'\n"
2855+ " allegedly by %s" ), subject_len , subject , signer );
2856+ else
2857+ warning (_ ("stripping invalid signature for commit\n"
2858+ " allegedly by %s" ), signer );
2859+
2860+ finalize_commit_buffer (new_data , NULL , NULL , msg );
2861+ } else {
2862+ strbuf_swap (new_data , & tmp_buf );
2863+ }
2864+
2865+ signature_check_clear (& signature_check );
2866+ strbuf_release (& tmp_buf );
2867+ }
2868+
28182869static void parse_new_commit (const char * arg )
28192870{
28202871 static struct strbuf msg = STRBUF_INIT ;
@@ -2866,6 +2917,7 @@ static void parse_new_commit(const char *arg)
28662917 warning (_ ("importing a commit signature verbatim" ));
28672918 /* fallthru */
28682919 case SIGN_VERBATIM :
2920+ case SIGN_STRIP_IF_INVALID :
28692921 import_one_signature (& sig_sha1 , & sig_sha256 , v );
28702922 break ;
28712923
@@ -2950,11 +3002,12 @@ static void parse_new_commit(const char *arg)
29503002 "encoding %s\n" ,
29513003 encoding );
29523004
2953- add_gpgsig_to_commit (& new_data , "gpgsig " , & sig_sha1 );
2954- add_gpgsig_to_commit (& new_data , "gpgsig-sha256 " , & sig_sha256 );
3005+ if (signed_commit_mode == SIGN_STRIP_IF_INVALID &&
3006+ (sig_sha1 .hash_algo || sig_sha256 .hash_algo ))
3007+ handle_strip_if_invalid (& new_data , & sig_sha1 , & sig_sha256 , & msg );
3008+ else
3009+ finalize_commit_buffer (& new_data , & sig_sha1 , & sig_sha256 , & msg );
29553010
2956- strbuf_addch (& new_data , '\n' );
2957- strbuf_addbuf (& new_data , & msg );
29583011 free (author );
29593012 free (committer );
29603013 free (encoding );
@@ -2975,9 +3028,6 @@ static void handle_tag_signature(struct strbuf *msg, const char *name)
29753028 switch (signed_tag_mode ) {
29763029
29773030 /* First, modes that don't change anything */
2978- case SIGN_ABORT :
2979- die (_ ("encountered signed tag; use "
2980- "--signed-tags=<mode> to handle it" ));
29813031 case SIGN_WARN_VERBATIM :
29823032 warning (_ ("importing a tag signature verbatim for tag '%s'" ), name );
29833033 /* fallthru */
@@ -2994,7 +3044,13 @@ static void handle_tag_signature(struct strbuf *msg, const char *name)
29943044 strbuf_setlen (msg , sig_offset );
29953045 break ;
29963046
2997- /* Third, BUG */
3047+ /* Third, aborting modes */
3048+ case SIGN_ABORT :
3049+ die (_ ("encountered signed tag; use "
3050+ "--signed-tags=<mode> to handle it" ));
3051+ case SIGN_STRIP_IF_INVALID :
3052+ die (_ ("'strip-if-invalid' is not a valid mode for "
3053+ "git fast-import with --signed-tags=<mode>" ));
29983054 default :
29993055 BUG ("invalid signed_tag_mode value %d from tag '%s'" ,
30003056 signed_tag_mode , name );
0 commit comments