001package com.gigya.android.sdk.api; 002 003import com.gigya.android.sdk.Config; 004import com.gigya.android.sdk.Gigya; 005import com.gigya.android.sdk.GigyaLogger; 006import com.gigya.android.sdk.network.adapter.RestAdapter; 007import com.gigya.android.sdk.session.ISessionService; 008import com.gigya.android.sdk.utils.AuthUtils; 009import com.gigya.android.sdk.utils.UrlUtils; 010 011import java.util.Map; 012import java.util.TreeMap; 013 014public class GigyaApiRequestFactory implements IApiRequestFactory { 015 016 private static final String LOG_TAG = "GigyaApiRequestFactory"; 017 018 final private Config _config; 019 final private ISessionService _sessionService; 020 021 public GigyaApiRequestFactory(Config config, ISessionService sessionService) { 022 _config = config; 023 _sessionService = sessionService; 024 } 025 026 /** 027 * Create a new instance of the GigyaApiRequest structure. 028 * 029 * @param api Api method. 030 * @param params Request parameters. 031 * @param httpMethod Request HTTP method. 032 * @return New GigyaApiRequest instance. 033 */ 034 public GigyaApiRequest create(String api, Map<String, Object> params, RestAdapter.HttpMethod httpMethod) { 035 TreeMap<String, Object> urlParams = new TreeMap<>(); 036 if (params != null) { 037 urlParams.putAll(params); 038 } 039 040 // Add general parameters. 041 urlParams.put("sdk", "Android_" + Gigya.VERSION); 042 urlParams.put("targetEnv", "mobile"); 043 urlParams.put("httpStatusCodes", false); 044 urlParams.put("format", "json"); 045 046 // Add configuration parameters 047 final String gmid = _config.getGmid(); 048 if (gmid != null) { 049 urlParams.put("gmid", gmid); 050 } 051 final String ucid = _config.getUcid(); 052 if (ucid != null) { 053 urlParams.put("ucid", ucid); 054 } 055 056 // Generate new GigyaApiRequest entity. 057 return new GigyaApiRequest(httpMethod, api, urlParams); 058 } 059 060 /** 061 * Sign the request prior to dispatching it. 062 * 063 * @param request GigyaApiRequest instance. 064 */ 065 @Override 066 public GigyaApiHttpRequest sign(GigyaApiRequest request) { 067 068 // The request will need to be resigned. To avoid signature errors we must remove all 069 // authentication parameters from the original request. Order must be kept prior to signing the request. 070 AuthUtils.removeAuthenticationParameters(request.getParams()); 071 072 GigyaLogger.debug(LOG_TAG, "sign: offset for signer = " + _config.getServerOffset()); 073 074 // Add authentication parameters. Get SDK Config request is an exception. 075 if (_sessionService.isValid() && !request.isAnonymous()) { 076 final String sessionToken = _sessionService.getSession().getSessionToken(); 077 request.getParams().put("oauth_token", sessionToken); 078 final String sessionSecret = _sessionService.getSession().getSessionSecret(); 079 AuthUtils.addAuthenticationParameters( 080 sessionSecret, 081 request.getMethod().intValue(), 082 UrlUtils.getBaseUrl(request.getApi(), _config.getApiDomain()), 083 request.getParams(), 084 _config.getServerOffset()); 085 } else { 086 request.getParams().put("apiKey", _config.getApiKey()); 087 } 088 089 GigyaLogger.debug(LOG_TAG, "sign: request parameters:\n" + request.getParams().toString()); 090 091 // Encode url & generate encoded parameters. 092 final String encodedParams = UrlUtils.buildEncodedQuery(request.getParams()); 093 final String url = UrlUtils.getBaseUrl(request.getApi(), 094 _config.getApiDomain()) + (request.getMethod() == RestAdapter.HttpMethod.GET ? "?" + encodedParams : ""); 095 096 // Return a new instance of a signed REST request. 097 return new GigyaApiHttpRequest(request.getMethod(), url, encodedParams); 098 } 099}