Changeset 5695

Show
Ignore:
Timestamp:
08/15/12 15:31:51 (7 years ago)
Author:
justinc
Message:

final fixes to the Android installer.

Location:
seattle/trunk/dist/android/SeattleOnAndroid
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • seattle/trunk/dist/android/SeattleOnAndroid/AndroidManifest.xml

    r5652 r5695  
    22<manifest 
    33        package="com.seattleonandroid" 
    4         android:versionCode="1" 
     4        android:versionCode="3" 
    55        android:versionName="1.0" 
    66        xmlns:android="http://schemas.android.com/apk/res/android"> 
  • seattle/trunk/dist/android/SeattleOnAndroid/res/layout/install.xml

    r5678 r5695  
    11<?xml version="1.0" encoding="utf-8"?> 
     2<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     3        android:layout_width="fill_parent" 
     4        android:layout_height="wrap_content" 
     5        android:fillViewport="true" > 
    26<RelativeLayout 
    37        xmlns:android="http://schemas.android.com/apk/res/android" 
     
    610        android:orientation="vertical" 
    711        android:id="@+id/root1"     > 
    8            <LinearLayout 
    9                 android:id="@+id/buttons" 
    10                 android:orientation="horizontal" 
    11                 android:layout_width="fill_parent" 
    12                 android:layout_height="wrap_content" 
    13                 android:layout_alignParentBottom="true" 
    14             > 
    15                         <Button android:text="Hide advanced options" android:id="@+id/showbasicoptionsbutton" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
    16                 
    17             </LinearLayout> 
    18 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    19         android:layout_width="fill_parent" 
    20         android:layout_height="wrap_content" 
    21         android:fillViewport="true" > 
    2212        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    2313                android:orientation="vertical" 
     
    5545                    android:textAppearance="?android:attr/textAppearanceSmall" 
    5646                    android:textSize="16sp" > 
    57 </TextView> 
     47                </TextView> 
     48 
     49                <TextView 
     50                    android:id="@+id/downloadview" 
     51                    android:layout_width="wrap_content" 
     52                    android:layout_height="wrap_content" 
     53                    android:text="URL: " 
     54                    android:textAppearance="?android:attr/textAppearanceSmall" 
     55                    android:textSize="16sp" > 
     56                </TextView> 
    5857 
    5958                <CheckBox 
     
    108107                    android:textSize="15sp" /> 
    109108 
     109                <View android:layout_width="fill_parent" android:layout_height="10dp"/> 
     110 
     111                <LinearLayout 
     112                    android:id="@+id/buttons" 
     113                    android:orientation="horizontal" 
     114                    android:layout_width="fill_parent" 
     115                    android:layout_height="wrap_content" 
     116                    android:layout_alignParentBottom="true"> 
     117 
     118                        <Button android:text="Hide advanced options" android:id="@+id/showbasicoptionsbutton" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
     119 
     120                </LinearLayout> 
    110121        </LinearLayout> 
     122</RelativeLayout> 
    111123</ScrollView> 
    112 </RelativeLayout> 
  • seattle/trunk/dist/android/SeattleOnAndroid/src/com/seattleonandroid/Common.java

    r5681 r5695  
    33// Contains common constants  
    44public final class Common { 
     5        // Default download URL for seattle archive 
     6        public static final String DEFAULT_DOWNLOAD_URL = "https://seattlegeni.cs.washington.edu/geni/download/defaultandroid/seattle_win.zip"; 
     7 
     8        // Trusted hostnames 
     9        public static final String[] TRUSTED_DOWNLOAD_HOSTNAMES_WHITELIST = { 
     10                "seattlegeni.cs.washington.edu", "betabox.cs.washington.edu", "seattleclearinghouse.poly.edu", 
     11                "betaseattleclearinghouse.poly.edu", "blackbox.cs.washington.edu", "blackbox.poly.edu" 
     12        }; 
     13 
     14        // Log -- Tag 
    515        public static final String LOG_TAG = "SeattleOnAndroid"; 
    616 
     
    2030        public static final String LOG_EXCEPTION_UNZIPPING_FILE = "Exception occured while extracting archive: "; 
    2131        public static final String LOG_EXCEPTION_UNZIPPING_ARCHIVE = "Exception occured while extracting file: "; 
     32        public static final String LOG_EXCEPTION_DOWNLOAD_UNKNOWN_ERROR = "Unknown exception occured during or before download"; 
     33        public static final String LOG_EXCEPTION_UNTRUSTED_HOST = "Untrusted host (host not on whitelist)"; 
    2234 
    2335        // Log -- Informative 
     
    4557        public static final String LOG_INFO_UNINSTALL_INITIATED = "Seattle uninstall initiated by user"; 
    4658        public static final String LOG_INFO_UNINSTALL_SUCCESS = "Seattle uninstalled successfully"; 
     59        public static final String LOG_INFO_UNTRUSTED_HOST_CHECK_WHITELIST_OK = "Hostname ok (is on whitelist)."; 
    4760 
    4861        // Log -- Verbose info 
  • seattle/trunk/dist/android/SeattleOnAndroid/src/com/seattleonandroid/InstallerService.java

    r5681 r5695  
    5454import java.util.Map; 
    5555 
     56import javax.net.ssl.HostnameVerifier; 
     57import javax.net.ssl.HttpsURLConnection; 
     58import javax.net.ssl.SSLContext; 
     59import javax.net.ssl.X509TrustManager; 
     60import java.security.SecureRandom; 
     61import javax.net.ssl.SSLSession; 
     62import java.security.cert.CertificateException; 
     63import java.security.cert.X509Certificate; 
     64import javax.net.ssl.SSLSocketFactory; 
     65import javax.net.ssl.SSLException; 
    5666/** 
    5767 *  
     
    160170                                archive.delete(); 
    161171                 
    162                                 String user_hash = ReferralReceiver.retrieveReferralParams(s.getApplicationContext()).get("utm_content"); 
    163                                 if (user_hash == null) 
    164                                         user_hash = "flibble"; 
    165                                  
     172                                //String user_hash = ReferralReceiver.retrieveReferralParams(s.getApplicationContext()).get("utm_content"); 
     173                                //if (user_hash == null) 
     174                                //      user_hash = "flibble"; 
     175                                 
     176                                String DownloadURLString = ReferralReceiver.retrieveReferralParams(s.getApplicationContext()).get("utm_source"); 
     177                                if (DownloadURLString == null) 
     178                                        DownloadURLString = Common.DEFAULT_DOWNLOAD_URL; 
     179 
    166180                                try { 
    167                                         URL url = new URL("https://seattlegeni.cs.washington.edu/geni/download/"+user_hash+"/seattle_win.zip"); 
     181                                        //URL url = new URL("https://seattlegeni.cs.washington.edu/geni/download/"+user_hash+"/seattle_win.zip"); 
     182                                        URL url = new URL(DownloadURLString); 
    168183                                        Log.i(Common.LOG_TAG, Common.LOG_INFO_DOWNLOADING_FROM + url.toString()); 
    169                                         URLConnection ucon = url.openConnection(); 
    170                                         InputStream is = ucon.getInputStream(); 
     184 
     185                                        URLConnection ucon; 
     186                                        InputStream is; 
     187 
     188                                        if (url.getProtocol().compareTo("https") == 0) { 
     189                                                // https host 
     190                                                // 
     191                                                // REQUIRES REVIEW -- POSSIBLE SECURITY FLAW 
     192                                                // 
     193                                                // a host is trusted only if it is on the whitelist. the certificates and co. are not checked. 
     194                                                // 
     195                                                HostnameVerifier oldHV = HttpsURLConnection.getDefaultHostnameVerifier(); 
     196                                                HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {  
     197                                                        public boolean verify(String hostname, SSLSession session) {  
     198                                                                Log.i(Common.LOG_TAG, hostname);                                                         
     199                                                                for (String trustedHostname : Common.TRUSTED_DOWNLOAD_HOSTNAMES_WHITELIST) { 
     200                                                                        if (trustedHostname.compareTo(hostname) == 0) { 
     201                                                                                // Host on whitelist --> trust 
     202                                                                                Log.i(Common.LOG_TAG, Common.LOG_INFO_UNTRUSTED_HOST_CHECK_WHITELIST_OK); 
     203                                                                                return true; 
     204                                                                        } 
     205                                                                }; 
     206                                                                return false; 
     207                                                }}); 
     208                                                SSLContext sslContext = SSLContext.getInstance("TLS"); 
     209                                                sslContext.init(null, new X509TrustManager[] { 
     210                                                        new X509TrustManager(){  
     211                                                                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException, IllegalArgumentException {}  
     212                                                                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException, IllegalArgumentException {}  
     213                                                                public X509Certificate[] getAcceptedIssuers() {  
     214                                                                        return new X509Certificate[0]; 
     215                                                                } 
     216                                                        } 
     217                                                }, new SecureRandom()); 
     218                                                SSLSocketFactory oldSSF = HttpsURLConnection.getDefaultSSLSocketFactory(); 
     219                                                HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); 
     220                                                ucon = url.openConnection(); 
     221                                                is = ucon.getInputStream(); 
     222                                                HttpsURLConnection.setDefaultHostnameVerifier(oldHV); 
     223                                                HttpsURLConnection.setDefaultSSLSocketFactory(oldSSF); 
     224                                        } else { 
     225                                                // non-https host 
     226                                                // the host is trusted in case its hostname is on the whitelist 
     227                                                boolean trusted = false; 
     228                                                for (String trustedHostname : Common.TRUSTED_DOWNLOAD_HOSTNAMES_WHITELIST) { 
     229                                                        if (trustedHostname.compareTo(url.getHost()) == 0) { 
     230                                                                // Host on whitelist --> trust 
     231                                                                trusted = true; 
     232                                                        } 
     233                                                }; 
     234                                                if (!trusted) { 
     235                                                        // hostname not on whitelist, abort installation 
     236                                                        Log.e(Common.LOG_TAG, Common.LOG_EXCEPTION_UNTRUSTED_HOST); 
     237                                                        throw new Exception("Untrusted host."); 
     238                                                } 
     239                                                Log.i(Common.LOG_TAG, Common.LOG_INFO_UNTRUSTED_HOST_CHECK_WHITELIST_OK); 
     240                                                ucon = url.openConnection(); 
     241                                                is = ucon.getInputStream(); 
     242                                        } 
     243                                        //InputStream is = ucon.getInputStream(); 
    171244                                        BufferedInputStream bis = new BufferedInputStream(is); 
    172245                                        FileOutputStream fos = new FileOutputStream(archive); 
     
    180253                                        bis.close(); 
    181254                                        fos.close(); 
     255                                } catch (SSLException e) { 
     256                                        Log.e(Common.LOG_TAG, Common.LOG_EXCEPTION_UNTRUSTED_HOST, e);                                   
     257                                        instance = null; 
     258                                        ScriptActivity.handler.sendEmptyMessage(ScriptActivity.INSTALL_FAILED); 
     259                                        // Stop service 
     260                                        stopSelf(startId); 
     261                                        return; 
    182262                                } catch (MalformedURLException e) { 
    183263                                        Log.e(Common.LOG_TAG, Common.LOG_EXCEPTION_MALFORMED_URL, e);                                    
     
    196276                                } catch (IOException e) { 
    197277                                        Log.e(Common.LOG_TAG, Common.LOG_EXCEPTION_DOWNLOAD_ERROR, e);                   
     278                                        instance = null; 
     279                                        ScriptActivity.handler.sendEmptyMessage(ScriptActivity.INSTALL_FAILED); 
     280                                        // Stop service 
     281                                        stopSelf(startId); 
     282                                        return;                                  
     283                                } catch (Exception e) { 
     284                                        Log.e(Common.LOG_TAG, Common.LOG_EXCEPTION_DOWNLOAD_UNKNOWN_ERROR, e);                   
    198285                                        instance = null; 
    199286                                        ScriptActivity.handler.sendEmptyMessage(ScriptActivity.INSTALL_FAILED); 
  • seattle/trunk/dist/android/SeattleOnAndroid/src/com/seattleonandroid/ReferralReceiver.java

    r5681 r5695  
    3737        } 
    3838  
     39        Log.i(Common.LOG_TAG, "Refrec started"); 
    3940        Map<String, String> referralParams = new HashMap<String, String>(); 
    4041  
     
    4445        } 
    4546  
     47        Log.i(Common.LOG_TAG, "Refrec right intent"); 
    4648        String referrer = intent.getStringExtra("referrer"); //$NON-NLS-1$ 
    4749        if( referrer == null || referrer.length() == 0) { 
    4850            return; 
    4951        } 
    50   
     52        Log.d(Common.LOG_TAG, "Refrec referrer"); 
     53 
    5154        try 
    5255        {    // Remove any url encoding 
     
    5457        } 
    5558        catch (UnsupportedEncodingException e) { return; } 
    56   
     59        Log.i(Common.LOG_TAG, "Refrec right encoding"); 
     60 
    5761        // Parse the query string, extracting the relevant data 
    5862        String[] params = referrer.split("&"); // $NON-NLS-1$ 
     
    6468  
    6569        ReferralReceiver.storeReferralParams(context, referralParams); 
     70        Log.i(Common.LOG_TAG, "Refrec params added"); 
    6671    } 
    6772  
  • seattle/trunk/dist/android/SeattleOnAndroid/src/com/seattleonandroid/ScriptActivity.java

    r5681 r5695  
    560560                referrerView.setText(referrer); 
    561561                 
     562                String DownloadURLString = ReferralReceiver.retrieveReferralParams(getApplicationContext()).get("utm_source"); 
     563                if (DownloadURLString == null) 
     564                        DownloadURLString = Common.DEFAULT_DOWNLOAD_URL; 
     565                final TextView downloadView = (TextView) findViewById(R.id.downloadview); 
     566                downloadView.setText("URL: "+DownloadURLString); 
     567 
    562568                // If donation was not yet set, default to DEFAULT_DONATE 
    563569                if (donate == -1)