aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/cgOAuth.java
blob: b5fcc9888a7eb44d6e237b6bef777e9f23712f5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package cgeo.geocaching;

import cgeo.geocaching.utils.CryptUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class cgOAuth {
    public static String signOAuth(String host, String path, String method, boolean https, Map<String, String> params, String token, String tokenSecret) {
        String paramsDone = "";
        if (method.equalsIgnoreCase("GET") == false && method.equalsIgnoreCase("POST") == false) {
            method = "POST";
        } else {
            method = method.toUpperCase();
        }

        if (token == null)
            token = "";
        if (tokenSecret == null)
            tokenSecret = "";

        long currentTime = new Date().getTime(); // miliseconds
        currentTime = currentTime / 1000; // seconds
        currentTime = (long) Math.floor(currentTime);

        params.put("oauth_consumer_key", cgSettings.keyConsumerPublic);
        params.put("oauth_nonce", CryptUtils.md5(Long.toString(System.currentTimeMillis())));
        params.put("oauth_signature_method", "HMAC-SHA1");
        params.put("oauth_timestamp", Long.toString(currentTime));
        params.put("oauth_token", token);
        params.put("oauth_version", "1.0");

        String[] keys = new String[params.keySet().size()];
        params.keySet().toArray(keys);
        Arrays.sort(keys);

        List<String> paramsEncoded = new ArrayList<String>();
        for (String key : keys) {
            String value = params.get(key);
            paramsEncoded.add(key + "=" + cgBase.urlencode_rfc3986(value));
        }

        String keysPacked;
        String requestPacked;

        keysPacked = cgSettings.keyConsumerSecret + "&" + tokenSecret; // both even if empty some of them!
        if (https)
            requestPacked = method + "&" + cgBase.urlencode_rfc3986("https://" + host + path) + "&" + cgBase.urlencode_rfc3986(cgBase.implode("&", paramsEncoded.toArray()));
        else
            requestPacked = method + "&" + cgBase.urlencode_rfc3986("http://" + host + path) + "&" + cgBase.urlencode_rfc3986(cgBase.implode("&", paramsEncoded.toArray()));
        paramsEncoded.add("oauth_signature=" + cgBase.urlencode_rfc3986(cgBase.base64Encode(CryptUtils.hashHmac(requestPacked, keysPacked))));

        paramsDone = cgBase.implode("&", paramsEncoded.toArray());

        return paramsDone;
    }
}