package com.arcao.trackables.geocaching.oauth.services; import org.apache.commons.io.IOUtils; import org.scribe.exceptions.OAuthConnectionException; import org.scribe.services.TimestampServiceImpl; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URI; import java.util.Date; import java.util.Random; import timber.log.Timber; public class ServerTimestampServiceImpl extends TimestampServiceImpl { private final Random rand = new Random(); private final long ts; public ServerTimestampServiceImpl(URI uri) { ts = getServerDate(uri).getTime() / 1000; } @Override public String getTimestampInSeconds() { return String.valueOf(ts); } @Override public String getNonce() { return String.valueOf(ts + rand.nextInt()); } private static Date getServerDate(URI uri) { InputStream is = null; try { Timber.i("Getting server time from url: " + uri); HttpURLConnection c = (HttpURLConnection) uri.toURL().openConnection(); c.setRequestMethod("GET"); c.connect(); if (c.getResponseCode() == HttpURLConnection.HTTP_OK) { long date = c.getDate(); is = c.getInputStream(); Timber.i("Response: " + IOUtils.toString(is)); if (date > 0) { Date time = new Date(date); Timber.i("We got time: " + time); return time; } } } catch (IOException e) { throw new OAuthConnectionException(e); } finally { IOUtils.closeQuietly(is); } Timber.e("No Date header found in a response, used device time instead."); return new Date(); } }