From: masensio Date: Mon, 10 Mar 2014 10:08:42 +0000 (+0100) Subject: Merge branch 'develop' into check_server_certificates_in_SSO_webview X-Git-Tag: oc-android-1.5.5~15^2~5 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/101cbbe492469265603145640835e244d6e2949a?ds=inline;hp=-c Merge branch 'develop' into check_server_certificates_in_SSO_webview --- 101cbbe492469265603145640835e244d6e2949a diff --combined res/values/setup.xml index de70e350,932612ea..325e2f1c --- a/res/values/setup.xml +++ b/res/values/setup.xml @@@ -11,7 -11,7 +11,7 @@@ ownCloud - + https://test1.owncloud.com/oc6-shib true true "https://owncloud.com/mobile/new" @@@ -19,8 -19,12 +19,12 @@@ off - off + on + + on + + #FFFFFF #FFFFFF diff --combined res/values/strings.xml index 37a97fec,60e4ecab..829b4bba --- a/res/values/strings.xml +++ b/res/values/strings.xml @@@ -215,8 -215,6 +215,8 @@@ To: Signature: Algorithm: + The certificate could not be shown. + - No information about the error This is a placeholder placeholder.txt @@@ -255,6 -253,8 +255,8 @@@ Unable to unshare this file or folder. It does not exist. An error occurred while trying to unshare this file or folder + Send + Copy link Copied to clipboard diff --combined src/com/owncloud/android/authentication/SsoWebViewClient.java index e498d0d8,442ec73d..89f66ef2 --- a/src/com/owncloud/android/authentication/SsoWebViewClient.java +++ b/src/com/owncloud/android/authentication/SsoWebViewClient.java @@@ -17,30 -17,14 +17,27 @@@ package com.owncloud.android.authentication; +import java.io.ByteArrayInputStream; import java.lang.ref.WeakReference; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import com.owncloud.android.lib.common.network.NetworkUtils; +import com.actionbarsherlock.app.SherlockFragmentActivity; - import com.owncloud.android.R; - import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; +import com.owncloud.android.ui.dialog.SslUntrustedCertDialogABSTRACT; - import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener; import com.owncloud.android.utils.Log_OC; +import android.content.Context; import android.graphics.Bitmap; +import android.net.http.SslCertificate; import android.net.http.SslError; +import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; import android.view.KeyEvent; import android.view.View; import android.webkit.CookieManager; @@@ -68,14 -52,12 +65,14 @@@ public class SsoWebViewClient extends W public void onSsoFinished(String sessionCookie); } + private Context mContext; private Handler mListenerHandler; private WeakReference mListenerRef; private String mTargetUrl; private String mLastReloadedUrlAtError; - public SsoWebViewClient (Handler listenerHandler, SsoWebViewClientListener listener) { + public SsoWebViewClient (Context context, Handler listenerHandler, SsoWebViewClientListener listener) { + mContext = context; mListenerHandler = listenerHandler; mListenerRef = new WeakReference(listener); mTargetUrl = "fake://url.to.be.set"; @@@ -153,59 -135,9 +150,59 @@@ } @Override - public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { + public void onReceivedSslError (final WebView view, final SslErrorHandler handler, SslError error) { Log_OC.d(TAG, "onReceivedSslError : " + error); - handler.proceed(); + // Test 1 + X509Certificate x509Certificate = getX509CertificateFromError(error); + boolean isKnownServer = false; + + if (x509Certificate != null) { + Log_OC.d(TAG, "------>>>>> x509Certificate " + x509Certificate.toString()); + + try { + isKnownServer = NetworkUtils.isCertInKnownServersStore((Certificate) x509Certificate, mContext); + } catch (Exception e) { + Log_OC.e(TAG, "Exception: " + e.getMessage()); + } + } + + if (isKnownServer) { + handler.proceed(); + } else if (x509Certificate != null) { + // Show a dialog with the certificate info + ((AuthenticatorActivity)mContext).showUntrustedCertDialog(x509Certificate, error); + handler.cancel(); + } else { + // Show a dialog with the certificate information available in SslError (not full) + SslUntrustedCertDialogABSTRACT dialog = SslUntrustedCertDialogABSTRACT.newInstanceForEmptySslError(error, handler); + FragmentManager fm = ((SherlockFragmentActivity)mContext).getSupportFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + dialog.show(ft, AuthenticatorActivity.DIALOG_UNTRUSTED_CERT); + // let's forward the handler, and see what happens... + } + } + + /** + * Obtain the X509Certificate from SslError + * @param error SslError + * @return X509Certificate from error + */ + public X509Certificate getX509CertificateFromError (SslError error) { + Bundle bundle = SslCertificate.saveState(error.getCertificate()); + X509Certificate x509Certificate; + byte[] bytes = bundle.getByteArray("x509-certificate"); + if (bytes == null) { + x509Certificate = null; + } else { + try { + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes)); + x509Certificate = (X509Certificate) cert; + } catch (CertificateException e) { + x509Certificate = null; + } + } + return x509Certificate; } @Override diff --combined src/com/owncloud/android/syncadapter/FileSyncAdapter.java index fe6c7c74,fe6c7c74..4f1cd68a --- a/src/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/com/owncloud/android/syncadapter/FileSyncAdapter.java @@@ -30,7 -30,7 +30,6 @@@ import com.owncloud.android.R import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; --import com.owncloud.android.lib.common.accounts.AccountUtils.Constants; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.operations.SynchronizeFolderOperation; import com.owncloud.android.operations.UpdateOCVersionOperation; @@@ -41,7 -41,7 +40,6 @@@ import com.owncloud.android.utils.Log_O import android.accounts.Account; --import android.accounts.AccountManager; import android.accounts.AccountsException; import android.app.Notification; import android.app.NotificationManager; diff --combined src/com/owncloud/android/ui/activity/CopyToClipboardActivity.java index 7c546412,7c546412..b503c379 --- a/src/com/owncloud/android/ui/activity/CopyToClipboardActivity.java +++ b/src/com/owncloud/android/ui/activity/CopyToClipboardActivity.java @@@ -22,7 -22,7 +22,6 @@@ import com.owncloud.android.R import android.app.Activity; import android.content.ClipData; import android.content.Intent; --import android.os.Build; import android.os.Bundle; import android.text.ClipboardManager; import android.widget.Toast; diff --combined src/com/owncloud/android/ui/activity/FileDisplayActivity.java index cf43c6ad,0293314f..e246c4fd --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@@ -19,6 -19,7 +19,6 @@@ package com.owncloud.android.ui.activity; import java.io.File; - import android.accounts.Account; import android.app.AlertDialog; import android.app.Dialog; @@@ -33,6 -34,7 +33,6 @@@ import android.content.IntentFilter import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.SyncRequest; -import android.content.res.Configuration; import android.content.res.Resources.NotFoundException; import android.database.Cursor; import android.net.Uri; @@@ -41,7 -43,6 +41,7 @@@ import android.os.IBinder import android.preference.PreferenceManager; import android.provider.MediaStore; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; //import android.support.v4.content.LocalBroadcastManager; import android.util.Log; @@@ -79,9 -80,9 +79,9 @@@ import com.owncloud.android.operations. import com.owncloud.android.services.OperationsService; import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.ui.dialog.EditNameDialog; +import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener; -import com.owncloud.android.ui.dialog.SslValidatorDialog; -import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener; +import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener; import com.owncloud.android.ui.fragment.FileDetailFragment; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.ui.fragment.OCFileListFragment; @@@ -100,7 -101,7 +100,7 @@@ import com.owncloud.android.utils.Log_O */ public class FileDisplayActivity extends HookActivity implements -OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslValidatorListener, EditNameDialogListener { +OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslUntrustedCertListener, EditNameDialogListener { private ArrayAdapter mDirectories; @@@ -120,11 -121,12 +120,12 @@@ private static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW"; private static final String KEY_SYNC_IN_PROGRESS = "SYNC_IN_PROGRESS"; //private static final String KEY_REFRESH_SHARES_IN_PROGRESS = "SHARES_IN_PROGRESS"; + private static final String KEY_WAITING_TO_SEND = "WAITING_TO_SEND"; public static final int DIALOG_SHORT_WAIT = 0; private static final int DIALOG_CHOOSE_UPLOAD_SOURCE = 1; - private static final int DIALOG_SSL_VALIDATOR = 2; - private static final int DIALOG_CERT_NOT_SAVED = 3; + //private static final int DIALOG_SSL_VALIDATOR = 2; + private static final int DIALOG_CERT_NOT_SAVED = 2; public static final String ACTION_DETAILS = "com.owncloud.android.ui.activity.action.DETAILS"; @@@ -141,7 -143,7 +142,9 @@@ private boolean mSyncInProgress = false; //private boolean mRefreshSharesInProgress = false; + private String DIALOG_UNTRUSTED_CERT; ++ + private OCFile mWaitingToSend; @Override protected void onCreate(Bundle savedInstanceState) { @@@ -173,11 -175,13 +176,13 @@@ mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW); mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS); //mRefreshSharesInProgress = savedInstanceState.getBoolean(KEY_REFRESH_SHARES_IN_PROGRESS); + mWaitingToSend = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND); } else { mWaitingToPreview = null; mSyncInProgress = false; //mRefreshSharesInProgress = false; + mWaitingToSend = null; } /// USER INTERFACE @@@ -220,7 -224,6 +225,6 @@@ unbindService(mUploadConnection); } - /** * Called when the ownCloud {@link Account} associated to the Activity was just updated. */ @@@ -668,6 -671,7 +672,7 @@@ outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW, mWaitingToPreview); outState.putBoolean(FileDisplayActivity.KEY_SYNC_IN_PROGRESS, mSyncInProgress); //outState.putBoolean(FileDisplayActivity.KEY_REFRESH_SHARES_IN_PROGRESS, mRefreshSharesInProgress); + outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND, mWaitingToSend); Log_OC.d(TAG, "onSaveInstanceState() end"); } @@@ -741,6 -745,14 +746,6 @@@ @Override - protected void onPrepareDialog(int id, Dialog dialog, Bundle args) { - if (id == DIALOG_SSL_VALIDATOR && mLastSslUntrustedServerResult != null) { - ((SslValidatorDialog)dialog).updateResult(mLastSslUntrustedServerResult); - } - } - - - @Override protected Dialog onCreateDialog(int id) { Dialog dialog = null; AlertDialog.Builder builder; @@@ -798,6 -810,10 +803,6 @@@ dialog = builder.create(); break; } - case DIALOG_SSL_VALIDATOR: { - dialog = SslValidatorDialog.newInstance(this, mLastSslUntrustedServerResult, this); - break; - } case DIALOG_CERT_NOT_SAVED: { builder = new AlertDialog.Builder(this); builder.setMessage(getResources().getString(R.string.ssl_validator_not_saved)); @@@ -966,6 -982,7 +971,6 @@@ if (synchResult != null) { if (synchResult.getCode().equals(RemoteOperationResult.ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED)) { mLastSslUntrustedServerResult = synchResult; - showDialog(DIALOG_SSL_VALIDATOR); } } } @@@ -1011,6 -1028,13 +1016,13 @@@ refreshSecondFragment(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false)); } + if (mWaitingToSend != null) { + mWaitingToSend = getStorageManager().getFileByPath(mWaitingToSend.getRemotePath()); // Update the file to send + if (mWaitingToSend.isDown()) { + sendDownloadedFile(); + } + } + removeStickyBroadcast(intent); } @@@ -1054,7 -1078,7 +1066,7 @@@ if ((getSharesResult != null) && RemoteOperationResult.ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED.equals(getSharesResult.getCode())) { mLastSslUntrustedServerResult = getSharesResult; - showDialog(DIALOG_SSL_VALIDATOR); + showUntrustedCertDialog(mLastSslUntrustedServerResult); } //setSupportProgressBarIndeterminateVisibility(mRefreshSharesInProgress || mSyncInProgress); @@@ -1397,7 -1421,7 +1409,7 @@@ msg.show(); if (result.isSslRecoverableException()) { mLastSslUntrustedServerResult = result; - showDialog(DIALOG_SSL_VALIDATOR); + showUntrustedCertDialog(mLastSslUntrustedServerResult); } } } @@@ -1464,7 -1488,7 +1476,7 @@@ msg.show(); if (result.isSslRecoverableException()) { mLastSslUntrustedServerResult = result; - showDialog(DIALOG_SSL_VALIDATOR); + showUntrustedCertDialog(mLastSslUntrustedServerResult); } } } @@@ -1589,34 -1613,35 +1601,64 @@@ mRefreshSharesInProgress = true; } */ + + /** + * Show untrusted cert dialog + */ + public void showUntrustedCertDialog(RemoteOperationResult result) { + // Show a dialog with the certificate info + SslUntrustedCertDialog dialog = SslUntrustedCertDialog.newInstance(result, this); + FragmentManager fm = getSupportFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + dialog.show(ft, DIALOG_UNTRUSTED_CERT); + + } + + /** + * Dismiss untrusted cert dialog + */ + public void dismissUntrustedCertDialog(){ + Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_UNTRUSTED_CERT); + if (frag != null) { + SslUntrustedCertDialog dialog = (SslUntrustedCertDialog) frag; + dialog.dismiss(); + } + } + + @Override + public void onCancelCertificate() { + // TODO Auto-generated method stub + + } + /** + * Requests the download of the received {@link OCFile} , updates the UI + * to monitor the download progress and prepares the activity to send the file + * when the download finishes. + * + * @param file {@link OCFile} to download and preview. + */ + @Override + public void startDownloadForSending(OCFile file) { + mWaitingToSend = file; + requestForDownload(mWaitingToSend); + boolean hasSecondFragment = (getSecondFragment()!= null); + updateFragmentsVisibility(hasSecondFragment); + } + + private void requestForDownload(OCFile file) { + Account account = getAccount(); + if (!mDownloaderBinder.isDownloading(account, file)) { + Intent i = new Intent(this, FileDownloader.class); + i.putExtra(FileDownloader.EXTRA_ACCOUNT, account); + i.putExtra(FileDownloader.EXTRA_FILE, file); + startService(i); + } + } + + private void sendDownloadedFile(){ + getFileOperationsHelper().sendDownloadedFile(mWaitingToSend, this); + mWaitingToSend = null; + } + } diff --combined src/com/owncloud/android/ui/preview/PreviewImageActivity.java index ece3991c,0da4fbc1..d7cc36d6 --- a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java @@@ -23,6 -23,7 +23,6 @@@ import android.content.Intent import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.SharedPreferences; -import android.content.res.Configuration; import android.os.Bundle; import android.os.IBinder; import android.preference.PreferenceManager; @@@ -245,7 -246,6 +245,6 @@@ public class PreviewImageActivity exten super.onDestroy(); } - @Override public boolean onOptionsItemSelected(MenuItem item) { boolean returnValue = false; diff --combined src/com/owncloud/android/ui/preview/PreviewVideoActivity.java index ba2c1eb7,48dc047c..c674e911 --- a/src/com/owncloud/android/ui/preview/PreviewVideoActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewVideoActivity.java @@@ -27,6 -27,7 +27,6 @@@ import android.accounts.Account import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; -import android.content.res.Configuration; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; @@@ -188,7 -189,6 +188,6 @@@ public class PreviewVideoActivity exten return true; } - @Override protected void onAccountSet(boolean stateWasRecovered) { super.onAccountSet(stateWasRecovered);