Merge branch 'master' into v/multi-decrypt

This commit is contained in:
Vincent Breitmoser 2015-06-17 21:33:31 +02:00
commit 7f3154ecea
9 changed files with 101 additions and 79 deletions

View File

@ -411,13 +411,17 @@ public class ImportExportOperation extends BaseOperation {
try { try {
OutputStream outStream = new FileOutputStream(outputFile); OutputStream outStream = new FileOutputStream(outputFile);
ExportResult result = exportKeyRings(log, masterKeyIds, exportSecret, outStream); try {
if (result.cancelled()) { ExportResult result = exportKeyRings(log, masterKeyIds, exportSecret, outStream);
//noinspection ResultOfMethodCallIgnored if (result.cancelled()) {
new File(outputFile).delete(); //noinspection ResultOfMethodCallIgnored
new File(outputFile).delete();
}
return result;
} finally {
outStream.close();
} }
return result; } catch (IOException e) {
} catch (FileNotFoundException e) {
log.add(LogType.MSG_EXPORT_ERROR_FOPEN, 1); log.add(LogType.MSG_EXPORT_ERROR_FOPEN, 1);
return new ExportResult(ExportResult.RESULT_ERROR, log); return new ExportResult(ExportResult.RESULT_ERROR, log);
} }

View File

