package io.scal.secureshareui.login; import info.guardianproject.netcipher.proxy.OrbotHelper; import timber.log.Timber; import io.scal.secureshareui.controller.SiteController; import io.scal.secureshareui.lib.Util; import io.scal.secureshareuilibrary.R; import java.io.File; import java.net.InetSocketAddress; import java.net.Proxy; import android.app.Activity; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.util.Log; import com.flickr.api.Flickr; import com.flickr.api.FlickrException; import com.flickr.api.FlickrProperties; public class FlickrLoginActivity extends LockableActivity { private static final String TAG = "FlickrLoginActivity"; private int mAccessResult = RESULT_CANCELED; private String mAccessToken = null; private String mAccessVerifier = null; private int CODE = 0; Flickr f = null; String url = null; String key; String secret; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Timber.d("onCreate()"); key = getString(R.string.flickr_key); secret = getString(R.string.flickr_secret); setContentView(R.layout.activity_flickr_login); GetAuthorizationUrlTask gauTask = new GetAuthorizationUrlTask(this); gauTask.execute(); } class GetAuthorizationUrlTask extends AsyncTask<String, String, String> { private FlickrLoginActivity fla; public GetAuthorizationUrlTask(FlickrLoginActivity fla) { this.fla = fla; } @Override protected String doInBackground(String... params) { String result = fla.getAuthorizationUrl(); return result; } protected void onPostExecute(String result) { fla.startFlickrWebActivity(); } } public String getAuthorizationUrl() { String path = Environment.getExternalStorageDirectory() + File.separator + "flickr.conf"; Timber.d("getAuthorizationUrl() path: " + path); File confFile = new File(path); FlickrProperties fProps = new FlickrProperties(confFile); f = new Flickr(key, // key secret, // secret "http://localhost/callback", // callback "delete", // permissions ("delete" permission allows read/write/delete) fProps); // properties if(OrbotHelper.isOrbotRunning(this)) { Timber.d("orbot running, setting proxy"); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(Util.ORBOT_HOST, Util.ORBOT_HTTP_PORT)); f.setProxy(proxy); } else { Timber.d("orbot not running, proxy not set"); } url = f.getAuthorizationUrl(); return url; } public void startFlickrWebActivity() { Timber.d("startFlickrWebActivity() url: " + url); Intent i = new Intent(this, FlickrWebActivity.class); i.putExtra("authURL", url); startActivityForResult(i, CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Timber.d("onActivityResult()"); if (requestCode == CODE) { if (resultCode == Activity.RESULT_OK) { Bundle results = data.getExtras(); mAccessToken = results.getString("token"); mAccessVerifier = results.getString("verifier"); if ((mAccessToken != null) && (mAccessVerifier != null)) { Timber.d("got token and verifier"); mAccessResult = RESULT_OK; VerifyTokenTask vtTask = new VerifyTokenTask(this); vtTask.execute(); } else { Timber.e("failed to get token and verifier"); } } else if (resultCode == Activity.RESULT_CANCELED) { Timber.e("activity cancelled"); } else { Timber.e("unexpected result"); } } else { Timber.e("unexpected request"); } } class VerifyTokenTask extends AsyncTask<String, String, String> { private FlickrLoginActivity fla; public VerifyTokenTask(FlickrLoginActivity fla) { this.fla = fla; } @Override protected String doInBackground(String... params) { fla.verifyToken(); return "foo"; } protected void onPostExecute(String result) { fla.finish(); } } public void verifyToken() { Timber.d("verifyToken()"); try { f.verifyToken(mAccessVerifier, mAccessToken); } catch (FlickrException fe) { mAccessResult = RESULT_OK; Timber.e("token verification failed: " + fe.getMessage()); } } @Override public void finish() { Timber.d("finish()"); Intent data = new Intent(); data.putExtra(SiteController.EXTRAS_KEY_CREDENTIALS, mAccessToken); // WHAT ABOUT VERIFIER? setResult(mAccessResult, data); super.finish(); } }