Karsten,

applying the patch to my current shindig, didnt solved any problem, the
example isnt working for me, did you have to do extra modifications to any
file?.

G.-

On Fri, Jul 18, 2008 at 1:38 PM, Karsten Beyer (JIRA) <[EMAIL PROTECTED]>
wrote:

>
>     [
> https://issues.apache.org/jira/browse/SHINDIG-447?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel]
>
> Karsten Beyer updated SHINDIG-447:
> ----------------------------------
>
>    Attachment: fix-issue-447.patch
>
> As promised, attached a patch to fix the situation. However the issue
> seemed to be a lot worse than first expected. So i will first describe my
> analysis of the problems with the current code.
>
> There is a method to sanitize the fields (GET+POST) which go into the
> base_string used for the signature. It is located in SigningFetcher and
> relies on this method:
>
> protected static $ALLOWED_PARAM_NAME = "[-:\\w]+";
>
> ...
>
> private function allowParam($paramName)
>        {
>                $canonParamName = strtolower($paramName);
>                return (! (substr($canonParamName, 0, 5) == "oauth" ||
> substr($canonParamName, 0, 6) == "xoauth" || substr($canonParamName, 0, 9)
> == "opensocial")) && ereg(SigningFetcher::$ALLOWED_PARAM_NAME,
> $canonParamName);
>        }
>
>
> Now this filters all parameters which either start with one of the strings
> in the first half of the expression or which do not contain a 'w'(!). For
> this reason, stuff like "numentries" or "myvalueformyscript" is being thrown
> away, while "signOwner" and "signViewer" are kept. This is in my opinion a
> completely wrong behavior. I will present a solution to it later on.
>
> Next problem is that the values are only appended to the query string, if
> they were not posted to the proxy (which is ok, if we are supposed to do a
> POST). This affects both the signViewer and signOwner fields as everything
> is posted to the proxy. Bad thing is that the POST data and headers are not
> set, so we effectively do a GET instead of the requested POST.
>
> The OAuthRequest object now builds its base_string using all "sanitized"
> values in the GET+POST array. This contains at this point in time:
>
> 1) signViewer & signOwner
> 2) all Fields of the user not containing a 'w'
>
> They are not used in the final request string however, as they are POST
> data. Therefore the signature validation cannot work.
>
> Now to my solution (This patch is rather complex, so it would be a good
> idea to review it carefully before applying it):
>
>
> 1) I "fixed" the regular expression to accept alphanum, 0-9, -, _. However
> this is a very bad idea. As i understand, special chars are allowed for form
> field names, they just need to be encoded in a POST. Maybe someone has a
> good idea here. '\w' is as far as i know not available with the POSIX
> regular expressions.
>
> 2) As i understood the OAuth specification, the posted form data needs to
> be included in the base_string used for the signature. This is transfered to
> the proxy in the postData field of the $_POST. I implemented a parsing
> function which put the (sanitized) single entries into the postParams
> arrays, so they are used for the generation of the signature and also for
> the building of the query string / or postdata string (see below).
>
> 3) The sanitize function obviously did not work at all. If you fix it
> however, all the parameters which are supposed to be for the proxy, are now
> in the base_string as well as the query string. So i extended the allowParam
> method to exclude all these parameters (e.g. url, gadget, bypassspeccache
> etc.). This includes the postData param, as we put these values individually
> into the postParam array.
>
> 4) If we have a POST request, i build a post_data string according to
> RFC3986 using the oauth library which is later used to actually post the
> data. If we have a GET request however, i leave the post data string ==
> false in order to make a GET request to the partners page and keep the
> forPost array empty so that these are appended to the query string instead.
> Take a look at this example to understand why:
>
> testdataplain = new Object();
> testdataplain['hello'] = 'world';
> params[gadgets.io.RequestParameters.CONTENT_TYPE] =
> gadgets.io.ContentType.TEXT;
> params[gadgets.io.RequestParameters.AUTHORIZATION] =
> gadgets.io.AuthorizationType.SIGNED
> params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.GET;
> params[gadgets.io.RequestParameters.POST_DATA] =
> gadgets.io.encodeValues(testdataplain);
>
> gadgets.io.makeRequest('
> http://opensocialapps.kbsilver/log.php?hope=itworks', gotLog, params);
>
> Obviously i would expect to get the values hello=world&hope=itworks in a
> signed request.
>
> 5) Last of all, if we do a POST, i add the constructed post_data array (see
> 4) and the $_POST['headers'] field to the contructor of RemoteContentRequest
> in order to actually make a POST.
>
> 6) I removed the quick hack from the OAuth.php file.
>
>
>
>
>
>
> > makeRequest - Signed request cannot be verified because of base_string
> inconsitency
> >
> -----------------------------------------------------------------------------------
> >
> >                 Key: SHINDIG-447
> >                 URL: https://issues.apache.org/jira/browse/SHINDIG-447
> >             Project: Shindig
> >          Issue Type: Bug
> >          Components: Common Components (PHP)
> >            Reporter: Karsten Beyer
> >         Attachments: fix-issue-447.patch
> >
> >
> > When doing a signed request with makeRequest, the generated signature
> cannot be verified, because different base_strings are used.
> > I used the method described for Orkut (
> http://code.google.com/p/opensocial-resources/wiki/OrkutValidatingSignedRequests)
> to verify the signature on the requested page. When logging the base_string
> on both sides, i detected, that the signOwner and signViewer parameters are
> used for the base_string, but are not part of the request that the proxy
> does to the target page:
> > base_string build by shindig:
> >
> GET&http%3A%2F%2Fopensocialapps.kbsilver%2Flog.php&container%3Dazubister%26oauth_consumer_key%3Dnot%2520implemented%26oauth_nonce%3D68d2fedb1b405f426e0b5d6aa90893bb%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1215874245%26oauth_token%3D%26opensocial_app_id%3D25%26opensocial_owner_id%3DQ3czQ1B2SytHbVU0ZXJEOXRwOTJHdz09%26opensocial_viewer_id%3DQ3czQ1B2SytHbVU0ZXJEOXRwOTJHdz09%26signOwner%3Dtrue%26signViewer%3Dtrue%26synd%3Dazubister%26xoauth_signature_publickey%3Dhttp%253A%252F%252Fshindig.kbsilver%252Fpublic.crt
> > base_string build at the requested page:
> >
> GET&http%3A%2F%2Fopensocialapps.kbsilver%2Flog.php&container%3Dazubister%26oauth_consumer_key%3Dnot%2520implemented%26oauth_nonce%3D68d2fedb1b405f426e0b5d6aa90893bb%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1215874245%26oauth_token%3D%26opensocial_app_id%3D25%26opensocial_owner_id%3DQ3czQ1B2SytHbVU0ZXJEOXRwOTJHdz09%26opensocial_viewer_id%3DQ3czQ1B2SytHbVU0ZXJEOXRwOTJHdz09%26synd%3Dazubister%26xoauth_signature_publickey%3Dhttp%253A%252F%252Fshindig.kbsilver%252Fpublic.crt
> > Analyzing the $_GET parameters i get at the target leads to the same
> result. I do not know enough about the OAUTH logic in shindig, but i think
> either the signOwner and signViewer parameters need to be ignored when
> building the base_string for the signature or they need to be part of the
> request to the target page.
>
> --
> This message is automatically generated by JIRA.
> -
> You can reply to this email to add a comment to the issue online.
>
>

Reply via email to