package org.witness.informacam.app; import info.guardianproject.netcipher.proxy.OrbotHelper; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.ArrayList; import java.util.Enumeration; import org.apache.http.conn.util.InetAddressUtils; import org.jcodec.common.IOUtils; import org.witness.informacam.share.WebShareService; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.Button; import android.widget.CheckBox; import android.widget.TextView; public class RemoteShareActivity extends Activity { private boolean mEnableServer = false; private TextView mTvInfo = null; private CheckBox mCbOnionShare = null; private Button btnActivate = null; private Button btnShare= null; private String mLocalHost = null; private int mLocalPort = 9999; private String mOnionHost = null; private String[] mMediaList = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(PreferenceManager.getDefaultSharedPreferences(this).getBoolean("prefBlockScreenshots", false)) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); } setContentView(R.layout.activity_remote_share); setTitle(R.string.web_sharing); getActionBar().setIcon(R.drawable.ic_action_backup); getActionBar().setDisplayHomeAsUpEnabled(true); if (getIntent().hasExtra("medialist")) mMediaList = getIntent().getStringArrayExtra("medialist"); mTvInfo = (TextView)findViewById(R.id.tvInfo); mCbOnionShare = (CheckBox) findViewById(R.id.cbOnionShare); btnShare = (Button)findViewById(R.id.buttonShare); btnShare.setOnClickListener(new OnClickListener () { @Override public void onClick(View v) { shareWebAddress(); } }); btnActivate = (Button)findViewById(R.id.buttonService); btnActivate.setOnClickListener(new OnClickListener () { @Override public void onClick(View v) { mEnableServer = !mEnableServer; try { manageRemoteAccess(mEnableServer); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); mEnableServer = WebShareService.isRunning(); mOnionHost = WebShareService.getOnionSite(); showStatusMessage (); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; default: return super.onOptionsItemSelected(item); } } @Override protected void onResume() { super.onResume(); if (getIntent().hasExtra("medialist")) mMediaList = getIntent().getStringArrayExtra("medialist"); if (mConnectivityMonitor == null) mConnectivityMonitor= new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intentChange) { initLocalHost (); } }; registerReceiver( mConnectivityMonitor, new IntentFilter( ConnectivityManager.CONNECTIVITY_ACTION)); } @Override protected void onPause() { super.onPause(); unregisterReceiver(mConnectivityMonitor); } private void initLocalHost () { ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); if (cm != null && cm.getActiveNetworkInfo() != null) { int networkType = cm.getActiveNetworkInfo().getType(); if (networkType == ConnectivityManager.TYPE_WIFI) { mLocalHost = null; //don't set a local host for web share server, so that it binds to public IP } else if (mCbOnionShare.isChecked()) { mLocalHost = "127.0.0.1";//use local host for 3G/4G etc, since we are only sharing via Tor Hidden Service } else { mLocalHost = getLocalIpAddresses()[0]; } } } private BroadcastReceiver mConnectivityMonitor; private void manageRemoteAccess (boolean enableService) throws IOException { if (enableService) { initWebApp (); initLocalHost (); Intent intent = new Intent(this, WebShareService.class); intent.setAction(WebShareService.ACTION_SERVER_START); if (mLocalHost != null) intent.putExtra("host", mLocalHost); intent.putExtra("port", mLocalPort); if (mMediaList != null) intent.putExtra("medialist", mMediaList); startService(intent); if (mCbOnionShare.isChecked()) initOnionSite(); } else { Intent intent = new Intent(this, WebShareService.class); intent.setAction(WebShareService.ACTION_SERVER_STOP); startService(intent); } showStatusMessage (); } private void initWebApp () throws IOException { InputStream is = getResources().openRawResource(R.raw.style); OutputStream os = new info.guardianproject.iocipher.FileOutputStream("/style.css"); IOUtils.copy(is, os); } private void initOnionSite () { if (OrbotHelper.isOrbotInstalled(this)) { OrbotHelper.requestStartTor(this); if (mOnionHost == null) OrbotHelper.requestHiddenServiceOnPort(this, mLocalPort); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && data != null) { mOnionHost = data.getStringExtra("hs_host"); WebShareService.setOnionSite(mOnionHost); showStatusMessage(); } } private void shareWebAddress () { if (mEnableServer) { String shareUrl = null; if (mOnionHost != null) { shareUrl = "http://" + mOnionHost + ":" + mLocalPort; } else if (mLocalHost != null) { shareUrl = "http://" + mLocalHost + ":" + mLocalPort; } else { shareUrl = "http://" + getLocalIpAddresses()[0] + ":" + mLocalPort; } Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.you_can_access_my_camerav_photos_and_videos_here_) + shareUrl); sendIntent.setType("text/plain"); startActivity(sendIntent); } } private void showStatusMessage () { StringBuffer sbInfo = new StringBuffer(); if (mEnableServer) { sbInfo.append(getString(R.string.remote_web_access_enabled_at)).append("\n"); sbInfo.append("http://" + mLocalHost + ":" + mLocalPort + "\n"); if (mOnionHost != null) sbInfo.append("\n\nOnionShare (Tor):\n").append("http://" + mOnionHost + ":" + mLocalPort); btnActivate.setText(R.string.deactivate_web_share); btnShare.setEnabled(true); if (mOnionHost != null) mCbOnionShare.setChecked(true); } else { sbInfo.append(getString(R.string.remote_web_access_disabled)); btnActivate.setText(R.string.activate_web_share); btnShare.setEnabled(false); } mTvInfo.setText(sbInfo.toString()); } public static String[] getLocalIpAddresses(){ try { ArrayList<String> alAddresses = new ArrayList<String>(); for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()&& InetAddressUtils.isIPv4Address(inetAddress.getHostAddress())) { alAddresses.add(inetAddress.getHostAddress()); } } } return alAddresses.toArray(new String[alAddresses.size()]); } catch (Exception ex) { Log.e("IP Address", ex.toString()); } return null; } }