diff options
Diffstat (limited to 'main/src')
6 files changed, 138 insertions, 30 deletions
diff --git a/main/src/cgeo/geocaching/connector/ConnectorFactory.java b/main/src/cgeo/geocaching/connector/ConnectorFactory.java index 50f56af..f63e390 100644 --- a/main/src/cgeo/geocaching/connector/ConnectorFactory.java +++ b/main/src/cgeo/geocaching/connector/ConnectorFactory.java @@ -8,6 +8,7 @@ import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.capability.ISearchByViewPort; import cgeo.geocaching.connector.gc.GCConnector; import cgeo.geocaching.connector.oc.OCApiConnector; +import cgeo.geocaching.connector.oc.OCApiConnector.ApiSupport; import cgeo.geocaching.connector.oc.OCApiLiveConnector; import cgeo.geocaching.connector.oc.OCConnector; import cgeo.geocaching.connector.ox.OXConnector; @@ -22,16 +23,16 @@ public final class ConnectorFactory { private static final UnknownConnector UNKNOWN_CONNECTOR = new UnknownConnector(); private static final IConnector[] connectors = new IConnector[] { GCConnector.getInstance(), - new OCApiLiveConnector("Opencaching.de", "www.opencaching.de", "OC", R.string.oc_de_okapi_consumer_key, R.string.oc_de_okapi_consumer_secret), + new OCApiLiveConnector("Opencaching.de", "www.opencaching.de", "OC", R.string.oc_de_okapi_consumer_key, R.string.oc_de_okapi_consumer_secret, ApiSupport.current), new OCConnector("OpenCaching.CZ", "www.opencaching.cz", "OZ"), - new OCApiConnector("OpenCaching.CO.UK", "www.opencaching.org.uk", "OK", "arU4okouc4GEjMniE2fq"), + new OCApiConnector("OpenCaching.CO.UK", "www.opencaching.org.uk", "OK", "arU4okouc4GEjMniE2fq", ApiSupport.oldapi), new OCConnector("OpenCaching.ES", "www.opencachingspain.es", "OC"), new OCConnector("OpenCaching.IT", "www.opencaching.it", "OC"), new OCConnector("OpenCaching.JP", "www.opencaching.jp", "OJ"), new OCConnector("OpenCaching.NO/SE", "www.opencaching.se", "OS"), - new OCApiConnector("OpenCaching.NL", "www.opencaching.nl", "OB", "PdzU8jzIlcfMADXaYN8j"), - new OCApiConnector("OpenCaching.PL", "www.opencaching.pl", "OP", "GkxM47WkUkLQXXsZ9qSh"), - new OCApiConnector("OpenCaching.US", "www.opencaching.us", "OU", "pTsYAYSXFcfcRQnYE6uA"), + new OCApiConnector("OpenCaching.NL", "www.opencaching.nl", "OB", "PdzU8jzIlcfMADXaYN8j", ApiSupport.current), + new OCApiConnector("OpenCaching.PL", "www.opencaching.pl", "OP", "GkxM47WkUkLQXXsZ9qSh", ApiSupport.current), + new OCApiConnector("OpenCaching.US", "www.opencaching.us", "OU", "pTsYAYSXFcfcRQnYE6uA", ApiSupport.oldapi), new OXConnector(), new GeocachingAustraliaConnector(), new GeopeitusConnector(), diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java index 3780c4d..4f365ec 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java +++ b/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java @@ -7,13 +7,31 @@ import cgeo.geocaching.network.Parameters; import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.CryptUtils; +import org.apache.commons.lang3.StringUtils; + public class OCApiConnector extends OCConnector implements ISearchByGeocode { + // Levels of Okapi we support + // oldapi is around rev 500 + // current is from rev 798 onwards + public enum ApiSupport { + oldapi, + current + } + + // Levels of OAuth-Authentication we support + public enum OAuthLevel { + Level1, + Level3 + } + private final String cK; + private final ApiSupport apiSupport; - public OCApiConnector(String name, String host, String prefix, String cK) { + public OCApiConnector(String name, String host, String prefix, String cK, ApiSupport apiSupport) { super(name, host, prefix); this.cK = cK; + this.apiSupport = apiSupport; } public void addAuthentication(final Parameters params) { @@ -41,7 +59,22 @@ public class OCApiConnector extends OCConnector implements ISearchByGeocode { return true; } + @SuppressWarnings("static-method") + public OAuthLevel getSupportedAuthLevel() { + return OAuthLevel.Level1; + } + public String getCK() { return CryptUtils.rot13(cK); } + + @SuppressWarnings("static-method") + public String getCS() { + return StringUtils.EMPTY; + } + + public ApiSupport getApiSupport() { + return apiSupport; + } + } diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java index 4e57831..929e3b8 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java +++ b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java @@ -17,8 +17,8 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente private String cS; - public OCApiLiveConnector(String name, String host, String prefix, int cKResId, int cSResId) { - super(name, host, prefix, CryptUtils.rot13(cgeoapplication.getInstance().getResources().getString(cKResId))); + public OCApiLiveConnector(String name, String host, String prefix, int cKResId, int cSResId, ApiSupport apiSupport) { + super(name, host, prefix, CryptUtils.rot13(cgeoapplication.getInstance().getResources().getString(cKResId)), apiSupport); cS = CryptUtils.rot13(cgeoapplication.getInstance().getResources().getString(cSResId)); } @@ -34,6 +34,12 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente return new SearchResult(OkapiClient.getCachesAround(center, this)); } + @Override + public OAuthLevel getSupportedAuthLevel() { + return OAuthLevel.Level3; + } + + @Override public String getCS() { return CryptUtils.rot13(cS); } diff --git a/main/src/cgeo/geocaching/connector/oc/OCConnector.java b/main/src/cgeo/geocaching/connector/oc/OCConnector.java index 62dfb4c..a26a3c1 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCConnector.java +++ b/main/src/cgeo/geocaching/connector/oc/OCConnector.java @@ -62,5 +62,4 @@ public class OCConnector extends AbstractConnector { public CacheRealm getCacheRealm() { return CacheRealm.OC; } - } diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java index d8d92e1..bf35574 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java @@ -12,6 +12,8 @@ import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.IConnector; import cgeo.geocaching.connector.LogResult; import cgeo.geocaching.connector.gc.GCConnector; +import cgeo.geocaching.connector.oc.OCApiConnector.ApiSupport; +import cgeo.geocaching.connector.oc.OCApiConnector.OAuthLevel; import cgeo.geocaching.enumerations.CacheAttribute; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.CacheType; @@ -99,8 +101,14 @@ final public class OkapiClient { private static final String SERVICE_CACHE = "/okapi/services/caches/geocache"; - private static final String SERVICE_CACHE_CORE_FIELDS = "code|name|location|type|status|difficulty|terrain|size|is_found"; - private static final String SERVICE_CACHE_FIELDS = SERVICE_CACHE_CORE_FIELDS + "|owner|founds|notfounds|rating|rating_votes|recommendations|description|hint|images|latest_logs|date_hidden|attribution_note|alt_wpts|is_watched|attrnames|gc_code"; + // the several realms of possible field s for cache retrieval: + // Core: for livemap requests (L3 - only with level 3 auth) + // Additional: additional fields for full cache (L3 - only for level 3 auth, current - only for connectors with current api) + private static final String SERVICE_CACHE_CORE_FIELDS = "code|name|location|type|status|difficulty|terrain|size"; + private static final String SERVICE_CACHE_CORE_L3_FIELDS = "is_found"; + private static final String SERVICE_CACHE_ADDITIONAL_FIELDS = "owner|founds|notfounds|rating|rating_votes|recommendations|description|hint|images|latest_logs|date_hidden|alt_wpts|attrnames"; + private static final String SERVICE_CACHE_ADDITIONAL_CURRENT_FIELDS = "gc_code|attribution_note"; + private static final String SERVICE_CACHE_ADDITIONAL_L3_FIELDS = "is_watched"; private static final String SERVICE_SEARCH_AND_RETRIEVE = "/okapi/services/caches/shortcuts/search_and_retrieve"; @@ -113,8 +121,18 @@ final public class OkapiClient { private static final String SERVICE_SUBMIT_LOG = "/okapi/services/logs/submit"; public static Geocache getCache(final String geoCode) { - final Parameters params = new Parameters("cache_code", geoCode, "fields", SERVICE_CACHE_FIELDS, "attribution_append", "none"); - final JSONObject data = request(ConnectorFactory.getConnector(geoCode), SERVICE_CACHE, params); + final Parameters params = new Parameters("cache_code", geoCode); + IConnector connector = ConnectorFactory.getConnector(geoCode); + if (!(connector instanceof OCApiConnector)) { + return null; + } + + OCApiConnector ocapiConn = (OCApiConnector) connector; + + params.add("fields", getFullFields(ocapiConn)); + params.add("attribution_append", "none"); + + final JSONObject data = request(ocapiConn, SERVICE_CACHE, params); if (data == null) { return null; @@ -123,18 +141,24 @@ final public class OkapiClient { return parseCache(data); } - public static List<Geocache> getCachesAround(final Geopoint center, IConnector connector) { + // Assumes level 3 OAuth + public static List<Geocache> getCachesAround(final Geopoint center, OCApiConnector connector) { String centerString = GeopointFormatter.format(GeopointFormatter.Format.LAT_DECDEGREE_RAW, center) + "|" + GeopointFormatter.format(GeopointFormatter.Format.LON_DECDEGREE_RAW, center); final Parameters params = new Parameters("search_method", METHOD_SEARCH_NEAREST); final Map<String, String> valueMap = new LinkedHashMap<String, String>(); valueMap.put("center", centerString); valueMap.put("limit", "20"); + if (connector.getSupportedAuthLevel() != OAuthLevel.Level3) { + Log.e("Calling OkapiClient.getCachesAround with wrong connector"); + return Collections.emptyList(); + } + addFilterParams(valueMap); params.add("search_params", new JSONObject(valueMap).toString()); - addRetrieveParams(params); + addRetrieveParams(params, connector); final JSONObject data = request(connector, SERVICE_SEARCH_AND_RETRIEVE, params); @@ -145,7 +169,8 @@ final public class OkapiClient { return parseCaches(data); } - public static List<Geocache> getCachesBBox(final Viewport viewport, IConnector connector) { + // Assumes level 3 OAuth + public static List<Geocache> getCachesBBox(final Viewport viewport, OCApiConnector connector) { if (viewport.getLatitudeSpan() == 0 || viewport.getLongitudeSpan() == 0) { return Collections.emptyList(); @@ -159,11 +184,16 @@ final public class OkapiClient { final Map<String, String> valueMap = new LinkedHashMap<String, String>(); valueMap.put("bbox", bboxString); + if (connector.getSupportedAuthLevel() != OAuthLevel.Level3) { + Log.e("Calling OkapiClient.getCachesBBox with wrong connector"); + return Collections.emptyList(); + } + addFilterParams(valueMap); params.add("search_params", new JSONObject(valueMap).toString()); - addRetrieveParams(params); + addRetrieveParams(params, connector); final JSONObject data = request(connector, SERVICE_SEARCH_AND_RETRIEVE, params); @@ -174,7 +204,7 @@ final public class OkapiClient { return parseCaches(data); } - public static boolean setWatchState(final Geocache cache, final boolean watched, IConnector connector) { + public static boolean setWatchState(final Geocache cache, final boolean watched, OCApiConnector connector) { final Parameters params = new Parameters("cache_code", cache.getGeocode()); params.add("watched", watched ? "true" : "false"); @@ -189,7 +219,7 @@ final public class OkapiClient { return true; } - public static LogResult postLog(final Geocache cache, LogType logType, Calendar date, String log, IConnector connector) { + public static LogResult postLog(final Geocache cache, LogType logType, Calendar date, String log, OCApiConnector connector) { final Parameters params = new Parameters("cache_code", cache.getGeocode()); params.add("logtype", logType.oc_type); params.add("comment", log); @@ -317,7 +347,9 @@ final public class OkapiClient { //TODO: Store license per cache //cache.setLicense(response.getString("attribution_note")); cache.setWaypoints(parseWaypoints(response.getJSONArray(CACHE_WPTS)), false); - cache.setOnWatchlist(response.getBoolean(CACHE_IS_WATCHED)); + if (!response.isNull(CACHE_IS_WATCHED)) { + cache.setOnWatchlist(response.getBoolean(CACHE_IS_WATCHED)); + } cache.setDetailedUpdatedNow(); // save full detailed caches @@ -343,7 +375,9 @@ final public class OkapiClient { cache.setDifficulty((float) response.getDouble(CACHE_DIFFICULTY)); cache.setTerrain((float) response.getDouble(CACHE_TERRAIN)); - cache.setFound(response.getBoolean(CACHE_IS_FOUND)); + if (!response.isNull(CACHE_IS_FOUND)) { + cache.setFound(response.getBoolean(CACHE_IS_FOUND)); + } } private static String absoluteUrl(String url, String geocode) { @@ -545,11 +579,42 @@ final public class OkapiClient { return CacheType.UNKNOWN; } - private static JSONObject request(final IConnector connector, final String service, final Parameters params) { + private static String getCoreFields(OCApiConnector connector) { if (connector == null) { - return null; + Log.e("OkapiClient.getCoreFields called with invalid connector"); + return StringUtils.EMPTY; } - if (!(connector instanceof OCApiConnector)) { + + if (connector.getSupportedAuthLevel() == OAuthLevel.Level3) { + return SERVICE_CACHE_CORE_FIELDS + "|" + SERVICE_CACHE_CORE_L3_FIELDS; + } + + return SERVICE_CACHE_CORE_FIELDS; + } + + private static String getFullFields(OCApiConnector connector) { + if (connector == null) { + Log.e("OkapiClient.getFullFields called with invalid connector"); + return StringUtils.EMPTY; + } + + StringBuilder res = new StringBuilder(500); + + res.append(SERVICE_CACHE_CORE_FIELDS); + res.append("|").append(SERVICE_CACHE_ADDITIONAL_FIELDS); + if (connector.getSupportedAuthLevel() == OAuthLevel.Level3) { + res.append("|").append(SERVICE_CACHE_CORE_L3_FIELDS); + res.append("|").append(SERVICE_CACHE_ADDITIONAL_L3_FIELDS); + } + if (connector.getApiSupport() == ApiSupport.current) { + res.append("|").append(SERVICE_CACHE_ADDITIONAL_CURRENT_FIELDS); + } + + return res.toString(); + } + + private static JSONObject request(final OCApiConnector connector, final String service, final Parameters params) { + if (connector == null) { return null; } @@ -560,7 +625,11 @@ final public class OkapiClient { params.add("langpref", getPreferredLanguage()); - OAuth.signOAuth(host, service, "GET", false, params, Settings.getOCDETokenPublic(), Settings.getOCDETokenSecret(), ((OCApiLiveConnector) connector).getCK(), ((OCApiLiveConnector) connector).getCS()); + if (connector.getSupportedAuthLevel() == OAuthLevel.Level3) { + OAuth.signOAuth(host, service, "GET", false, params, Settings.getOCDETokenPublic(), Settings.getOCDETokenSecret(), connector.getCK(), connector.getCS()); + } else { + connector.addAuthentication(params); + } final String uri = "http://" + host + service; return Network.requestJSON(uri, params); @@ -574,6 +643,7 @@ final public class OkapiClient { return "en"; } + // assumes level 3 oauth private static void addFilterParams(final Map<String, String> valueMap) { if (!Settings.isExcludeDisabledCaches()) { valueMap.put("status", "Available|Temporarily unavailable"); @@ -587,9 +657,9 @@ final public class OkapiClient { } } - private static void addRetrieveParams(final Parameters params) { + private static void addRetrieveParams(final Parameters params, OCApiConnector connector) { params.add("retr_method", METHOD_RETRIEVE_CACHES); - params.add("retr_params", "{\"fields\": \"" + SERVICE_CACHE_CORE_FIELDS + "\"}"); + params.add("retr_params", "{\"fields\": \"" + getCoreFields(connector) + "\"}"); params.add("wrap", "true"); } diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java b/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java index 24c6b79..c5d6990 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java @@ -3,7 +3,6 @@ package cgeo.geocaching.connector.oc; import cgeo.geocaching.Geocache; import cgeo.geocaching.TrackableLog; import cgeo.geocaching.VisitCacheActivity; -import cgeo.geocaching.connector.IConnector; import cgeo.geocaching.connector.ILoggingManager; import cgeo.geocaching.connector.ImageResult; import cgeo.geocaching.connector.LogResult; @@ -20,14 +19,14 @@ import java.util.List; public class OkapiLoggingManager implements ILoggingManager { - private final IConnector connector; + private final OCApiConnector connector; private final Geocache cache; private VisitCacheActivity activity; private final static List<LogType> standardLogTypes = Arrays.asList(LogType.FOUND_IT, LogType.DIDNT_FIND_IT, LogType.NOTE, LogType.NEEDS_MAINTENANCE); private final static List<LogType> eventLogTypes = Arrays.asList(LogType.WILL_ATTEND, LogType.ATTENDED, LogType.NOTE); - public OkapiLoggingManager(Activity activity, IConnector connector, Geocache cache) { + public OkapiLoggingManager(Activity activity, OCApiConnector connector, Geocache cache) { this.connector = connector; this.cache = cache; this.activity = (VisitCacheActivity) activity; |
