// // Copyright (c) 2014 VK.com // // Permission is hereby granted, free of charge, to any person obtaining a copy of // this software and associated documentation files (the "Software"), to deal in // the Software without restriction, including without limitation the rights to // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of // the Software, and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // package com.vk.sdk; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import com.vk.sdk.api.VKParameters; import com.vk.sdk.util.VKStringJoiner; import com.vk.sdk.util.VKUtil; import java.util.Map; /** * Presents VK API access token that used for loading API methods and other stuff. */ public class VKAccessToken { public static final String ACCESS_TOKEN = "access_token"; public static final String EXPIRES_IN = "expires_in"; public static final String USER_ID = "user_id"; public static final String SECRET = "secret"; public static final String HTTPS_REQUIRED = "https_required"; public static final String CREATED = "created"; public static final String SUCCESS = "success"; /** * String token for use in request parameters */ public String accessToken = null; /** * Time when token expires */ public int expiresIn = 0; /** * Current user id for this token */ public String userId = null; /** * User secret to sign requests (if nohttps used) */ public String secret = null; /** * If user sets "Always use HTTPS" setting in his profile, it will be true */ public boolean httpsRequired = false; /** * Indicates time of token creation */ public long created = 0; /** * Save token into specified file * * @param filePath path to file with saved token */ public void saveTokenToFile(String filePath) { VKUtil.stringToFile(filePath, serialize()); } /** * Save token into shared preferences with key * * @param ctx Context for preferences * @param tokenKey Key for saving settings */ public void saveTokenToSharedPreferences(Context ctx, String tokenKey) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); SharedPreferences.Editor edit = prefs.edit(); edit.putString(tokenKey, serialize()); edit.commit(); } /** * Removes token from preferences with specified key * @param ctx Context for preferences * @param tokenKey Key for saving settings */ public static void removeTokenAtKey(Context ctx, String tokenKey) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); SharedPreferences.Editor edit = prefs.edit(); edit.remove(tokenKey); edit.commit(); } private VKAccessToken() { } /** * Serialize token into string * * @return Serialized token string as query-string */ protected String serialize() { VKParameters params = new VKParameters(); params.put(ACCESS_TOKEN, accessToken); params.put(EXPIRES_IN, expiresIn); params.put(USER_ID, userId); params.put(CREATED, created); if (secret != null) { params.put(SECRET, secret); } if (httpsRequired) { params.put(HTTPS_REQUIRED, "1"); } return VKStringJoiner.joinParams(params); } /** * Retrieve token from key-value query string * * @param urlString string that contains URL-query part with token. E.g. access_token=eee&expires_in=0... * @return parsed token */ public static VKAccessToken tokenFromUrlString(String urlString) { if (urlString == null) return null; Map<String, String> parameters = VKUtil.explodeQueryString(urlString); return tokenFromParameters(parameters); } /** * Retrieve token from key-value map * * @param parameters map that contains token info * @return Parsed token */ public static VKAccessToken tokenFromParameters(Map<String, String> parameters) { if (parameters == null || parameters.size() == 0) return null; VKAccessToken token = new VKAccessToken(); try { token.accessToken = parameters.get(ACCESS_TOKEN); token.expiresIn = Integer.parseInt(parameters.get(EXPIRES_IN)); token.userId = parameters.get(USER_ID); token.secret = parameters.get(SECRET); token.httpsRequired = false; if (parameters.containsKey(HTTPS_REQUIRED)) { token.httpsRequired = parameters.get(HTTPS_REQUIRED).equals("1"); } else if (token.secret == null) { token.httpsRequired = true; } if (parameters.containsKey(CREATED)) { token.created = Long.parseLong(parameters.get(CREATED)); } else { token.created = System.currentTimeMillis(); } return token; } catch (Exception e) { return null; } } /** * Retrieves token from shared preferences * * @param ctx Context for preferences * @param key Key for retrieve token * @return Previously saved token or null */ public static VKAccessToken tokenFromSharedPreferences(Context ctx, String key) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); return tokenFromUrlString(prefs.getString(key, null)); } /** * Retrieve token from file. Token must be saved into file with saveTokenToFile method * * @param filePath path to file with saved token * @return Previously saved token or null */ public static VKAccessToken tokenFromFile(String filePath) { try { String data = VKUtil.fileToString(filePath); return tokenFromUrlString(data); } catch (Exception e) { return null; } } /** * Checks expiration time of token and returns result. * * @return true if token has expired, false otherwise. */ public boolean isExpired() { return expiresIn > 0 && expiresIn * 1000 + created < System.currentTimeMillis(); } }