git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH v6 18/23] send-pack: send feature request on push-cert packet
Date: Wed, 17 Sep 2014 15:45:53 -0700	[thread overview]
Message-ID: <1410993958-32394-19-git-send-email-gitster@pobox.com> (raw)
In-Reply-To: <1410993958-32394-1-git-send-email-gitster@pobox.com>

We would want to update the interim protocol so that we do not send
the usual update commands when the push certificate feature is in
use, as the same information is in the certificate.  Once that
happens, the push-cert packet may become the only protocol command,
but then there is no packet to put the feature request behind, like
we always did.

As we have prepared the receiving end that understands the push-cert
feature to accept the feature request on the first protocol packet
(other than "shallow ", which was an unfortunate historical mistake
that has to come before everything else), we can give the feature
request on the push-cert packet instead of the first update protocol
packet, in preparation for the next step to actually update to the
final protocol.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Unchanged since v5.

 send-pack.c            | 13 ++++++++-----
 t/t5534-push-signed.sh | 13 +++++++++++++
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/send-pack.c b/send-pack.c
index ef93f33..d392f5b 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -225,9 +225,10 @@ static const char *next_line(const char *line, size_t len)
 	return nl + 1;
 }
 
-static void generate_push_cert(struct strbuf *req_buf,
-			       const struct ref *remote_refs,
-			       struct send_pack_args *args)
+static int generate_push_cert(struct strbuf *req_buf,
+			      const struct ref *remote_refs,
+			      struct send_pack_args *args,
+			      const char *cap_string)
 {
 	const struct ref *ref;
 	char stamp[60];
@@ -256,7 +257,7 @@ static void generate_push_cert(struct strbuf *req_buf,
 	if (sign_buffer(&cert, &cert, signing_key))
 		die(_("failed to sign the push certificate"));
 
-	packet_buf_write(req_buf, "push-cert\n");
+	packet_buf_write(req_buf, "push-cert%c%s", 0, cap_string);
 	for (cp = cert.buf; cp < cert.buf + cert.len; cp = np) {
 		np = next_line(cp, cert.buf + cert.len - cp);
 		packet_buf_write(req_buf,
@@ -267,6 +268,7 @@ static void generate_push_cert(struct strbuf *req_buf,
 free_return:
 	free(signing_key);
 	strbuf_release(&cert);
+	return update_seen;
 }
 
 int send_pack(struct send_pack_args *args,
@@ -335,7 +337,8 @@ int send_pack(struct send_pack_args *args,
 		advertise_shallow_grafts_buf(&req_buf);
 
 	if (!args->dry_run && args->push_cert)
-		generate_push_cert(&req_buf, remote_refs, args);
+		cmds_sent = generate_push_cert(&req_buf, remote_refs, args,
+					       cap_buf.buf);
 
 	/*
 	 * Clear the status for each ref and see if we need to send
diff --git a/t/t5534-push-signed.sh b/t/t5534-push-signed.sh
index 4198b6a..2f4b74e 100755
--- a/t/t5534-push-signed.sh
+++ b/t/t5534-push-signed.sh
@@ -73,6 +73,19 @@ test_expect_success 'push --signed fails with a receiver without push certificat
 	test_i18ngrep "the receiving end does not support" err
 '
 
+test_expect_success GPG 'no certificate for a signed push with no update' '
+	prepare_dst &&
+	mkdir -p dst/.git/hooks &&
+	write_script dst/.git/hooks/post-receive <<-\EOF &&
+	if test -n "${GIT_PUSH_CERT-}"
+	then
+		git cat-file blob $GIT_PUSH_CERT >../push-cert
+	fi
+	EOF
+	git push dst noop &&
+	! test -f dst/push-cert
+'
+
 test_expect_success GPG 'signed push sends push certificate' '
 	prepare_dst &&
 	mkdir -p dst/.git/hooks &&
-- 
2.1.0-403-g099cf47

  parent reply	other threads:[~2014-09-17 22:47 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-17 22:45 [PATCH v6 00/23] Signed push Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 01/23] receive-pack: do not overallocate command structure Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 02/23] receive-pack: parse feature request a bit earlier Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 03/23] receive-pack: do not reuse old_sha1[] for other things Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 04/23] receive-pack: factor out queueing of command Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 05/23] send-pack: move REF_STATUS_REJECT_NODELETE logic a bit higher Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 06/23] send-pack: refactor decision to send update per ref Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 07/23] send-pack: always send capabilities Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 08/23] send-pack: factor out capability string generation Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 09/23] receive-pack: " Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 10/23] send-pack: rename "new_refs" to "need_pack_data" Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 11/23] send-pack: refactor inspecting and resetting status and sending commands Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 12/23] send-pack: clarify that cmds_sent is a boolean Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 13/23] gpg-interface: move parse_gpg_output() to where it should be Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 14/23] gpg-interface: move parse_signature() " Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 15/23] pack-protocol doc: typofix for PKT-LINE Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 16/23] push: the beginning of "git push --signed" Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 17/23] receive-pack: GPG-validate push certificates Junio C Hamano
2014-09-17 22:45 ` Junio C Hamano [this message]
2014-09-17 22:45 ` [PATCH v6 19/23] signed push: remove duplicated protocol info Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 20/23] signed push: add "pushee" header to push certificate Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 21/23] signed push: fortify against replay attacks Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 22/23] signed push: teach smart-HTTP to pass "git push --signed" around Junio C Hamano
2014-09-17 22:45 ` [PATCH v6 23/23] signed push: allow stale nonce in stateless mode Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1410993958-32394-19-git-send-email-gitster@pobox.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).