Commit Graph

3922 Commits

Author SHA1 Message Date
Dave Borowitz 1f2827ecaa PushCertificateParser: Make constructor public
Primarily to aid in writing end-to-end tests, which must be written
outside this package as we don't currently have a Bouncy Castle
dependency.

Change-Id: Ia24179773140d9ecc616b3a6b2e630c85d800157
2015-07-09 11:50:11 -07:00
Dave Borowitz 6e4e34bb9e Report PackProtocolExceptions to client during receive-pack
We have done this since forever with the "wanted old new ref" error,
so let's do it for other such errors thrown in the same block as well.

Change-Id: Ib3b1c7f05e31a5b3e40e85eb07b16736920a033b
2015-07-09 11:41:24 -07:00
Dave Borowitz a643aaaa4a PushCertificate: implement hashCode/equals/toString
Change-Id: Ib588a3f47492cee5e5e6274a3b088678919a0fa0
2015-07-09 11:15:41 -07:00
Dave Borowitz 8293c770b5 PushCertificateParser: Make pushee optional
When pushing to an HTTP server using the C git client, I observed a
certificate lacking a pushee field. Handle this gracefully in the
parser.

Change-Id: I7f3c5fa78f2e35172a93180036e679687415cac4
2015-07-09 11:05:45 -07:00
Dave Borowitz f22f33f5bf PushCertificateParser: Change error string for invalid field
The old one didn't take an argument; the new one includes the field
name.

Change-Id: I175dc75dcdd05ba6fdec315c04c79550cfdc2342
2015-07-09 10:56:02 -07:00
Dave Borowitz 618f213da0 PushCertificateParser: Add method for parsing from a stream
We intend to store received push certificates somewhere, like a
particular ref in the repository in question. For reading data back
out, it will be useful to read push certificates (without pkt-line
framing) in a streaming fashion.

Change-Id: I70de313b1ae463407b69505caee63e8f4e057ed4
2015-07-09 10:55:52 -07:00
Dave Borowitz dac6ae3d17 IO: Add a method for reading lines
Change-Id: Ib7be76aa7ac889354ad4782e2b64d4221a0e25b9
2015-07-08 10:29:11 -07:00
Dave Borowitz 469734bf87 BaseReceivePack: Treat all LFs as optional
Discussion on the git mailing list has concluded[1] that the intended
behavior for all (non-sideband) portions of the receive-pack protocol
is for trailing LFs in pkt-lines to be optional. Go back to using
PacketLineIn#readString() everywhere.

For push certificates specifically, we agreed that the payload signed
by the client is always concatenated with LFs even though the client
MAY omit LFs when framing the certificate for the wire. This is still
reflected in the implementation of PushCertificate#toText().

[1] http://thread.gmane.org/gmane.comp.version-control.git/273175/focus=273412

Change-Id: I817231c4d4defececb8722142fea18ff42e06e44
2015-07-07 15:44:17 -04:00
Dave Borowitz 59b000a672 BaseReceivePack: More validation during parseCommand
Change-Id: I25f3a5582a45dd0ec8f78f5daf74c2203797a184
2015-07-07 15:44:17 -04:00
Chris Price 88168c6d60 Use local variable in RepositoryTestCase.indexState
There is a signature of the test helper method `indexState`,
in `RepositoryTestCase`, that accepts a `Repository` object
as an argument.  However, there was one line of code where
this variable was not being used, and the method was instead
referring to a member variable `db`.  I believe this was
probably just an oversight in a previous refactor, and
that the correct behavior is to use the variable from
the argument list.  This change also has the benefit
of making it possible to convert this method to a static
method, since it no longer relies on any state from the class.

Bug: 436200
Change-Id: Iac95b046dc5bd0b3756642e241c3637f1fad3609
Signed-off-by: Chris Price <chris@puppetlabs.com>
2015-07-07 12:34:03 +01:00
Matthias Sohn 91e17b0080 Fix non-escaped quotes in JGitText.properties
In most texts we use "cannot" hence instead of escaping the apostroph in
"can't" use "cannot".

