fix handling of sms:, smsto:, mms:, mmsto: URIs
1) add VIEW action and BROWSABLE category to SmsSendtoActivity intent filter 2) created class Rfc5724Uri for processing RFC5724 SMS URIs 3) added a set of tests for new Rfc5724Uri class 4) updated SmsSendtoActivity to use Rfc5742Uri for processing VIEW intents Fixes #2578 Closes #3030 // FREEBIEpull/1/head
							parent
							
								
									3fe676a3dd
								
							
						
					
					
						commit
						8f002bd68d
					
				| @ -0,0 +1,106 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) 2015 Open Whisper Systems | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package org.thoughtcrime.securesms.util; | ||||||
|  | 
 | ||||||
|  | import android.util.Log; | ||||||
|  | 
 | ||||||
|  | import org.thoughtcrime.securesms.TextSecureTestCase; | ||||||
|  | 
 | ||||||
|  | import java.net.URISyntaxException; | ||||||
|  | 
 | ||||||
|  | public class Rfc5724UriTest extends TextSecureTestCase { | ||||||
|  | 
 | ||||||
|  |   private static final String TAG = Rfc5724UriTest.class.getSimpleName(); | ||||||
|  | 
 | ||||||
|  |   public void testInvalidPath() throws Exception { | ||||||
|  |     final String[] invalidSchemaUris = { | ||||||
|  |         "", | ||||||
|  |         ":", | ||||||
|  |         "sms:", | ||||||
|  |         ":sms", | ||||||
|  |         "sms:?goto=fail", | ||||||
|  |         "sms:?goto=fail&fail=goto" | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     for (String uri : invalidSchemaUris) { | ||||||
|  |       try { | ||||||
|  |         new Rfc5724Uri(uri); | ||||||
|  |         Log.e(TAG, "uri " + uri + " should have failed path check"); | ||||||
|  |         assertTrue(false); | ||||||
|  |       } catch (URISyntaxException e) { } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public void testGetSchema() throws Exception { | ||||||
|  |     final String[][] uriTestPairs = { | ||||||
|  |         {"sms:+15555555555",           "sms"}, | ||||||
|  |         {"sMs:+15555555555",           "sMs"}, | ||||||
|  |         {"smsto:+15555555555?",        "smsto"}, | ||||||
|  |         {"mms:+15555555555?a=b",       "mms"}, | ||||||
|  |         {"mmsto:+15555555555?a=b&c=d", "mmsto"} | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     for (String[] uriTestPair : uriTestPairs) { | ||||||
|  |       final Rfc5724Uri testUri = new Rfc5724Uri(uriTestPair[0]); | ||||||
|  |       Log.d(TAG, testUri.getSchema() + " ?= " + uriTestPair[1]); | ||||||
|  |       assertTrue(testUri.getSchema().equals(uriTestPair[1])); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public void testGetPath() throws Exception { | ||||||
|  |     final String[][] uriTestPairs = { | ||||||
|  |         {"sms:+15555555555",                      "+15555555555"}, | ||||||
|  |         {"smsto:+15555555555?",                   "+15555555555"}, | ||||||
|  |         {"mms:+15555555555?a=b",                  "+15555555555"}, | ||||||
|  |         {"mmsto:+15555555555?a=b&c=d",            "+15555555555"}, | ||||||
|  |         {"sms:+15555555555,+14444444444",         "+15555555555,+14444444444"}, | ||||||
|  |         {"sms:+15555555555,+14444444444?",        "+15555555555,+14444444444"}, | ||||||
|  |         {"sms:+15555555555,+14444444444?a=b",     "+15555555555,+14444444444"}, | ||||||
|  |         {"sms:+15555555555,+14444444444?a=b&c=d", "+15555555555,+14444444444"} | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     for (String[] uriTestPair : uriTestPairs) { | ||||||
|  |       final Rfc5724Uri testUri = new Rfc5724Uri(uriTestPair[0]); | ||||||
|  |       Log.d(TAG, testUri.getPath() + " ?= " + uriTestPair[1]); | ||||||
|  |       assertTrue(testUri.getPath().equals(uriTestPair[1])); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public void testGetQueryParams() throws Exception { | ||||||
|  |     final String[][] uriTestPairs = { | ||||||
|  |         {"sms:+15555555555",         "a", null}, | ||||||
|  |         {"mms:+15555555555?b=",      "a", null}, | ||||||
|  |         {"mmsto:+15555555555?a=",    "a", ""}, | ||||||
|  |         {"sms:+15555555555?a=b",     "a", "b"}, | ||||||
|  |         {"sms:+15555555555?a=b&c=d", "a", "b"}, | ||||||
|  |         {"sms:+15555555555?a=b&c=d", "b", null}, | ||||||
|  |         {"sms:+15555555555?a=b&c=d", "c", "d"}, | ||||||
|  |         {"sms:+15555555555?a=b&c=d", "d", null} | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     for (String[] uriTestPair : uriTestPairs) { | ||||||
|  |       final Rfc5724Uri testUri     = new Rfc5724Uri(uriTestPair[0]); | ||||||
|  |       final String     paramResult = testUri.getQueryParams().get(uriTestPair[1]); | ||||||
|  | 
 | ||||||
|  |       Log.d(TAG, paramResult + " ?= " + uriTestPair[2]); | ||||||
|  |       if (paramResult == null) assertTrue(uriTestPair[2] == null); | ||||||
|  |       else                     assertTrue(paramResult.equals(uriTestPair[2])); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,80 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) 2015 Open Whisper Systems | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package org.thoughtcrime.securesms.util; | ||||||
|  | 
 | ||||||
|  | import java.net.URISyntaxException; | ||||||
|  | import java.net.URLDecoder; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.Map; | ||||||
|  | 
 | ||||||
|  | public class Rfc5724Uri { | ||||||
|  | 
 | ||||||
|  |   private final String              uri; | ||||||
|  |   private final String              schema; | ||||||
|  |   private final String              path; | ||||||
|  |   private final Map<String, String> queryParams; | ||||||
|  | 
 | ||||||
|  |   public Rfc5724Uri(String uri) throws URISyntaxException { | ||||||
|  |     this.uri         = uri; | ||||||
|  |     this.schema      = parseSchema(); | ||||||
|  |     this.path        = parsePath(); | ||||||
|  |     this.queryParams = parseQueryParams(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private String parseSchema() throws URISyntaxException { | ||||||
|  |     String[] parts = uri.split(":"); | ||||||
|  | 
 | ||||||
|  |     if (parts.length < 1 || parts[0].isEmpty()) throw new URISyntaxException(uri, "invalid schema"); | ||||||
|  |     else                                        return parts[0]; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private String parsePath() throws URISyntaxException { | ||||||
|  |     String[] parts = uri.split("\\?")[0].split(":", 2); | ||||||
|  | 
 | ||||||
|  |     if (parts.length < 2 || parts[1].isEmpty()) throw new URISyntaxException(uri, "invalid path"); | ||||||
|  |     else                                        return parts[1]; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private Map<String, String> parseQueryParams() throws URISyntaxException { | ||||||
|  |     Map<String, String> queryParams = new HashMap<>(); | ||||||
|  |     if (uri.split("\\?").length < 2) { | ||||||
|  |       return queryParams; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (String keyValue : uri.split("\\?")[1].split("&")) { | ||||||
|  |       String[] parts = keyValue.split("="); | ||||||
|  | 
 | ||||||
|  |       if (parts.length == 1) queryParams.put(parts[0], ""); | ||||||
|  |       else                  queryParams.put(parts[0], URLDecoder.decode(parts[1])); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return queryParams; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public String getSchema() { | ||||||
|  |     return schema; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public String getPath() { | ||||||
|  |     return path; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public Map<String, String> getQueryParams() { | ||||||
|  |     return queryParams; | ||||||
|  |   } | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in New Issue