You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by ji...@codehaus.org on 2004/07/23 08:23:11 UTC

[jira] Updated: (MAVEN-456) unable to access remote repository via https

The following issue has been updated:

    Updater: Brett Porter (mailto:brett@codehaus.org)
       Date: Fri, 23 Jul 2004 2:21 AM
    Comment:
might already work - test
    Changes:
             Fix Version changed to 1.1
    ---------------------------------------------------------------------
For a full history of the issue, see:

  http://jira.codehaus.org/browse/MAVEN-456?page=history

---------------------------------------------------------------------
View the issue:
  http://jira.codehaus.org/browse/MAVEN-456

Here is an overview of the issue:
---------------------------------------------------------------------
        Key: MAVEN-456
    Summary: unable to access remote repository via https
       Type: Improvement

     Status: Unassigned
   Priority: Major

 Original Estimate: Unknown
 Time Spent: Unknown
  Remaining: Unknown

    Project: maven
 Components: 
             core
   Fix Fors:
             1.1
   Versions:
             1.0-beta-10

   Assignee: 
   Reporter: Christoph Gruenwald

    Created: Mon, 2 Jun 2003 5:43 AM
    Updated: Fri, 23 Jul 2004 2:21 AM

Description:
the remote repository is only accessable through http; it is not possible to access it via https.

i needed to modify two methods in the class httputils to get this running (see below).

----------------------------------------

public static void getFile( String url,
                            File destinationFile,
                            boolean ignoreErrors,
                            boolean useTimestamp,
                            String proxyHost,
                            String proxyPort,
                            String proxyUserName,
                            String proxyPassword )
    throws Exception
{
    String[] s = parseUrl( url );
    
    // *** MODIFIED - BEGIN ***
    
    // need to create url with separated parameters
    String protocol = s[0];
    String username = s[1];
    String password = s[2];
    String hostname = s[3];
    String hostport = s[4];
    String parsedUrl = s[5];
    
    /*
    String username = s[0];
    String password = s[1];
    String parsedUrl = s[2];
    
    URL source = new URL( parsedUrl );
    */
    
    URL source = new URL(protocol, hostname, Integer.parseInt(hostport), parsedUrl);
    
    // *** MODIFIED - END *** 

    //set the timestamp to the file date.
    long timestamp = 0;
    boolean hasTimestamp = false;
    if ( useTimestamp && destinationFile.exists() )
    {
        timestamp = destinationFile.lastModified();
        hasTimestamp = true;
    }

    //set proxy connection
    useProxyUser( proxyHost, proxyPort, proxyUserName, proxyPassword );

    //set up the URL connection
    URLConnection connection = source.openConnection();
    
    // *** MODIFIED - BEGIN ***
    
    // need to set <code>javax.net.ssl.HostnameVerifier</code> for <code>javax.net.ssl.HttpsURLConnection</code>, otherwise connection will be refused
    if (connection instanceof javax.net.ssl.HttpsURLConnection) {
        ( (javax.net.ssl.HttpsURLConnection) connection).setHostnameVerifier(
            new javax.net.ssl.HostnameVerifier() {
                public boolean verify(String hostname, javax.net.ssl.SSLSession session) {
                    return true;
                }
            }
        );
    }
    
    // *** MODIFIED - END ***
    
    //modify the headers
    //NB: things like user authentication could go in here too.
    if ( useTimestamp && hasTimestamp )
    {
        connection.setIfModifiedSince( timestamp );
    }
    // prepare Java 1.1 style credentials
    if ( username != null || password != null )
    {
        String up = username + ":" + password;
        String encoding = null;
        // check to see if sun's Base64 encoder is available.
        try
        {
            sun.misc.BASE64Encoder encoder =
                (sun.misc.BASE64Encoder) Class.forName(
                    "sun.misc.BASE64Encoder" ).newInstance();

            encoding = encoder.encode( up.getBytes() );
        }
        catch ( Exception ex )
        {
            // Do nothing, as for MavenSession we will never use
            // auth and we will eventually move over httpclient
            // in the commons.
        }
        connection.setRequestProperty( "Authorization", "Basic " + encoding );
    }
...
}

----------------------------------------

static String[] parseUrl( String url )
{
    // *** MODIFIED - BEGIN ***
    
    // parsed url into more paramters - it must be created with separated parameters
    // this also fixes a bug caused in <code>org.apache.maven.verifier.DependencyVerifier#getRemoteArtifact(Artifact)</code> when a https-url is used
    
    /*
    String[] parsedUrl = new String[3];
    parsedUrl[0] = null;
    parsedUrl[1] = null;
    parsedUrl[2] = url;

    // We want to be able to deal with Basic Auth where the username
    // and password are part of the URL. An example of the URL string
    // we would like to be able to parse is like the following:
    //
    // http://username:password@repository.mycompany.com

    int i = url.indexOf( "@" );
    if ( i > 0 )
    {
        String s = url.substring( 7, i );
        int j = s.indexOf( ":" );
        parsedUrl[0] = s.substring( 0, j );
        parsedUrl[1] = s.substring( j + 1 );
        parsedUrl[2] = "http://" + url.substring( i + 1 );
    }
    */

    int pos0 = url.indexOf("://"); int step0 = 3;
    if (pos0 == -1) {
        pos0 = url.indexOf(":/"); step0 = 2;
    }
    
    int pos1 = url.indexOf('@');
    int pos2 = url.indexOf(':', pos0 + step0);
    if (pos2 > pos1)
        pos2 = -1;
    
    int pos3 = url.indexOf(':', (pos1 == -1 ? pos0 + step0 : pos1));
    int pos4 = url.indexOf('/', pos0 + step0);
    
    String[] parsedUrl = new String[6];
    
    parsedUrl[0] = url.substring(0, pos0);
    parsedUrl[1] = pos2 == -1 ? null : url.substring(pos0 + step0, pos2);
    parsedUrl[2] = pos2 == -1 ? null : url.substring(pos2 + 1, pos1);
    parsedUrl[3] = url.substring((pos1 == -1 ? pos0 + step0 : pos1 + 1), (pos3 == -1 ? (pos4 == -1 ? url.length() : pos4) : pos3));
    parsedUrl[4] = pos3 == -1 ? "-1" : url.substring(pos3 + 1, (pos4 == -1 ? url.length() : pos4));
    parsedUrl[5] = pos4 == -1 ? null : url.substring(pos4);

    // *** MODIFIED - END ***

    return parsedUrl;
}

----------------------------------------


---------------------------------------------------------------------
JIRA INFORMATION:
This message is automatically generated by JIRA.

If you think it was sent incorrectly contact one of the administrators:
   http://jira.codehaus.org/secure/Administrators.jspa

If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org