Bug: 471796
Change-Id: Icda5b4db38076789d06498428909306aef3cb68b
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
2015-07-07 08:24:43 +02:00
Jonathan Nieder 761f070866 Throw InvalidObjectIdException from ObjectId.fromString("tooshort")
ObjectId.fromString already throws InvalidObjectIdException for most
malformed object ids, but for this kind it previously threw
IllegalArgumentException.  Since InvalidObjectIdException is a child of
IllegalArgumentException, callers that catch IllegalArgumentException
will continue to work.

Change-Id: I24e1422d51607c86a1cb816a495703279e461f01
Signed-off-by: Jonathan Nieder <jrn@google.com>
2015-07-06 12:41:06 -07:00
Jonathan Nieder 0c7ad12c76 Avoid double-colon in InvalidObjectIdException description
The invalidId message in JGitText and the asAscii bad id both contain a
colon, so the resulting message would say

	Invalid id: : a78987c98798ufa

Fix it by keeping the colon in the translated message and not adding
another colon programmatically.

Noticed by code inspection.

Change-Id: I13972eebde27a4128828e6c64517666f0ba6288b
Signed-off-by: Jonathan Nieder <jrn@google.com>
2015-07-06 12:34:31 -07:00
Matthias Sohn 3c33d094a1 Compare API against 4.0.0.201506090130-r
Change-Id: I7cb7e89875b5238a54411b8c43c298d4cbe9f7ac
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
2015-06-24 15:14:54 +02:00
Matthias Sohn 7e0d28e924 Merge branch 'stable-4.0'
Change-Id: I5c965206ad10bababe366a51ab7c33a8836a7868
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
2015-06-24 14:46:51 +02:00
Matthias Sohn 176c4b4d5e Prepare 4.0.2-SNAPSHOT builds
Change-Id: I645cacfdde21aa28aa2e17c10dec0576b170ed0e
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
2015-06-24 13:51:21 +02:00
Matthias Sohn 90f36e5002 JGit v4.0.1.201506240215-r
Change-Id: Ib7713b657e7812b0debd72bb4eece0daa187e80d
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
2015-06-24 08:17:29 +02:00
Tobias Oberlies d34314644e API to remove repositories from RepositoryCache
Add methods that allow to unregister repositories from the
RepositoryCache individually.

Bug: 470234
Change-Id: Ib918a634d829c9898072ae7bdeb22b099a32b1c9
Signed-off-by: Tobias Oberlies <tobias.oberlies@sap.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
2015-06-23 14:30:18 +02:00
Christian Halstrick 6b65adca2d Add a grace period for packfiles during GC
For loose objects an expiration date can be set which will save too
young objects from being deleted. Add the same for packfiles. Packfiles
which are too young are not deleted.

Bug: 468024
Change-Id: I3956411d19b47aaadc215dab360d57fa6c24635e
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
2015-06-22 11:18:31 +02:00
Dave Borowitz d2fbbc910a SignedPushConfig: Allow setting a custom nonce generator impl
Change-Id: Ic0156a7d65d99881ef27801fcce7754594c436f0
2015-06-18 13:24:04 -04:00
Dave Borowitz ea21f17f29 PackCertificateParser: return null if nothing was received
Add test for this case in both the enabled and disabled cases.

Change-Id: If9d12192a2dc9f9dd1eac9844b5a7b0edadc0b34
2015-06-18 13:13:43 -04:00
Dave Borowitz fc6790a5d7 Include push certificates in RefUpdate
This may be used by e.g. a custom reflog implementation to record
this information along with the ref update.

Change-Id: I44adbfad704b76f9c1beced6e1ce82eaf71410d2
2015-06-18 10:27:31 -04:00
Dave Borowitz 856db79b1d Remove redundant @since tags in new signed push classes
Change-Id: I9f57318a59f668906b80f67230d36ba6439fc7b4
2015-06-18 10:19:40 -04:00
Dave Borowitz e49e7b4bd4 Add a separate type for the identity in a push certificate
These differ subtly from a PersonIdent, because they can contain
anything that is a valid User ID passed to gpg --local-user. Upstream
git push --signed will just take the configuration value from
user.signingkey and pass that verbatim in both --local-user and the
pusher field of the certificate. This does not necessarily contain an
email address, which means the parsing implementation ends up being
substantially different from RawParseUtils.parsePersonIdent.
Nonetheless, we try hard to match PersonIdent behavior in
questionable cases.

