@ -49,6 +49,7 @@ import static org.eclipse.jgit.util.HttpSupport.HDR_CONTENT_TYPE;
import java.io.IOException ;
import java.io.IOException ;
import java.net.ProxySelector ;
import java.net.ProxySelector ;
import java.net.URISyntaxException ;
import java.net.URL ;
import java.net.URL ;
import java.text.SimpleDateFormat ;
import java.text.SimpleDateFormat ;
import java.util.LinkedList ;
import java.util.LinkedList ;
@ -56,6 +57,7 @@ import java.util.Map;
import java.util.TreeMap ;
import java.util.TreeMap ;
import org.eclipse.jgit.annotations.NonNull ;
import org.eclipse.jgit.annotations.NonNull ;
import org.eclipse.jgit.errors.CommandFailedException ;
import org.eclipse.jgit.lfs.LfsPointer ;
import org.eclipse.jgit.lfs.LfsPointer ;
import org.eclipse.jgit.lfs.Protocol ;
import org.eclipse.jgit.lfs.Protocol ;
import org.eclipse.jgit.lfs.errors.LfsConfigInvalidException ;
import org.eclipse.jgit.lfs.errors.LfsConfigInvalidException ;
@ -68,17 +70,12 @@ import org.eclipse.jgit.transport.URIish;
import org.eclipse.jgit.transport.http.HttpConnection ;
import org.eclipse.jgit.transport.http.HttpConnection ;
import org.eclipse.jgit.util.HttpSupport ;
import org.eclipse.jgit.util.HttpSupport ;
import org.eclipse.jgit.util.SshSupport ;
import org.eclipse.jgit.util.SshSupport ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
/ * *
/ * *
* Provides means to get a valid LFS connection for a given repository .
* Provides means to get a valid LFS connection for a given repository .
* /
* /
public class LfsConnectionFactory {
public class LfsConnectionFactory {
private static final Logger log = LoggerFactory
. getLogger ( LfsConnectionFactory . class ) ;
private static final int SSH_AUTH_TIMEOUT_SECONDS = 30 ;
private static final int SSH_AUTH_TIMEOUT_SECONDS = 30 ;
private static final String SCHEME_HTTPS = "https" ; //$NON-NLS-1$
private static final String SCHEME_HTTPS = "https" ; //$NON-NLS-1$
private static final String SCHEME_SSH = "ssh" ; //$NON-NLS-1$
private static final String SCHEME_SSH = "ssh" ; //$NON-NLS-1$
@ -133,6 +130,7 @@ public class LfsConnectionFactory {
String lfsUrl = config . getString ( ConfigConstants . CONFIG_SECTION_LFS ,
String lfsUrl = config . getString ( ConfigConstants . CONFIG_SECTION_LFS ,
null ,
null ,
ConfigConstants . CONFIG_KEY_URL ) ;
ConfigConstants . CONFIG_KEY_URL ) ;
Exception ex = null ;
if ( lfsUrl = = null ) {
if ( lfsUrl = = null ) {
String remoteUrl = null ;
String remoteUrl = null ;
for ( String remote : db . getRemoteNames ( ) ) {
for ( String remote : db . getRemoteNames ( ) ) {
@ -151,39 +149,44 @@ public class LfsConnectionFactory {
break ;
break ;
}
}
if ( lfsUrl = = null & & remoteUrl ! = null ) {
if ( lfsUrl = = null & & remoteUrl ! = null ) {
lfsUrl = discoverLfsUrl ( db , purpose , additionalHeaders ,
try {
remoteUrl ) ;
lfsUrl = discoverLfsUrl ( db , purpose , additionalHeaders ,
remoteUrl ) ;
} catch ( URISyntaxException | IOException
| CommandFailedException e ) {
ex = e ;
}
} else {
} else {
lfsUrl = lfsUrl + Protocol . INFO_LFS_ENDPOINT ;
lfsUrl = lfsUrl + Protocol . INFO_LFS_ENDPOINT ;
}
}
}
}
if ( lfsUrl = = null ) {
if ( lfsUrl = = null ) {
if ( ex ! = null ) {
throw new LfsConfigInvalidException (
LfsText . get ( ) . lfsNoDownloadUrl , ex ) ;
}
throw new LfsConfigInvalidException ( LfsText . get ( ) . lfsNoDownloadUrl ) ;
throw new LfsConfigInvalidException ( LfsText . get ( ) . lfsNoDownloadUrl ) ;
}
}
return lfsUrl ;
return lfsUrl ;
}
}
private static String discoverLfsUrl ( Repository db , String purpose ,
private static String discoverLfsUrl ( Repository db , String purpose ,
Map < String , String > additionalHeaders , String remoteUrl ) {
Map < String , String > additionalHeaders , String remoteUrl )
try {
throws URISyntaxException , IOException , CommandFailedException {
URIish u = new URIish ( remoteUrl ) ;
URIish u = new URIish ( remoteUrl ) ;
if ( u . getScheme ( ) = = null | | SCHEME_SSH . equals ( u . getScheme ( ) ) ) {
if ( u . getScheme ( ) = = null | | SCHEME_SSH . equals ( u . getScheme ( ) ) ) {
Protocol . ExpiringAction action = getSshAuthentication (
Protocol . ExpiringAction action = getSshAuthentication ( db , purpose ,
db , purpose , remoteUrl , u ) ;
remoteUrl , u ) ;
additionalHeaders . putAll ( action . header ) ;
additionalHeaders . putAll ( action . header ) ;
return action . href ;
return action . href ;
} else {
} else {
return remoteUrl + Protocol . INFO_LFS_ENDPOINT ;
return remoteUrl + Protocol . INFO_LFS_ENDPOINT ;
}
} catch ( Exception e ) {
log . error ( LfsText . get ( ) . cannotDiscoverLfs , e ) ;
return null ; // could not discover
}
}
}
}
private static Protocol . ExpiringAction getSshAuthentication (
private static Protocol . ExpiringAction getSshAuthentication (
Repository db , String purpose , String remoteUrl , URIish u )
Repository db , String purpose , String remoteUrl , URIish u )
throws IOException {
throws IOException , CommandFailedException {
AuthCache cached = sshAuthCache . get ( remoteUrl ) ;
AuthCache cached = sshAuthCache . get ( remoteUrl ) ;
Protocol . ExpiringAction action = null ;
Protocol . ExpiringAction action = null ;
if ( cached ! = null & & cached . validUntil > System . currentTimeMillis ( ) ) {
if ( cached ! = null & & cached . validUntil > System . currentTimeMillis ( ) ) {