Hello All :-) I am building a sandpit web application using GWT that is hosted on App Engine and displayed within facebook as a canvas app.
I am trying to implement validation, using http://wiki.developers.facebook.com/index.php/User:Google_Web_Toolkit#Security_and_Authentication as a guide. The problem I am encountering is that when I try to use the Map returned by Window.Location.getParameterMap() a java.util.Collections $UnmodifiableMap problem occurs, even though I'm not modifying the Map (at least I don't think I am modifying the Map). I would be really grateful if someone could take the time to help my understand what I am doing wrong here or point out where I should post this problem if this forum is not a suitable place to raise this problem. Thank you in advance :-) Source Code Below. The onModuleLoad() code within my EntryPoint class is below; fbValidationService.test(Window.Location.getParameterMap(), new AsyncCallback<String>() { public void onFailure(Throwable caught) { // Show the RPC error message to the user RootPanel.get("serverResponse").add(new HTML("Remote Procedure Call : Test 261109 10:51 - Failure")); RootPanel.get("serverResponse").add(new HTML(SERVER_ERROR)); RootPanel.get("serverResponse").add(new HTML(caught.getMessage ())); RootPanel.get("serverResponse").add(new HTML("Stack Trace")); StackTraceElement[] stackTrace = caught.getStackTrace(); for(int i = 0 ; i < stackTrace.length ; i++) { StackTraceElement element = stackTrace[i]; RootPanel.get("serverResponse").add(new HTML(element.getFileName ())); RootPanel.get("serverResponse").add(new HTML(element.getClassName ())); RootPanel.get("serverResponse").add(new HTML(element.getMethodName ())); RootPanel.get("serverResponse").add(new HTML(Integer.toString (element.getLineNumber()))); } } public void onSuccess(String result) { // Show the RPC result to the user RootPanel.get("serverResponse").add(new HTML("Remote Procedure Call : Test - Success")); RootPanel.get("serverResponse").add(new HTML(result)); } }); The test() method within the RemoteServiceServlet object is below; /** * Validation Test * To generate the signature for these arguments: * 1. Remove the fb_sig key and value pair. * 2. Remove the "fb_sig_" prefix from all of the keys. * 3. Sort the array alphabetically by key. * 4. Concatenate all key/value pairs together in the format "k=v". * 5. Append your secret key. * 6. Take the md5 hash of the whole string. * @param fbQueryStringParams * @return String */ public String test(Map<String,List<java.lang.String>> fbQueryStringParams) { String appSecret = TinyFBClient.APP_SECRET; String fbSig = fbQueryStringParams.get("fb_sig").get(0); StringBuilder sb = new StringBuilder(); TreeMap<String,String> sortedMap = new TreeMap<String,String>(); // Get a Set view of the Map of query string parameters. Set<Map.Entry<String,List<java.lang.String>>> mapEntries = fbQueryStringParams.entrySet(); // Iterate through the Set view, inserting into a SortedMap all Map.Entry's // that do not have a Key value of "fb_sig". Iterator<Map.Entry<String,List<java.lang.String>>> i = mapEntries.iterator(); while(i.hasNext()) { Map.Entry<String,List<java.lang.String>> mapEntry = i.next(); if(!mapEntry.getKey().equals("fb_sig")) { // 1. Remove the fb_sig key and value pair. sortedMap.put(mapEntry.getKey(),mapEntry.getValue().get(0)); // 3. Sort the array alphabetically by key. } } // Get a Set view of the Map of alphabetically sorted Map.Entry objects. Set<Map.Entry<String,String>> sortedMapEntries = sortedMap.entrySet (); // Iterate through the Set view, appending the concatenated key's and value's // to a StringBuilder object. Iterator<Map.Entry<String,String>> ii = sortedMapEntries.iterator(); while(ii.hasNext()) { Map.Entry<String,String> mapEntry = ii.next(); // 4. Concatenate all key/value pairs together in the format "k=v". sb.append(mapEntry.getKey().replaceAll("fb_sig_","")); // 2. Remove the "fb_sig_" prefix from all of the keys. sb.append("="); sb.append(mapEntry.getValue()); } sb.append(appSecret); // 5. Append your secret key. String md5 = DigestUtils.md5Hex(sb.toString()); // 6. Take the md5 hash of the whole string. // Build and return an output String for display. StringBuilder output = new StringBuilder(); output.append("fbSig = "+fbSig); output.append("<br/>"); output.append("md5 = "+md5); return output.toString(); } The output displayed on the web app (when displayed within facebook) is below; Remote Procedure Call : Test 261109 10:51 - Failure An error occurred while attempting to contact the server. Please check your network connection and try again. java.util.Collections$UnmodifiableMap Stack Trace -- You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To post to this group, send email to google-web-tool...@googlegroups.com. To unsubscribe from this group, send email to google-web-toolkit+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.