Commit Graph
100 Commits
Author SHA1 Message Date
Andrew Ayer 37df6fb5ad Update INSTALL file to reflect C++11 requirement 2017-11-26 10:21:23 -08:00
Andrew Ayer f3dd69e4c7 Update THANKS file 2017-11-26 10:05:42 -08:00
Andrew Ayer ccdcc76f8e Switch from NULL to nullptr 2017-09-10 12:36:21 -07:00
Andrew Ayer f03fdc6ad0 Clean up readdir code, add a comment about why we're using readdir 2017-09-10 12:34:36 -07:00
Andrew Ayer 0e4ad51a13 Update a comment regarding unique_ptr 2017-09-10 12:34:36 -07:00
Andrew Ayer 2b1076108e Enable C++11 in Makefile 2017-09-10 12:24:52 -07:00
Andrew Ayer 101b738a8d Read gpg program from git config gpg.program ; ported from fork by alanrossmachinery
Modified-By: Andrew Ayer <agwa@andrewayer.name>

  * Make whitespace conform to project conventions

Closes #89
Closes #65
2017-09-10 12:14:55 -07:00
Andrew Ayer 934914c2c4 Fix typo in README
Closes #83
2017-09-10 12:09:31 -07:00
Andrew Ayer a6170413eb Sync README changes to README.md 2017-09-10 12:05:13 -07:00
Andrew Ayer b47176e6a8 Don't hard code path to git-crypt in .git/config on Linux
There's a tradeoff.  When the path is hardcoded, it's guaranteed that
git-crypt will be found no matter where you run git or what your $PATH is.
On the other hand, hardcoding means that things break if git-crypt changes
location, which could easily happen if you copy a repository to a different system
(see https://github.com/AGWA/git-crypt/issues/71 for example).

In hindsight, I think this was a bad tradeoff.  Now, if git-crypt is
invoked as a bare filename (no slashes), the bare filename is placed
in .git/config under the assumption that it can be found via $PATH
(this assumption will be true as long as git-crypt wasn't resolved via
a relative path in $PATH).  This logic was already being used on
non-Linux OSes and it seemed to work fine.
2015-12-26 14:30:42 -08:00
Andrew Ayer c63a727177 Mark .gpg files in .git-crypt as binary
To remove any possibility of Git treating them as text by accident.

Closes #55.
2015-07-29 21:51:11 -07:00
Andrew Ayer e0b3bd754f Remove gnuism from Makefile
According to POSIX, $< is only valid with inference rules, not normal
target rules.
2015-06-13 10:54:50 -07:00
Andrew Ayer bc7e55b68f Prepare 0.5.0 release 2015-05-30 19:53:04 -07:00
Andrew Ayer f56911726a Makefile: refine man page rules
Rename HAS_DOCBOOK option to ENABLE_MAN.

Allow xsltproc to fetch the Docbook stylesheet from the Internet if it's
not installed locally.  This will hopefully make it easier for folks
to build the man page.
2015-05-30 19:52:29 -07:00
Andrew Ayer 9bbd39c491 Add instructions for building man page to INSTALL 2015-05-30 19:09:17 -07:00
Andrew Ayer 5dc55c3b2a Makefile: refine man page rules 2015-05-30 19:09:01 -07:00
Andrew Ayer ba250b87ad Add copyright notice to Makefile 2015-05-30 19:09:01 -07:00
Andrew Ayer 83b58eafa7 Overhaul Makefile
Support building the man page, but only if HAS_DOCBOOK variable set to "yes"
2015-05-30 19:09:01 -07:00
Andrew Ayer b4569ae6c1 Add man page 2015-05-28 21:24:16 -07:00
Andrew Ayer 0a2e633d7f Recommend Git 1.8.5 or newer for best performance
Since older versions of Git have to spawn a separate
check-attr process for every file in the repository,
which is slow.
2015-05-25 15:26:32 -07:00
Andrew Ayer ca98d1aed1 Minor README tweaks 2015-05-25 15:25:44 -07:00
Andrew Ayer 4acb4205eb git_version: cache the Git version
(to avoid repeated invocations of `git version`)
2015-05-24 18:58:13 -07:00
Andrew Ayer 1988ee3819 Speed up lock/unlock by using single git check-attr process
Previously, lock/unlock needed to spawn a separate `git check-attr`
process for every single file in the repository (whether encrypted
or not).  This was extremely inefficient, especially on Windows.

Now, git-crypt spawns a single `git check-attr` process and communicates
with it over stdin.  In a repository with thousands of files, this
results in a speedup of nearly 100x.

This relies on the --stdin and -z options to `git check-attr`, which
were only added in Git 1.8.5 (released 27 Nov 2013).  With older versions
of Git, git-crypt falls back to the old and slower code.
2015-05-24 18:55:58 -07:00
Andrew Ayer 44f70e6b48 Add Coprocess class
It provides a convenient way to spawn a process and read from/write to
its stdin/stdout.
2015-05-24 18:54:11 -07:00
Andrew Ayer 3db6271492 Re-license parse_options under X11 license 2015-05-17 14:38:12 -07:00
Andrew Ayer c279a6a20a Add helpers to faciliate Git version comparison
This will be useful as we start to gate code on the version of Git that's installed.
2015-05-16 21:10:44 -07:00
Andrew Ayer 439bcd852d Write a helper function to get the version of Git
This will be useful as we start to gate code on the version of Git that's installed.

A lot of code out in the wild seems to assume that the output of `git version`
is "git version $VERSION", so I'm assuming it's safe for git-crypt to rely
on that too.
2015-05-14 22:23:21 -07:00
Andrew Ayer 7880b30e8c Update INSTALL file
Streamline the instructions a bit.  Mention the Debian/Ubuntu and
RHEL/CentOS packages for each dependency.
2015-04-24 20:53:19 -07:00
Andrew Ayer 3104508adf Add --trusted option to gpg-add-user
If this option is specified, then the GPG users are added even
if their keys are not trusted by GPG.

In addition, if a full fingerprint, prefixed by 0x, is specified,
it is assumed to be trusted, regardless of its trust level in the
GPG trustdb.
2015-03-31 20:24:13 -07:00
Andrew Ayer ad71c7ffae FIx GPG key lookup with with-fingerprint enabled in gpg.conf
When the with-fingerprint option is enabled, the gpg command invoked by
git-crypt to look up a GPG user ID returns a fingerprint for both primary
keys and sub-keys.  Previously, this misled git-crypt into thinking that
the user ID matched more than one public key.  Now, git-crypt ignores
fingerprints for sub-keys.
2015-03-31 19:41:19 -07:00
Andrew Ayer 3ce5c83b2d Wrap long lines in README 2015-03-17 15:08:58 -07:00
Andrew Ayer 6d6e96f82b Clarify security section in README 2015-03-17 15:08:35 -07:00
Andrew Ayer c3ab393f17 Add notes to the README about symlinks, sub-modules 2015-03-15 13:55:18 -07:00
Andrew Ayer 6abf9c6956 Ignore non-files when running git ls-files
Non-files (symlinks and gitlinks (used by sub-modules)) cannot be
encrypted, so we shouldn't try messing with them.  This fixes `git-crypt
status` when used on a repository with sub-modules or symlinks when the
path to the sub-module or symlink has the git-crypt attribute (which
can happen inadvertently when using wildcards in .gitattributes).
2015-03-15 13:34:31 -07:00
Andrew Ayer ede1461563 Makefile: create destination directories in make install 2015-03-10 08:29:31 -07:00
Andrew Ayer 1b3f13643c Use opendir/readdir instead of scandir
scandir is a relatively recent addition to POSIX and is not available on
older versions of Mac OS X.  opendir/readdir should be more portable.
2015-02-26 22:51:40 -08:00
Andrew Ayer 8c130d3a00 Fix syntax error in commands.cpp 2015-02-09 11:42:22 -08:00
Andrew Ayer 012d78e1fe Add "do not edit" comment to .git-crypt/.gitattributes file 2015-02-09 11:37:50 -08:00
Andrew Ayer 99d4408f9e README: Add note about GitHub for Mac breakage 2015-02-09 11:37:19 -08:00
Andrew Ayer c2de1e2194 Add --force option to 'git-crypt lock'
It will force a lock even if working directory is unclean.  Useful
for deconfiguring git-crypt if you've accidentally unlocked with the
wrong key or gotten into a similarly sticky situation.
2015-02-07 13:27:58 -08:00
Andrew Ayer 85635ae0b1 touch_file, remove_file: ignore non-existent files 2015-02-07 13:22:30 -08:00
Andrew Ayer 18d3cfeca9 Remove some dead code 2015-02-07 12:57:52 -08:00
Andrew Ayer 0c8dae2375 Only run git_deconfig if Git configuration exists
This will let us run 'git lock' even if no filters are configured.

This logic is more complicated than I would like because running
'git config --remove-section' on a non-existent section results in
a noisy error (with text printed to stderr and an exit code of 128)
instead of a quiet error like the other 'git config' commands.
2015-02-07 12:54:07 -08:00
Andrew Ayer fc583c7d4f Add helper to get exit status of command 2015-02-07 12:43:17 -08:00
Andrew Ayer c850d65242 Change "unconfigure" to "deconfigure" 2015-02-07 12:15:53 -08:00
Andrew Ayer f5d36f0008 Fix wording of 'git-crypt lock' error message.
Thanks to Elliot Saba.
2015-02-07 08:52:07 -08:00
Andrew Ayer 1ca8f89602 Prepare for 0.4.2 release 2015-01-31 19:20:05 -08:00
Andrew Ayer 5fd36a7ac5 Increase minimum supported Git version to 1.7.2
Previously, git-crypt claimed to support Git as old as 1.6.0 (albeit
with degraded operation).  However, this has not been true for some time,
since Git 1.6.0 does not support the --porcelain option to `git status`.

Since Git 1.7.2 was the first version of Git to support filters with
`git blame`, was released almost five years ago (in July 2010), and is
even in Debian Squeeze, it seems like a good minimum version to require.
2015-01-27 21:26:51 -08:00
Andrew Ayer d5670c9552 Force Git to check out files by touching their mtimes
Starting with Git 2.2.2, `git checkout -f HEAD` no longer checks out
files if their mtimes haven't changed.  This causes files to remain
encrypted in the work tree after running `git-crypt unlock`, and to
remain decrypted after running `git-crypt lock`'.

To fix this, git-crypt now figures out what files are encrypted (by
checking `git check-attr` on every file output by `git ls-files`),
touches those files, and then runs `git checkout` on them.
2015-01-27 21:15:07 -08:00
Andrew Ayer 2d2053296f Fix placement of quotes in an error message 2015-01-27 21:06:29 -08:00
Andrew Ayer 216aa27009 Add helper function to get attribute name for a given key 2015-01-27 21:04:58 -08:00
Andrew Ayer 02c52ab21a Disable message about unimplemented ls-gpg-users command 2015-01-27 21:04:22 -08:00
Andrew Ayer 849401d733 Update for git-crypt 0.4.1 2015-01-07 20:23:28 -08:00
Andrew Ayer 12881f65fd Add 'git-crypt version' command 2015-01-07 20:23:07 -08:00
Andrew Ayer b7c608da25 Add .gitattributes file to .git-crypt dir to prevent encryption
Previously, if you had a .gitattributes file in the root of your
repository that matched `*`, the files under .git-crypt would also be
encrypted, rendering the repository un-decryptable, unless you explicitly
excluded the .git-crypt directory, which was easy to overlook.

Now, `git-crypt add-gpg-user` automatically adds a .gitattributes file
to the .git-crypt directory to prevent its encryption.

IMPORTANT: If you are currently using GPG mode to encrypt an entire
repository, it is strongly advised that you upgrade git-crypt and then
do the following to ensure that the files inside .git-crypt are stored
properly:

 1. Remove existing key files: `rm .git-crypt/keys/*/0/*`
 2. Re-add GPG user(s): `git-crypt add-gpg-user GPG_USER_ID ...`
2015-01-02 10:35:57 -08:00
Andrew Ayer 9cb1ad3c33 Add some helpers for getting paths to state directories 2015-01-02 10:30:47 -08:00
Andrew Ayer 1b1715b5ec README: use https URLs for mailing lists 2014-11-26 09:42:10 -08:00
Andrew Ayer 2b0cc1b5ac Update README, NEWS, write release notes for 0.4 2014-11-16 17:29:17 -08:00
Andrew Ayer 3d53bce1a8 Add .gitattributes file to ignore .git files when creating archive 2014-11-16 17:29:09 -08:00
Andrew Ayer be237fe27d Fix formatting in NEWS.md 2014-11-16 17:25:02 -08:00
Andrew Ayer 6520746bce Update 'git-crypt help' message
Documented new arguments to 'git-crypt migrate-key' and adjusted spacing.
2014-11-15 20:31:01 -08:00
Andrew Ayer 3bf7d8e512 migrate-key: take separate arguments for old key and new key
I don't want to encourage people to overwrite their old keys
until they've successfully unlocked their repository with the
migrated key.
2014-11-15 20:30:35 -08:00
Andrew Ayer bd262f6126 Add documentation for multiple keys 2014-11-15 18:06:36 -08:00
Andrew Ayer cf990dc9df Minor formatting updates to README 2014-11-15 18:06:23 -08:00
Andrew Ayer e70d067b48 Rearrange a couple paragraphs in the README 2014-09-21 12:00:31 -07:00
Andrew Ayer 4796a1e288 Clarify some wording in README 2014-09-21 12:00:31 -07:00
Andrew Ayer e4d1091e97 Rename add-gpg-key command, etc. to add-gpg-user, etc.
While writing the documention, I found that "GPG user" was less confusing
terminology than "GPG key," since you aren't really adding a "key"
to git-crypt, and git-crypt already uses "key" to refer to other concepts
(cf. the -k/--key-name options).
2014-09-21 12:00:31 -07:00
Andrew Ayer 04906c5355 Write a usage message for every command
You can run 'git-crypt help COMMAND' to see it.
2014-09-21 12:00:31 -07:00
Andrew Ayer 24fff1ce6f Document experimental Windows support 2014-09-21 12:00:31 -07:00
Andrew Ayer acc3d2ecb3 Fix capitalization of git-crypt in INSTALL.md 2014-09-21 12:00:31 -07:00
Andrew Ayer 9e340b510d Document GPG mode in README 2014-09-21 12:00:31 -07:00
Andrew Ayer 0538d111fc Usage message: refer to gpg key argument as "user ID" not "key ID"
This is the terminology that the gpg man page uses.
2014-09-21 12:00:31 -07:00
Andrew Ayer 746bb5def3 Remove unlink_internal_key function
I think it's simpler this way.
2014-09-21 12:00:31 -07:00
Andrew Ayer 16c4a827c0 Error message if you try to lock repository that's not locked 2014-09-21 12:00:31 -07:00
Andrew Ayer 3799a23aa7 Add missing argument when throwing System_error 2014-09-21 12:00:31 -07:00
Andrew Ayer e9e90fc873 For consistency, always use NULL internally to represent the default key 2014-09-21 12:00:31 -07:00
Andrew Ayer 88e8e3a265 Display error if both -k and -a options passed to git-crypt lock 2014-09-21 12:00:31 -07:00
Andrew Ayer 690dba2f14 Add multi-platform remove_file helper
And use it for deleting internal keys
2014-09-21 12:00:31 -07:00
Andrew Ayer 70879eaf57 Tweak git-crypt usage message
* Change the wording for 'git-crypt lock'.
 * Move 'git-crypt lock' to 'Common commands' section since it's
   common to both GPG and symmetric mode.
 * Reduce whitespace in the output so it fits in 80 characters.
2014-09-21 12:00:31 -07:00
Andrew Ayer 42aa7db245 Credit Michael Schout in THANKS file 2014-09-21 12:00:31 -07:00
Andrew Ayer 316e194f84 README: document problems with Atlassian SourceTree 2014-09-21 12:00:31 -07:00
Andrew Ayer 8460d00bbf README: add notes about gitattributes 2014-09-21 12:00:31 -07:00
Andrew Ayer 4495af1274 README: update security and limitations sections 2014-09-21 12:00:31 -07:00
Andrew Ayer 9c190a5a89 Add CONTRIBUTING and THANKS files 2014-09-09 09:00:35 -07:00
Andrew Ayer 9f59cc23b9 Merge branch 'revamp' into 'master'
Conflicts:
	Makefile
2014-09-06 19:32:55 -07:00
Andrew Ayer 725f442ce4 Remove a TODO comment
I've decided not to do it
2014-09-06 17:25:31 -07:00
Andrew Ayer adaea41d4e add-gpg-key: add -n/--no-commit option to inhibit committing 2014-09-06 17:25:05 -07:00
Andrew Ayer e37566f180 status: properly detect files encrypted with alternative key names 2014-09-06 15:43:00 -07:00
Andrew Ayer 10622f6dcc Raise an error if legacy key file has trailing data 2014-09-06 14:59:16 -07:00
Andrew Ayer f50feec2dd Display helpful information when smudge detects an unencrypted file 2014-09-06 14:59:12 -07:00
Andrew Ayer 8b159b543f Avoid possible undefined behavior with empty std::vector
In particular, &bytes[0] is undefined if bytes is empty.
2014-08-18 14:12:34 -07:00
Andrew Ayer b07f49b9b3 smudge: if file is not encrypted, just copy through clear text
Since Git consults the checked-out .gitattributes instead of the
.gitattributes in effect at the time the file was committed, Git
may invoke the smudge filter on old versions of a file that were
committed without encryption.
2014-08-06 19:04:17 -07:00
Andrew Ayer 07231c1630 Set 'required' option on Git filter to true
This signals to Git that the filter must complete successfully for the
content to be usable.
2014-08-02 21:34:17 -07:00
Andrew Ayer da25322dbc Remove stubs for profile support
Multiple key support provides the functionality I was planning to provide
with profiles.
2014-08-02 21:23:52 -07:00
Andrew Ayer 47e810d592 Write and use create_protected_file() helper
Instead of using umask to ensure sensitive files are created with
restrictive permissions, git-crypt now does:

	create_protected_file(filename);
	std::ofstream out(filename);
	// ...

create_protected_file can have different Unix and Windows implementations.
create_protected_file should be easier to implement on Windows than a
umask equivalent, and this pattern keeps the amount of platform-specific
code to a minimum and avoids #ifdefs.
2014-08-02 21:18:28 -07:00
Andrew Ayer 01f152b746 Check HMAC in smudge and diff commands
Git-crypt's position has always been that authentication is best left
to Git, since 1) Git provides immutable history based on SHA-1 hashes
as well as GPG-signed commits and tags, and 2) git-crypt can't be used
safely anyways unless the overall integrity of your repository is assured.

But, since git-crypt already has easy access to a (truncated) HMAC of the
file when decrypting, there's really no reason why git-crypt shouldn't
just verify it and provide an additional layer of protection.
2014-08-02 21:17:17 -07:00
Andrew Ayer 9e791d97ee Factor out some common code into a helper function 2014-07-23 19:55:50 -07:00
Andrew Ayer 477983f4bc Ensure memsets of sensitive memory aren't optimized away 2014-07-23 19:32:30 -07:00
Andrew Ayer 23ff272f7d Simplify CTR code 2014-07-23 19:23:39 -07:00
Andrew Ayer 8de40f40b3 Wipe AES key from memory after using it 2014-07-23 19:23:39 -07:00