Change-Id: I37714ce7372ccf554b24ddbff56aa61f0b19cbae
2015-06-18 09:50:12 -04:00
Dave Borowitz b822f9b51d PushCertificateParser: include begin/end lines in signature
The signature is intended to be passed to a verification library such
as Bouncy Castle, which expects these lines to be present in order to
parse the signature.

Change-Id: I22097bead2746da5fc53419f79761cafd5c31c3b
2015-06-18 09:50:12 -04:00
Dave Borowitz 48c35edfd2 PushCertificateParser: throw PackProtocolException in more cases
This is the subclass of IOException already thrown by
BaseReceivePack#recvCommands when encountering an invalid value on
the wire. That's what PushCertificateParser is doing too, so use the
same subclass.

Change-Id: I1d323909ffe70757ea56e511556080695b1a0c11
2015-06-18 09:50:12 -04:00
Dave Borowitz 8d0cedf2ec Extract a class for signed push configuration
The default behavior is to read a repository's signed push
configuration from that repo's config file, but this is not very
flexible when it comes to managing groups of repositories (e.g. with
Gerrit). Allow callers to override the configuration using a POJO.

Change-Id: Ib8f33e75daa0b2fbd000a2c4558c01c014ab1ce5
2015-06-18 09:50:11 -04:00
Dave Borowitz e26d0c8ace BaseReceivePack: fix reading cert lines in command loop
Add a missing continues to prevent falling through to the command
parsing section. The first continue happens when the command list is
empty, so change the condition to see whether we have read the first
line, rather than any commands.

Fix comparison to BEGIN_SIGNATURE to use raw line with newline.

Change-Id: If3d92f5ceade8ba7605847a4b2bc55ff17d119ac
2015-06-18 09:50:11 -04:00
Matthias Sohn 4831470581 Silence API warnings introduced by a85e817d
a85e817d is a slightly breaking API change to classes that were
technically public and technically released in 4.0. However, it is
highly unlikely that people were actually depending on public behavior,
since there were no public methods to create PushCertificates with
anything other than null field values, or a PushCertificateParser that
did anything other than infinite loop or throw exceptions when reading.

Change-Id: I1d0ba9ea0a347e8ff5a0f4af169d9bb18c5838d2
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
2015-06-17 23:08:45 +02:00
Terry Parker 8b20f2c890 Update comments about PackStatistics
Change-Id: I4862932dc38b58cc98400ed584cc506013846065
Signed-off-by: Terry Parker <tparker@google.com>
2015-06-16 10:08:18 -07:00
Terry Parker 6a415915c2 Add the set of shallow commits to PackStatistics
Change-Id: I976102e054369b045340d4b9209984b5243e3750
Signed-off-by: Terry Parker <tparker@google.com>
2015-06-15 14:49:47 -07:00
Dave Borowitz ec37daeb7f Add tests for HMACSHA1NonceGenerator
Correct documentation of NonceStatus.OK/SLOP to match the implemented
behavior.

Change-Id: Id5ec1945eab76db6d2e4b592cb25907ea3d835cd
2015-06-15 10:32:09 -04:00
Shawn Pearce d399a56e66 Merge "Introduce PostUploadHook to replace UploadPackLogger" 2015-06-12 17:21:40 -04:00
Terry Parker d9bbb04c3e Introduce PostUploadHook to replace UploadPackLogger
UploadPackLogger is incorrectly named--it can be used to trigger any
post upload action, such as GC/compaction. This change introduces
PostUploadHook/PostUploadHookChain to replace
UploadPackLogger/UploadPackLoggerChain and deprecates the latter.

It also introduces PackStatistics as a replacement for
PackWriter.Statistics, since the latter is not public API.
It changes PackWriter to use PackStatistics and reimplements
PackWriter.Statistics to delegate to PackStatistics.

