Hi again.

It seems that the bug is still present. The HTTPheader not contains 
basicAuthentification informations. What test did you do about the new httpOp ? 
I may doing it in a wrong way :/

After the debugged applyAuthentication in HttpOp, there is the following line : 
"HttpResponse response = httpclient.execute(httppost, httpContext);"

And I think that the HttpClient.execute method doesn't use the authentication 
information available in his Credential provider.

Rob : "Don't forget you can always check out and do a mvn install locally"
Ho yes, I'll do that next time!

VAÏSSE-LESTEVEN Arthur.


>Hmmm, that is a little weird
>
>I just forced a rebuild and the latest build does have the change in it, not 
>sure what happened there. Sometimes the Apache build servers are just a little 
>flaky.
>
>Don't forget you can always check out and do a mvn install locally
>
>Rob
>
>From: Arthur Vaïsse-Lesteven 
><[email protected]<mailto:[email protected]>>
>Reply-To: "[email protected]<mailto:[email protected]>" 
><[email protected]<mailto:[email protected]>>, Arthur Vaïsse-Lesteven 
><[email protected]<mailto:[email protected]>>
>Date: Monday, June 24, 2013 5:26 AM
>To: "[email protected]<mailto:[email protected]>" 
><[email protected]<mailto:[email protected]>>
>Subject: Re: Tr : Basic Authentication for SPARQL Update
>
>Hi Rob,
>
>It's a little confusing.
>
>You modified the HttpOp class in the release number 34 on the maven repo [1], 
>but this modification isn't present in the last version ( 38 ) as you can see 
>in the java file joined to this mail.
>
>The add of "client.setCredentialsProvider(provider);" line 400 probably solve 
>the problem but I'm not able to test it as it isn't present in the last 
>released version of ARQ.
>
>( The trunk version of your SVN seems to contains this code too ).
>
>Thanks for your work.
>
>VAISSE-LESTEVEN Arthur.
>
>
>[1] 
>https://repository.apache.org/content/repositories/snapshots/org/apache/jena/jena-arq/2.10.2-SNAPSHOT/
>________________________________
>De : Rob Vesse <[email protected]<mailto:[email protected]>>
>À : "[email protected]<mailto:[email protected]>" 
><[email protected]<mailto:[email protected]>>
>Envoyé le : Vendredi 21 juin 2013 19h35
>Objet : Re: Tr : Basic Authentication for SPARQL Update
>
>The latest SNAPSHOTS now have the fix, you may need to add -U to your mvn
>calls if you have recently updated SNAPSHOTs to get the very latest
>
>Please test and confirm whether this resolves the issue
>
>Rob
>
>
>On 6/21/13 9:13 AM, "Rob Vesse" <[email protected]<mailto:[email protected]>> 
>wrote:
>
>>Nice catch
>>
>>Yes I appear to have made an error, I never associated the created
>>credentials provider with the HTTP Client
>>
>>Filed as JENA-475 (https://issues.apache.org/jira/browse/JENA-475)
>>
>>I will commit a fix ASAP and you should be able to pick up a
>>2.10.2-SNAPSHOT build in a few hours with the fix, if you can test with
>>the snapshot and report if this resolves the issue that would be great.
>>
>>You can verify whether the fix has gone into the snapshots by looking at
>>https://builds.apache.org/job/Jena__Development_Test/changes and seeing if
>>there is a build listed where the commit messages mention JENA-475
>>
>>Rob
>>
>>
>>
>>On 6/20/13 11:51 PM, "Arthur Vaïsse-Lesteven" 
>><[email protected]<mailto:[email protected]>>
>>wrote:
>>
>>>Hi Rob, I'm in trouble with the basic authentication process ( I'm now
>>>using ARQ 2.10.1 )
>>>
>>>
>>>In one hand the Queries work like this :
>>>when we calls one of the 4 method execX of a queryExecution, the
>>>QueryEngineHTTP calls makeHttpQuery, and after few steps this code line
>>>is executed :
>>>    httpConnection.setRequestProperty("Authorization", "Basic "+y) ;
>>>where y contains userName:password 64Bits encrypted.
>>>
>>>This make the http request header contains the Key, Value couple :
>>>"Authorization" "Basic username:password".
>>>
>>>I'm OK with this.
>>>
>>>In the other hand, the update seem to handle Basic Authentication in a
>>>different way.
>>>
>>>I used this code :
>>>
>>>UpdateRequest update =
>>> UpdateFactory.create(queryString);
>>>UpdateProcessRemoteForm exec = (UpdateProcessRemoteForm)
>>>UpdateExecutionFactory.createRemoteForm(update, service);
>>>exec.setAuthentication("[email protected]<mailto:[email protected]>", 
>>>"savaillon".toCharArray());
>>>
>>>And I'm unable to retrieve the usename and the password.
>>>Request contains following fields :
>>>In headers :
>>>content-lenght : 273
>>>content-type : application/x-www-form-urlencoded; charset=UTF-8
>>>host : localhost:8080
>>>conection : Keep-Alive
>>>user-agent: Apache-HttpClient/4.2.3 (java 1.5)
>>>In params :
>>>update : my update
>>>No attribute.
>>>
>>>I tried to follow in the ARQ library the path of my username and
>>>password, and finally they transited to the applyAuthentication in
>>>HttpOp.
>>>
>>>This method create a CredentialsProvider and set the credentials username
>>>and
>>> password. But this method has a void return type, and I don't see any
>>>communication point with the rest of the HttpOp code.
>>>
>>>Do I missed something ?
>>>
>>>VAÏSSE-LESTEVEN Arthur.
>>>
>>>
>>>>I was using the 2.9.2 ARQ version. I'll update to 2.10.1.
>>>>Thanks for your quick answer and for your work  Rob!
>>>>
>>>>VAÏSSE-LESTEVEN Arthur.
>>>>
>>>>
>>>>>What version of ARQ are you using?
>>>>>
>>>>>I put changes in place which went into the 2.10.1 release which should
>>>>>permit easy HTTP auth on SPARQL updates.  Both
>>>>>UpdateExecutionFactory.createRemote() and
>>>>>UpdateExecutionFactory.createRemoteForm() return an instance derived
>>>>>from
>>>>>UpdateProcessRemoteBase which has a setAuthentication() method
>>>>>
>>>>>If you are using a version of ARQ prior to 2.10.0 there is no common
>>>>>base
>>>>>class but both UpdateProcessRemote and UpdateProcessRemoteForm
>>> would still
>>>>>have a setHttpContext() method which allows you to pass in a
>>>>>HttpContext
>>>>>which can be used to pass in authentication settings using the
>>>>>HttpClient
>>>>>APIs.  Even with 2.10.1 you can still choose to use this method
>>>>>particularly if you need to pass complex credentials.
>>>>>
>>>>>Rob
>>>>>
>>>>>
>>>>>On 6/18/13 8:10 AM, "Arthur Vaïsse-Lesteven" 
>>>>><[email protected]<mailto:[email protected]>>
>>>>>wrote:
>>>>>
>>>>>>Hi,
>>>>>>
>>>>>>
>>>>>>The remote execution of SPARQL queries offer the
>>>>>>setBasicAuthentication
>>>>>>fonctionality(1). I'm using it; and when I tried to use it with SPARQL
>>>>>>Update it appears that SPARQL Update doesn't handle Authentication.
>>>>>>I would like to know, do it exist any way to do the same thing in ARQ
>>>>>>? I
>>>>>>writted some code by extending 2 apache classes, but it would be
>>> better
>>>>>>to just use the API. Do you intend to not allow basicAuthentification
>>>>>>?
>>>>>>It is incompatible with http basic authentication ? There are only
>>>>>>24hours per day and you don't had the time to do it yet ?
>>>>>>
>>>>>>Do this functionality is planed ?
>>>>>>
>>>>>>______________________________________________________________________
>>>>>>_
>>>>>>_
>>>>>>
>>>>>>(1) What i can write :
>>>>>>
>>>>>>[...]
>>>>>>
>>>>>>
>>>>>>QueryEngineHTTP exec = (QueryEngineHTTP)
>>>>>>QueryExecutionFactory.createServiceRequest(endpoint_URL, query);
>>>>>>exec.setBasicAuthentication(user, password);
>>>>>>
>>>>>>exec.exec...
>>>>>>
>>>>>>[...]
>>>>>>
>>>>>>(2)What I want to write :
>>>>>>
>>>>>>[...]
>>>>>>UpdateProcessRemote exec =
>>> (UpdateProcessRemote)
>>>>>>UpdateExecutionFactory.createRemote(update, endpoint_URL);
>>>>>>exec.setBasicAuthentication(user, password);
>>>>>>
>>>>>>exec.excute();
>>>>>>
>>>>>>[...]
>>>>>>
>>>>>>
>>>>>>
>>>>>>I tried to custom the UpdateProcessRemote class to allow (2). This
>>>>>>currently don't work on my computer, but it seem's to be due to a
>>>>>>maven
>>>>>>version conflict at level of HttpClient. This class must be compatible
>>>>>>with current version of Jena.( I set my modifications in bold ).( also
>>>>>>downlodable at : http://arthurvaisse.free.fr/classes/ )
>>>>>>
>>>>>>Thank you,
>>>>>>VAÏSSE-LESTEVEN Arthur.
>>>>>>
>>>>>>
>>>>>>______________________________________________________________________
>>>>>>_
>>>>>>_
>>>>>>
>>>>>>public class UpdateProcessRemote
>>> implements UpdateProcessor{
>>>>>>
>>>>>>    private String user = null ;
>>>>>>    private char[] password = null ;
>>>>>>
>>>>>>    private final UpdateRequest request ;
>>>>>>    private final String endpoint ;
>>>>>>
>>>>>>    public UpdateProcessRemote(UpdateRequest request , String endpoint
>>>>>>)
>>>>>>    {
>>>>>>        this.request = request ;
>>>>>>        this.endpoint = endpoint ;
>>>>>>
>>>>>> }
>>>>>>
>>>>>>    @Override
>>>>>>    public void setInitialBinding(QuerySolution binding)
>>>>>>    {
>>>>>>        throw new ARQException("Initial bindings
>>> for a remote update
>>>>>>execution request not supported") ;
>>>>>>    }
>>>>>>
>>>>>>    @Override
>>>>>>    public GraphStore getGraphStore()
>>>>>>    {
>>>>>>        return null ;
>>>>>>    }
>>>>>>
>>>>>>    @Override
>>>>>>    public void execute()
>>>>>>    {
>>>>>>        String reqStr = request.toString() ;
>>>>>>      HttpOpCustom.execHttpPost(endpoint,
>>>>>>WebContent.contentTypeSPARQLUpdate, reqStr, user, password);
>>>>>>    }
>>>>>>
>>>>>>    //comes from QueryEngineHTTP.
>>>>>>    public void
>>> setBasicAuthentication(String user, char[] password)
>>>>>>
>>>>>> {
>>>>>>        this.user = user ;
>>>>>>        this.password = password ;
>>>>>>    }
>>>>>>______________________________________________________________________
>>>>>>_
>>>>>>_
>>>>>>
>>>>>>I added this functions to HttpOp to create my custom HttpOp :
>>>>>>
>>>>>>    //Just added credentials in parameters
>>>>>>    public static void execHttpPost(String url, String contentType,
>>>>>>String content, String user, char[] password)
>>>>>>    {
>>>>>>        execHttpPost(url, contentType, content, null, null, user,
>>>>>>password) ;
>>>>>>
>>> }
>>>>>>
>>>>>>
>>>>>>    //Just added credentials in parameters
>>>>>>    public static void execHttpPost(String url, String contentType,
>>>>>>String content,
>>>>>>            String acceptType, Map<String, HttpResponseHandler>
>>>>>>handlers,
>>>>>>            String user, char[] password)
>>>>>>    {
>>>>>>        StringEntity e = null ;
>>>>>>        try
>>>>>>        {
>>>>>>            e = new StringEntity(content, "UTF-8") ;
>>>>>>
>>> e.setContentType(contentType) ;
>>>>>>            execHttpPost(url, e, acceptType, handlers, user, password)
>>>>>>;
>>>>>>        } catch (UnsupportedEncodingException e1)
>>>>>>        {
>>>>>>            throw new ARQInternalErrorException("Platform does not
>>>>>>support required UTF-8") ;
>>>>>>        } finally { closeEntity(e) ; }
>>>>>>    }
>>>>>>
>>>>>>
>>>>>>    public static void execHttpPost(String url,  HttpEntity provider,
>>>>>>            String acceptType, Map<String, HttpResponseHandler>
>>> handlers,
>>>>>>            String user, char[] password)
>>>>>>    {
>>>>>>        try {
>>>>>>            long id = counter.incrementAndGet() ;
>>>>>>            String requestURI = determineBaseIRI(url) ;
>>>>>>            String baseIRI = determineBaseIRI(requestURI) ;
>>>>>>
>>>>>>            HttpPost httppost = new HttpPost(requestURI);
>>>>>>
>>>>>>            if ( user != null || password !=
>>> null){
>>>>>>                if(user==null || password == null){
>>>>>>                    log.warn("Only one of user/password is set") ;
>>>>>>                }
>>>>>>                //this code come from httpQuery
>>>>>>                StringBuffer x = new StringBuffer() ;
>>>>>>                byte b[] =
>>>>>>x.append(user).append(":").append(password).toString().getBytes("UTF-8
>>>>>>"
>>>>>>)
>>> ;
>>>>>>                String y = Base64.encodeBase64String(b) ;
>>>>>>                //this single code line is mine
>>>>>>                httppost.addHeader("Authorization", "Basic "+y);
>>>>>>            }
>>>>>>            if ( log.isDebugEnabled() )
>>>>>>                log.debug(format("[%d] %s %s",id
>>>>>>,httppost.getMethod(),httppost.getURI().toString())) ;
>>>>>>
>>>>>>            if (
>>> provider.getContentType() == null )
>>>>>>                log.debug(format("[%d] No content type")) ;
>>>>>>
>>>>>>            // Execute
>>>>>>            HttpClient httpclient = new DefaultHttpClient();
>>>>>>            httppost.setEntity(provider) ;
>>>>>>            HttpResponse response = httpclient.execute(httppost) ;
>>>>>>            httpResponse(id, response, baseIRI, handlers) ;
>>>>>>
>>>>>>
>>> httpclient.getConnectionManager().shutdown();
>>>>>>        } catch (IOException ex)
>>>>>>        {
>>>>>>            ex.printStackTrace(System.err) ;
>>>>>>        }
>>>>>>        finally { closeEntity(provider) ; }
>>>>>>    }

Reply via email to