@ -391,10 +391,15 @@ public class KeychainDatabase extends SQLiteOpenHelper {
private static void copy(File in, File out) throws IOException { private static void copy(File in, File out) throws IOException {
FileInputStream is = new FileInputStream(in); FileInputStream is = new FileInputStream(in);
FileOutputStream os = new FileOutputStream(out); FileOutputStream os = new FileOutputStream(out);
byte[] buf = new byte[512]; try {
while (is.available() > 0) { byte[] buf = new byte[512];
int count = is.read(buf, 0, 512); while (is.available() > 0) {
os.write(buf, 0, count); int count = is.read(buf, 0, 512);
os.write(buf, 0, count);
}
} finally {
is.close();
os.close();
} }
} }

View File

@ -217,13 +217,15 @@ public class AppSettingsActivity extends BaseActivity {
// show accounts only if available (deprecated API) // show accounts only if available (deprecated API)
Cursor cursor = getContentResolver().query(accountsUri, null, null, null, null); Cursor cursor = getContentResolver().query(accountsUri, null, null, null, null);
if (cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) try {
mAccountsLabel.setVisibility(View.VISIBLE); mAccountsLabel.setVisibility(View.VISIBLE);
mAccountsListFragment = AccountsListFragment.newInstance(accountsUri); mAccountsListFragment = AccountsListFragment.newInstance(accountsUri);
// Create an instance of the fragments // Create an instance of the fragments
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.replace(R.id.api_accounts_list_fragment, mAccountsListFragment) .replace(R.id.api_accounts_list_fragment, mAccountsListFragment)
.commitAllowingStateLoss(); .commitAllowingStateLoss();
} finally {
cursor.close();
} }
// Create an instance of the fragments // Create an instance of the fragments

View File

@ -71,6 +71,7 @@ import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.adapter.KeyAdapter; import org.sufficientlysecure.keychain.ui.adapter.KeyAdapter;
import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
import org.sufficientlysecure.keychain.util.ExportHelper; import org.sufficientlysecure.keychain.util.ExportHelper;
import org.sufficientlysecure.keychain.util.FabContainer; import org.sufficientlysecure.keychain.util.FabContainer;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
@ -553,9 +554,12 @@ public class KeyListFragment extends LoaderFragment
} }
private void updateAllKeys() { private void updateAllKeys() {
Context context = getActivity(); Activity activity = getActivity();
if (activity == null) {
return;
}
ProviderHelper providerHelper = new ProviderHelper(context); ProviderHelper providerHelper = new ProviderHelper(activity);
Cursor cursor = providerHelper.getContentResolver().query( Cursor cursor = providerHelper.getContentResolver().query(
KeyRings.buildUnifiedKeyRingsUri(), new String[]{ KeyRings.buildUnifiedKeyRingsUri(), new String[]{
@ -563,13 +567,21 @@ public class KeyListFragment extends LoaderFragment
}, null, null, null }, null, null, null
); );
ArrayList<ParcelableKeyRing> keyList = new ArrayList<>(); if (cursor == null) {
Notify.create(activity, R.string.error_loading_keys, Style.ERROR);
return;
}
while (cursor.moveToNext()) { ArrayList<ParcelableKeyRing> keyList = new ArrayList<>();
byte[] blob = cursor.getBlob(0);//fingerprint column is 0 try {
String fingerprint = KeyFormattingUtils.convertFingerprintToHex(blob); while (cursor.moveToNext()) {
ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null); byte[] blob = cursor.getBlob(0);//fingerprint column is 0
keyList.add(keyEntry); String fingerprint = KeyFormattingUtils.convertFingerprintToHex(blob);
ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null);
keyList.add(keyEntry);
}
} finally {
cursor.close();
} }
ServiceProgressHandler serviceHandler = new ServiceProgressHandler(getActivity()) { ServiceProgressHandler serviceHandler = new ServiceProgressHandler(getActivity()) {

View File

@ -17,6 +17,12 @@
package org.sufficientlysecure.keychain.ui.dialog; package org.sufficientlysecure.keychain.ui.dialog;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
@ -29,8 +35,8 @@ import android.os.Bundle;
import android.os.Message; import android.os.Message;
import android.os.Messenger; import android.os.Messenger;
import android.os.RemoteException; import android.os.RemoteException;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment; import android.support.v4.app.DialogFragment;
import android.test.suitebuilder.TestSuiteBuilder;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -47,15 +53,6 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.TlsHelper; import org.sufficientlysecure.keychain.util.TlsHelper;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
public class AddKeyserverDialogFragment extends DialogFragment implements OnEditorActionListener { public class AddKeyserverDialogFragment extends DialogFragment implements OnEditorActionListener {
private static final String ARG_MESSENGER = "messenger"; private static final String ARG_MESSENGER = "messenger";
@ -70,20 +67,11 @@ public class AddKeyserverDialogFragment extends DialogFragment implements OnEdit
private EditText mKeyserverEditText; private EditText mKeyserverEditText;
private CheckBox mVerifyKeyserverCheckBox; private CheckBox mVerifyKeyserverCheckBox;
public static enum FailureReason { public enum FailureReason {
INVALID_URL, INVALID_URL,
CONNECTION_FAILED CONNECTION_FAILED
} }
;
/**
* Creates new instance of this dialog fragment
*
* @param title title of dialog
* @param messenger to communicate back after setting the passphrase
* @return
*/
public static AddKeyserverDialogFragment newInstance(Messenger messenger) { public static AddKeyserverDialogFragment newInstance(Messenger messenger) {
AddKeyserverDialogFragment frag = new AddKeyserverDialogFragment(); AddKeyserverDialogFragment frag = new AddKeyserverDialogFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
@ -94,9 +82,7 @@ public class AddKeyserverDialogFragment extends DialogFragment implements OnEdit
return frag; return frag;
} }
/** @NonNull
* Creates dialog
*/
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
final Activity activity = getActivity(); final Activity activity = getActivity();
@ -222,19 +208,23 @@ public class AddKeyserverDialogFragment extends DialogFragment implements OnEdit
String scheme = keyserverUri.getScheme(); String scheme = keyserverUri.getScheme();
String schemeSpecificPart = keyserverUri.getSchemeSpecificPart(); String schemeSpecificPart = keyserverUri.getSchemeSpecificPart();
String fragment = keyserverUri.getFragment(); String fragment = keyserverUri.getFragment();
if (scheme == null) throw new MalformedURLException(); if (scheme == null) {
if (scheme.equalsIgnoreCase("hkps")) scheme = "https"; throw new MalformedURLException();
else if (scheme.equalsIgnoreCase("hkp")) scheme = "http"; }
if ("hkps".equalsIgnoreCase(scheme)) {
scheme = "https";
} else if ("hkp".equalsIgnoreCase(scheme)) {
scheme = "http";
}
URI newKeyserver = new URI(scheme, schemeSpecificPart, fragment); URI newKeyserver = new URI(scheme, schemeSpecificPart, fragment);
Log.d("Converted URL", newKeyserver.toString()); Log.d(Constants.TAG, "Converted URL" + newKeyserver);
TlsHelper.openConnection(newKeyserver.toURL()).getInputStream();
// just see if we can get a connection, then immediately close
TlsHelper.openConnection(newKeyserver.toURL()).getInputStream().close();
} catch (TlsHelper.TlsHelperException e) { } catch (TlsHelper.TlsHelperException e) {
reason = FailureReason.CONNECTION_FAILED; reason = FailureReason.CONNECTION_FAILED;
} catch (MalformedURLException e) { } catch (MalformedURLException | URISyntaxException e) {
Log.w(Constants.TAG, "Invalid keyserver URL entered by user.");
reason = FailureReason.INVALID_URL;
} catch (URISyntaxException e) {
Log.w(Constants.TAG, "Invalid keyserver URL entered by user."); Log.w(Constants.TAG, "Invalid keyserver URL entered by user.");
reason = FailureReason.INVALID_URL; reason = FailureReason.INVALID_URL;
} catch (IOException e) { } catch (IOException e) {

View File

@ -97,26 +97,23 @@ public class PasswordStrengthView extends View {
public PasswordStrengthView(Context context, AttributeSet attrs) { public PasswordStrengthView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
int COLOR_FAIL = context.getResources().getColor(R.color.android_red_light); int COLOR_FAIL = getResources().getColor(R.color.android_red_light);
int COLOR_WEAK = context.getResources().getColor(R.color.android_orange_light); int COLOR_WEAK = getResources().getColor(R.color.android_orange_light);
int COLOR_STRONG = context.getResources().getColor(R.color.android_green_light); int COLOR_STRONG = getResources().getColor(R.color.android_green_light);
TypedArray style = context.getTheme().obtainStyledAttributes( TypedArray style = context.getTheme().obtainStyledAttributes(
attrs, attrs,
R.styleable.PasswordStrengthView, R.styleable.PasswordStrengthView,
0, 0); 0, 0);
try { mStrengthRequirement = style.getInteger(R.styleable.PasswordStrengthView_strength,
mStrengthRequirement = style.getInteger(R.styleable.PasswordStrengthView_strength, STRENGTH_MEDIUM);
STRENGTH_MEDIUM); mShowGuides = style.getBoolean(R.styleable.PasswordStrengthView_showGuides, true);
mShowGuides = style.getBoolean(R.styleable.PasswordStrengthView_showGuides, true); mColorFail = style.getColor(R.styleable.PasswordStrengthView_color_fail, COLOR_FAIL);
mColorFail = style.getColor(R.styleable.PasswordStrengthView_color_fail, COLOR_FAIL); mColorWeak = style.getColor(R.styleable.PasswordStrengthView_color_weak, COLOR_WEAK);
mColorWeak = style.getColor(R.styleable.PasswordStrengthView_color_weak, COLOR_WEAK); mColorStrong = style.getColor(R.styleable.PasswordStrengthView_color_strong,
mColorStrong = style.getColor(R.styleable.PasswordStrengthView_color_strong, COLOR_STRONG);
COLOR_STRONG);
} catch (Exception e) {
e.printStackTrace();
}
// Create and style the paint used for drawing the guide on the indicator // Create and style the paint used for drawing the guide on the indicator
mGuidePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mGuidePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mGuidePaint.setStyle(Paint.Style.FILL_AND_STROKE); mGuidePaint.setStyle(Paint.Style.FILL_AND_STROKE);
@ -124,6 +121,9 @@ public class PasswordStrengthView extends View {
// Create and style paint for indicator // Create and style paint for indicator
mIndicatorPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mIndicatorPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mIndicatorPaint.setStyle(Paint.Style.FILL); mIndicatorPaint.setStyle(Paint.Style.FILL);
style.recycle();
} }
/** /**

View File

@ -303,10 +303,13 @@ public class ContactHelper {
Cursor contactMasterKey = context.getContentResolver().query(contactUri, Cursor contactMasterKey = context.getContentResolver().query(contactUri,
new String[]{ContactsContract.Data.DATA2}, null, null, null); new String[]{ContactsContract.Data.DATA2}, null, null, null);
if (contactMasterKey != null) { if (contactMasterKey != null) {
if (contactMasterKey.moveToNext()) { try {
return KeychainContract.KeyRings.buildGenericKeyRingUri(contactMasterKey.getLong(0)); if (contactMasterKey.moveToNext()) {
return KeychainContract.KeyRings.buildGenericKeyRingUri(contactMasterKey.getLong(0));
}
} finally {
contactMasterKey.close();
} }
contactMasterKey.close();
} }
return null; return null;
} }
@ -537,7 +540,7 @@ public class ContactHelper {
KEYS_TO_CONTACT_PROJECTION, KEYS_TO_CONTACT_PROJECTION,
KeychainContract.KeyRings.HAS_ANY_SECRET + "!=0", KeychainContract.KeyRings.HAS_ANY_SECRET + "!=0",
null, null); null, null);
if (cursor != null) { if (cursor != null) try {
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID); long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID);
boolean isExpired = cursor.getInt(INDEX_IS_EXPIRED) != 0; boolean isExpired = cursor.getInt(INDEX_IS_EXPIRED) != 0;
@ -565,6 +568,8 @@ public class ContactHelper {
} }
} }
} }
} finally {
cursor.close();
} }
for (long masterKeyId : keysToDelete) { for (long masterKeyId : keysToDelete) {

View File

@ -66,21 +66,24 @@ public class ParcelableFileCache<E extends Parcelable> {
File tempFile = new File(mContext.getCacheDir(), mFilename); File tempFile = new File(mContext.getCacheDir(), mFilename);
DataOutputStream oos = new DataOutputStream(new FileOutputStream(tempFile)); DataOutputStream oos = new DataOutputStream(new FileOutputStream(tempFile));
oos.writeInt(numEntries); try {
oos.writeInt(numEntries);
while (it.hasNext()) { while (it.hasNext()) {
Parcel p = Parcel.obtain(); // creating empty parcel object Parcel p = Parcel.obtain(); // creating empty parcel object
p.writeParcelable(it.next(), 0); // saving bundle as parcel p.writeParcelable(it.next(), 0); // saving bundle as parcel
byte[] buf = p.marshall(); byte[] buf = p.marshall();
oos.writeInt(buf.length); oos.writeInt(buf.length);
oos.write(buf); oos.write(buf);
p.recycle(); p.recycle();
}
} finally {
oos.close();
} }
oos.close();
} }
/** /**

View File

@ -1331,5 +1331,6 @@
<string name="snack_armor_off">"Output encoded as Binary."</string> <string name="snack_armor_off">"Output encoded as Binary."</string>
<string name="snack_compression_on">"Compression <b>enabled</b>."</string> <string name="snack_compression_on">"Compression <b>enabled</b>."</string>
<string name="snack_compression_off">"Compression <b>disabled</b>."</string> <string name="snack_compression_off">"Compression <b>disabled</b>."</string>
<string name="error_loading_keys">Error loading keys!</string>
</resources> </resources>