Change-Id: Ic51df1613e471f568ffee25ae67e118425b38986
Signed-off-by: Terry Parker <tparker@google.com>
2015-06-12 13:56:16 -07:00
Jonathan Nieder 852963db3b Treat CloneCommand.setBranch(null) as setBranch("HEAD")
This method is documented to take a branch name (not a possibly null
string).  The only way a caller could have set null without either
re-setting to a sane value afterward or producing NullPointerException
was to also call setNoCheckout(true), in which case there would have
been no reason to set the branch in the first place.

Make setBranch(null) request the default behavior (remote's default
branch) instead, imitating C git's clone --no-branch.

Change-Id: I960e7046b8d5b5bc75c7f3688f3a075d3a951b00
Signed-off-by: Jonathan Nieder <jrn@google.com>
2015-06-11 12:03:17 -07:00
Jonathan Nieder d2ade728a1 Treat CloneCommand.setRemote(null) as setRemote("origin")
A non-bare clone command with null remote produces a
NullPointerException when trying to produce a refspec to fetch against.

In a bare repository, a null remote name is accepted by mistake,
producing a configuration with items like 'remote.url' instead of
'remote.<remote>.url'.  This was never meant to work.

Instead, let's make setRemote(null) undo any previous setRemote calls
and re-set the remote name to DEFAULT_REMOTE, imitating C git clone's
--no-origin option.

While we're here, add some tests for setRemote working normally.

Change-Id: I76f502da5e677df501d3ef387e7f61f42a7ca238
Signed-off-by: Jonathan Nieder <jrn@google.com>
2015-06-11 11:54:44 -07:00
Jonathan Nieder 24ab79ccaf Document CloneCommand.setURI(null)
call() throws InvalidRemoteException if uri == null, so there should
never be reason to leave the URI set to null.  Document this.

Change-Id: I7f2cdbe8042d99cf8a3c1a8c4c2dcb58c5b8c305
Signed-off-by: Jonathan Nieder <jrn@google.com>
2015-06-11 11:45:00 -07:00
Jonathan Nieder bbfd9b0e5f Handle null in ProgressMonitor setters
These commands' monitor fields can never be null unless someone passes
null to setProgressMonitor.  Anyone passing null probably meant to
disable the ProgressMonitor, so do that (by falling back to
NullProgressMonitor.INSTANCE) instead of saving a null and eventually
producing NullPointerException.

Change-Id: I63ad93ea8ad669fd333a5fd40880e7583ba24827
Signed-off-by: Jonathan Nieder <jrn@google.com>
2015-06-11 10:44:20 -07:00
Jonathan Nieder e70cf61eb6 Document CloneCommand.setDirectory(null) and setGitDir(null) more clearly
Change-Id: I74757ca68eaa941833846a7c8d983b4e996fa207
Signed-off-by: Jonathan Nieder <jrn@google.com>
2015-06-11 10:44:19 -07:00
Jonathan Nieder 85ca42f14b Require all projects to have a name
A project's name attribute is required according to repo's
doc/manifest-format.txt:

    <!ELEMENT project (annotation*,
                       project*)>
    <!ATTLIST project name        CDATA #REQUIRED>

Enforcing this in code makes reading easier (in particular making it
clearer that getName() and getPath() can never return null).

Change-Id: I8c7014dd6042183d7fecb2202af5acdc384aa8e4
Signed-off-by: Jonathan Nieder <jrn@google.com>
2015-06-11 10:44:18 -07:00
Dave Borowitz be0134f2fd Merge topic 'push-cert-2'
* changes:
  Rewrite push certificate parsing
  Allow trailing newlines in receive-pack
2015-06-11 13:07:44 -04:00
Dave Borowitz a85e817dc2 Rewrite push certificate parsing
- Consistently return structured data, such as actual ReceiveCommands,
  which is more useful for callers that are doing things other than
  verifying the signature, e.g. recording the set of commands.
- Store the certificate version field, as this is required to be part
  of the signed payload.
- Add a toText() method to recreate the actual payload for signature
  verification. This requires keeping track of the un-chomped command
  strings from the original protocol stream.
- Separate the parser from the certificate itself, so the actual
  PushCertificate object can be immutable. Make a fair attempt at deep
  immutability, but this is not possible with the current mutable
  ReceiveCommand structure.
