@ -46,10 +46,12 @@ import static java.nio.file.Files.exists;
import static java.nio.file.Files.newInputStream ;
import static java.nio.file.Files.newInputStream ;
import java.io.BufferedInputStream ;
import java.io.BufferedInputStream ;
import java.io.File ;
import java.io.IOException ;
import java.io.IOException ;
import java.io.InputStream ;
import java.io.InputStream ;
import java.net.URISyntaxException ;
import java.net.URISyntaxException ;
import java.nio.file.Files ;
import java.nio.file.Files ;
import java.nio.file.InvalidPathException ;
import java.nio.file.Path ;
import java.nio.file.Path ;
import java.nio.file.Paths ;
import java.nio.file.Paths ;
import java.text.MessageFormat ;
import java.text.MessageFormat ;
@ -81,6 +83,8 @@ import org.eclipse.jgit.annotations.NonNull;
import org.eclipse.jgit.api.errors.CanceledException ;
import org.eclipse.jgit.api.errors.CanceledException ;
import org.eclipse.jgit.errors.UnsupportedCredentialItem ;
import org.eclipse.jgit.errors.UnsupportedCredentialItem ;
import org.eclipse.jgit.internal.JGitText ;
import org.eclipse.jgit.internal.JGitText ;
import org.eclipse.jgit.util.FS ;
import org.eclipse.jgit.util.SystemReader ;
/ * *
/ * *
* Locates GPG keys from either < code > ~ / . gnupg / private - keys - v1 . d < / code > or
* Locates GPG keys from either < code > ~ / . gnupg / private - keys - v1 . d < / code > or
@ -88,19 +92,48 @@ import org.eclipse.jgit.internal.JGitText;
* /
* /
class BouncyCastleGpgKeyLocator {
class BouncyCastleGpgKeyLocator {
private static final Path USER_KEYBOX_PATH = Paths
private static final Path GPG_DIRECTORY = findGpgDirectory ( ) ;
. get ( System . getProperty ( "user.home" ) , ".gnupg" , "pubring.kbx" ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
private static final Path USER_SECRET_KEY_DIR = Paths . get (
private static final Path USER_KEYBOX_PATH = GPG_DIRECTORY
System . getProperty ( "user.home" ) , ".gnupg" , "private-keys-v1.d ") ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3 $
. resolve ( "pubring.kbx ") ; //$NON-NLS-1$
private static final Path USER_PGP_LEGACY_SECRING_FILE = Paths
private static final Path USER_SECRET_KEY_DIR = GPG_DIRECTORY
. get ( System . getProperty ( "user.home" ) , ".gnupg" , "secring.gpg" ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
. resolve ( "private-keys-v1.d" ) ; //$NON-NLS-1$
private static final Path USER_PGP_LEGACY_SECRING_FILE = GPG_DIRECTORY
. resolve ( "secring.gpg" ) ; //$NON-NLS-1$
private final String signingKey ;
private final String signingKey ;
private BouncyCastleGpgKeyPassphrasePrompt passphrasePrompt ;
private BouncyCastleGpgKeyPassphrasePrompt passphrasePrompt ;
private static Path findGpgDirectory ( ) {
SystemReader system = SystemReader . getInstance ( ) ;
if ( system . isWindows ( ) ) {
// On Windows prefer %APPDATA%\gnupg if it exists, even if Cygwin is
// used.
String appData = system . getenv ( "APPDATA" ) ; //$NON-NLS-1$
if ( appData ! = null & & ! appData . isEmpty ( ) ) {
try {
Path directory = Paths . get ( appData ) . resolve ( "gnupg" ) ; //$NON-NLS-1$
if ( Files . isDirectory ( directory ) ) {
return directory ;
}
} catch ( SecurityException | InvalidPathException e ) {
// Ignore and return the default location below.
}
}
}
// All systems, including Cygwin and even Windows if
// %APPDATA%\gnupg doesn't exist: ~/.gnupg
File home = FS . DETECTED . userHome ( ) ;
if ( home = = null ) {
// Oops. What now?
home = new File ( "." ) . getAbsoluteFile ( ) ; //$NON-NLS-1$
}
return home . toPath ( ) . resolve ( ".gnupg" ) ; //$NON-NLS-1$
}
/ * *
/ * *
* Create a new key locator for the specified signing key .
* Create a new key locator for the specified signing key .
* < p >
* < p >