- Use more detailed error messages that don't involve NON-NLS strings.
- Document null return values more thoroughly. Instead of having the
  undocumented behavior of throwing NPE from certain methods if they
  are not first guarded by enabled(), eliminate enabled() and return
  null from those methods.
- Add tests for parsing a push cert from a section of pkt-line stream
  using a real live stream captured with Wireshark (which, it should
  be noted, uncovered several simply incorrect statements in C git's
  Documentation/technical/pack-protocol.txt).

This is a slightly breaking API change to classes that were
technically public and technically released in 4.0. However, it is
highly unlikely that people were actually depending on public
behavior, since there were no public methods to create
PushCertificates with anything other than null field values, or a
PushCertificateParser that did anything other than infinite loop or
throw exceptions when reading.

Change-Id: I5382193347a8eb1811032d9b32af9651871372d0
2015-06-11 11:52:42 -04:00
Christian Halstrick 53fb3e3dd3 Merge "submodule test: Use config.unset instead of setting to null" 2015-06-11 07:44:35 -04:00
Christian Halstrick f9380fb479 Merge "Add new submodule layout to SubmoduleAddCommand" 2015-06-11 05:13:22 -04:00
Dave Borowitz d43703624c Allow trailing newlines in receive-pack
C git's receive-pack.c strips trailing newlines in command lists when
present[1], although send-pack.c does not send them, at least in the
case of command lists[2]. Change JGit to match this behavior.
Add tests.

This also fixes parsing of commands in the push cert, which, unlike
commands sent in the non-push case, always have trailing newlines.

[1] 7974889a05/builtin/receive-pack.c (L1380)
where packet_read_line chomps newlines:
7974889a05/pkt-line.c (L202)

[2] 7974889a05/send-pack.c (L470)

Change-Id: I4bca6342a7482a53c9a5815a94b3c181a479d04b
2015-06-10 15:37:55 -07:00
Christian Halstrick 4531259613 Add new submodule layout to SubmoduleAddCommand
The new submodule layout where GITDIR of a submodule is located at
<parent-repo-GITDIR>/modules/<submodule-path> was only used during
clone. Teach SubmoduleAddCommand to use the new layout.

Bug: 469666
Change-Id: Ie97dc0607b71499560444616f362bccee9cce515
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
2015-06-11 00:11:27 +02:00
Jonathan Nieder 3b7ca2b8a8 Tweak exception Javadoc to be eclipse-clean
Bug: 469887
Change-Id: Ic189efc50d9c1f573dda0c79e5b0dad0813a5577
Signed-off-by: Jonathan Nieder <jrn@google.com>
2015-06-10 15:08:41 -07:00
Jonathan Nieder a1fd4980df submodule test: Use config.unset instead of setting to null
Most relative-URL tests for SubmoduleInitCommand carry out the following
steps:

 1. add a submodule at path "sub" to the index
 2. set remote.origin.url in .git/config
 3. configure .gitmodules, possibly using relative URLs, and see what
    happens

resolveWorkingDirectoryRelativeUrl() is meant to test the fallback when
remote.origin.url is not set, to match C git which treats the URL as
relative to the cwd in that case.  To do so, in step (2) it sets
remote.origin.url to null.

However, Config.setString when taking a null value does not actually
unset that value from the configuration --- it sets it to the empty
string.  This means we are testing a behavior that C git never
supported.  Use Config.unset instead.

Change-Id: I7af29fbbd333a2598843d62c320093c48b2ad972
Signed-off-by: Jonathan Nieder <jrn@google.com>
2015-06-10 14:48:21 -07:00
Jonathan Nieder 2508f1695f Merge changes I38e1798e,Id1fe1c20,I945ba188,I2c6be9cb
* changes:
  Allow setting detail message and cause when constructing most exceptions
  Use message from ServiceNotAuthorizedException, ServiceNotEnabledException
  dumb HTTP: Clarify AsIsFilter by introducing req and res locals
  Clarify description of ServiceNotAuthorizedException
2015-06-10 16:40:11 -04:00
Shawn Pearce 719069680d Merge "UploadPack: Use reachable-sha1-in-want configuration" 2015-06-09 22:14:38 -04:00