Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9804cf5b authored by Ahming Chen's avatar Ahming Chen Committed by android-build-team Robot
Browse files

Revert "DO NOT MERGE Refactor passwords/pins/patterns to byte[]"

This reverts commit 34042bbf.

Reason for revert: <INSERT REASONING HERE>

Change-Id: I49ac37f6b1702db9248879e21134a028d8cb3892
(cherry picked from commit ef22665a2c1876b0112af1086cef772e73da896a)
parent feddc93a
Loading
Loading
Loading
Loading
+1 −7
Original line number Diff line number Diff line
@@ -38,7 +38,6 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.core.InstrumentedFragment;

import java.util.Arrays;
import java.util.Locale;

public class CryptKeeperConfirm extends InstrumentedFragment {
@@ -88,12 +87,7 @@ public class CryptKeeperConfirm extends InstrumentedFragment {
                    IStorageManager storageManager = IStorageManager.Stub.asInterface(service);
                    try {
                        Bundle args = getIntent().getExtras();
                        // TODO(b/120484642): Update vold to accept a password as a byte array
                        byte[] passwordBytes = args.getByteArray("password");
                        String password = passwordBytes != null ? new String(passwordBytes) : null;
                        Arrays.fill(passwordBytes, (byte) 0);
                        storageManager.encryptStorage(args.getInt("type", -1),
                                password);
                        storageManager.encryptStorage(args.getInt("type", -1), args.getString("password"));
                    } catch (Exception e) {
                        Log.e("CryptKeeper", "Error while encrypting...", e);
                    }
+7 −10
Original line number Diff line number Diff line
@@ -63,7 +63,6 @@ import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.RestrictedPreference;

import java.util.Arrays;
import java.util.List;

public class ChooseLockGeneric extends SettingsActivity {
@@ -145,7 +144,7 @@ public class ChooseLockGeneric extends SettingsActivity {
        private int mEncryptionRequestQuality;
        private boolean mEncryptionRequestDisabled;
        private boolean mForChangeCredRequiredForBoot = false;
        private byte[] mUserPassword;
        private String mUserPassword;
        private LockPatternUtils mLockPatternUtils;
        private FingerprintManager mFingerprintManager;
        private int mUserId;
@@ -185,7 +184,7 @@ public class ChooseLockGeneric extends SettingsActivity {
                .getBooleanExtra(CONFIRM_CREDENTIALS, true);
            if (getActivity() instanceof ChooseLockGeneric.InternalActivity) {
                mPasswordConfirmed = !confirmCredentials;
                mUserPassword = getActivity().getIntent().getByteArrayExtra(
                mUserPassword = getActivity().getIntent().getStringExtra(
                        ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
            }
            mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false);
@@ -207,7 +206,7 @@ public class ChooseLockGeneric extends SettingsActivity {
                mEncryptionRequestDisabled = savedInstanceState.getBoolean(
                        ENCRYPT_REQUESTED_DISABLED);
                if (mUserPassword == null) {
                    mUserPassword = savedInstanceState.getByteArray(
                    mUserPassword = savedInstanceState.getString(
                            ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
                }
            }
@@ -352,12 +351,10 @@ public class ChooseLockGeneric extends SettingsActivity {
            mWaitingForConfirmation = false;
            if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
                mPasswordConfirmed = true;
                mUserPassword = data != null
                    ? data.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD)
                    : null;
                mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
                updatePreferencesOrFinish(false /* isRecreatingActivity */);
                if (mForChangeCredRequiredForBoot) {
                    if (!(mUserPassword == null || mUserPassword.length == 0)) {
                    if (!TextUtils.isEmpty(mUserPassword)) {
                        maybeEnableEncryption(
                                mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId), false);
                    } else {
@@ -417,7 +414,7 @@ public class ChooseLockGeneric extends SettingsActivity {
            outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality);
            outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled);
            if (mUserPassword != null) {
                outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, mUserPassword);
                outState.putString(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, mUserPassword);
            }
        }

@@ -593,7 +590,7 @@ public class ChooseLockGeneric extends SettingsActivity {
            setPreferenceSummary(ScreenLockType.MANAGED, R.string.secure_lock_encryption_warning);
        }

        protected Intent getLockManagedPasswordIntent(byte[] password) {
        protected Intent getLockManagedPasswordIntent(String password) {
            return mManagedPasswordProvider.createIntent(false, password);
        }

+28 −49
Original line number Diff line number Diff line
@@ -70,7 +70,6 @@ import com.android.settings.widget.ImeAwareEditText;
import com.android.setupwizardlib.GlifLayout;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ChooseLockPassword extends SettingsActivity {
@@ -131,7 +130,7 @@ public class ChooseLockPassword extends SettingsActivity {
            return this;
        }

        public IntentBuilder setPassword(byte[] password) {
        public IntentBuilder setPassword(String password) {
            mIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password);
            return this;
        }
@@ -177,8 +176,8 @@ public class ChooseLockPassword extends SettingsActivity {
        private static final String KEY_CURRENT_PASSWORD = "current_password";
        private static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker";

        private byte[] mCurrentPassword;
        private byte[] mChosenPassword;
        private String mCurrentPassword;
        private String mChosenPassword;
        private boolean mHasChallenge;
        private long mChallenge;
        private ImeAwareEditText mPasswordEntry;
@@ -209,7 +208,7 @@ public class ChooseLockPassword extends SettingsActivity {
        private GlifLayout mLayout;
        protected boolean mForFingerprint;

        private byte[] mFirstPin;
        private String mFirstPin;
        private RecyclerView mPasswordRestrictionView;
        protected boolean mIsAlphaMode;
        protected Button mSkipButton;
@@ -229,7 +228,7 @@ public class ChooseLockPassword extends SettingsActivity {
        private static final int MIN_NUMBER_IN_PASSWORD = 4;
        private static final int MIN_NON_LETTER_IN_PASSWORD = 5;

        // Error code returned from {@link #validatePassword(byte[])}.
        // Error code returned from {@link #validatePassword(String)}.
        static final int NO_ERROR = 0;
        static final int CONTAIN_INVALID_CHARACTERS = 1 << 0;
        static final int TOO_SHORT = 1 << 1;
@@ -351,13 +350,12 @@ public class ChooseLockPassword extends SettingsActivity {
                SaveAndFinishWorker w = new SaveAndFinishWorker();
                final boolean required = getActivity().getIntent().getBooleanExtra(
                        EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
                byte[] currentBytes = intent.getByteArrayExtra(
                String current = intent.getStringExtra(
                        ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);

                w.setBlocking(true);
                w.setListener(this);
                w.start(mChooseLockSettingsHelper.utils(), required, false, 0,
                        currentBytes, currentBytes, mRequestedQuality, mUserId);
                w.start(mChooseLockSettingsHelper.utils(), required,
                        false, 0, current, current, mRequestedQuality, mUserId);
            }
            mTextChangedHandler = new TextChangedHandler();
        }
@@ -418,8 +416,7 @@ public class ChooseLockPassword extends SettingsActivity {
            Intent intent = getActivity().getIntent();
            final boolean confirmCredentials = intent.getBooleanExtra(
                    ChooseLockGeneric.CONFIRM_CREDENTIALS, true);
            mCurrentPassword = intent.getByteArrayExtra(
                    ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
            mCurrentPassword = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
            mHasChallenge = intent.getBooleanExtra(
                    ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false);
            mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0);
@@ -431,9 +428,8 @@ public class ChooseLockPassword extends SettingsActivity {
                            mUserId);
                }
            } else {

                // restore from previous state
                mFirstPin = savedInstanceState.getByteArray(KEY_FIRST_PIN);
                mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN);
                final String state = savedInstanceState.getString(KEY_UI_STAGE);
                if (state != null) {
                    mUiStage = Stage.valueOf(state);
@@ -441,7 +437,7 @@ public class ChooseLockPassword extends SettingsActivity {
                }

                if (mCurrentPassword == null) {
                    mCurrentPassword = savedInstanceState.getByteArray(KEY_CURRENT_PASSWORD);
                    mCurrentPassword = savedInstanceState.getString(KEY_CURRENT_PASSWORD);
                }

                // Re-attach to the exiting worker if there is one.
@@ -540,8 +536,8 @@ public class ChooseLockPassword extends SettingsActivity {
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putString(KEY_UI_STAGE, mUiStage.name());
            outState.putByteArray(KEY_FIRST_PIN, mFirstPin);
            outState.putByteArray(KEY_CURRENT_PASSWORD, mCurrentPassword);
            outState.putString(KEY_FIRST_PIN, mFirstPin);
            outState.putString(KEY_CURRENT_PASSWORD, mCurrentPassword);
        }

        @Override
@@ -554,7 +550,7 @@ public class ChooseLockPassword extends SettingsActivity {
                        getActivity().setResult(RESULT_FINISHED);
                        getActivity().finish();
                    } else {
                        mCurrentPassword = data.getByteArrayExtra(
                        mCurrentPassword = data.getStringExtra(
                                ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
                    }
                    break;
@@ -645,22 +641,22 @@ public class ChooseLockPassword extends SettingsActivity {
         * @param password the raw password the user typed in
         * @return the validation result.
         */
        int validatePassword(byte[] password) {
        private int validatePassword(String password) {
            int errorCode = NO_ERROR;
            final PasswordMetrics metrics = PasswordMetrics.computeForPassword(password);


            if (password == null || password.length < mPasswordMinLength) {
            if (password.length() < mPasswordMinLength) {
                if (mPasswordMinLength > mPasswordMinLengthToFulfillAllPolicies) {
                    errorCode |= TOO_SHORT;
                }
            } else if (password.length > mPasswordMaxLength) {
            } else if (password.length() > mPasswordMaxLength) {
                errorCode |= TOO_LONG;
            } else {
                // The length requirements are fulfilled.
                final int dpmQuality = mLockPatternUtils.getRequestedPasswordQuality(mUserId);
                if (dpmQuality == PASSWORD_QUALITY_NUMERIC_COMPLEX &&
                        metrics.numeric == password.length) {
                        metrics.numeric == password.length()) {
                    // Check for repeated characters or sequences (e.g. '1234', '0000', '2468')
                    // if DevicePolicyManager requires a complex numeric password. There can be
                    // two cases in the UI: 1. User chooses to enroll a PIN, 2. User chooses to
@@ -679,8 +675,8 @@ public class ChooseLockPassword extends SettingsActivity {
            }

            // Allow non-control Latin-1 characters only.
            for (int i = 0; i < password.length; i++) {
                char c = (char) password[i];
            for (int i = 0; i < password.length(); i++) {
                char c = password.charAt(i);
                if (c < 32 || c > 127) {
                    errorCode |= CONTAIN_INVALID_CHARACTERS;
                    break;
@@ -750,9 +746,8 @@ public class ChooseLockPassword extends SettingsActivity {

        public void handleNext() {
            if (mSaveAndFinishWorker != null) return;
            // TODO(b/120484642): This is a point of entry for passwords from the UI
            mChosenPassword = LockPatternUtils.charSequenceToByteArray(mPasswordEntry.getText());
            if (mChosenPassword == null || mChosenPassword.length == 0) {
            mChosenPassword = mPasswordEntry.getText().toString();
            if (TextUtils.isEmpty(mChosenPassword)) {
                return;
            }
            if (mUiStage == Stage.Introduction) {
@@ -760,11 +755,9 @@ public class ChooseLockPassword extends SettingsActivity {
                    mFirstPin = mChosenPassword;
                    mPasswordEntry.setText("");
                    updateStage(Stage.NeedToConfirm);
                } else {
                    Arrays.fill(mChosenPassword, (byte) 0);
                }
            } else if (mUiStage == Stage.NeedToConfirm) {
                if (Arrays.equals(mFirstPin, mChosenPassword)) {
                if (mFirstPin.equals(mChosenPassword)) {
                    startSaveAndFinish();
                } else {
                    CharSequence tmp = mPasswordEntry.getText();
@@ -772,7 +765,6 @@ public class ChooseLockPassword extends SettingsActivity {
                        Selection.setSelection((Spannable) tmp, 0, tmp.length());
                    }
                    updateStage(Stage.ConfirmWrong);
                    Arrays.fill(mChosenPassword, (byte) 0);
                }
            }
        }
@@ -883,8 +875,8 @@ public class ChooseLockPassword extends SettingsActivity {
         */
        protected void updateUi() {
            final boolean canInput = mSaveAndFinishWorker == null;
            byte[] password = LockPatternUtils.charSequenceToByteArray(mPasswordEntry.getText());
            final int length = password.length;
            String password = mPasswordEntry.getText().toString();
            final int length = password.length();
            if (mUiStage == Stage.Introduction) {
                mPasswordRestrictionView.setVisibility(View.VISIBLE);
                final int errorCode = validatePassword(password);
@@ -912,7 +904,6 @@ public class ChooseLockPassword extends SettingsActivity {

            setNextText(mUiStage.buttonText);
            mPasswordEntryInputDisabler.setInputEnabled(canInput);
            Arrays.fill(password, (byte) 0);
        }

        private int toVisibility(boolean visibleOrGone) {
@@ -971,18 +962,6 @@ public class ChooseLockPassword extends SettingsActivity {
        public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData) {
            getActivity().setResult(RESULT_FINISHED, resultData);

            if (mChosenPassword != null) {
                Arrays.fill(mChosenPassword, (byte) 0);
            }
            if (mCurrentPassword != null) {
                Arrays.fill(mCurrentPassword, (byte) 0);
            }
            if (mFirstPin != null) {
                Arrays.fill(mFirstPin, (byte) 0);
            }

            mPasswordEntry.setText("");

            if (!wasSecureBefore) {
                Intent intent = getRedactionInterstitialIntent(getActivity());
                if (intent != null) {
@@ -1020,13 +999,13 @@ public class ChooseLockPassword extends SettingsActivity {

    public static class SaveAndFinishWorker extends SaveChosenLockWorkerBase {

        private byte[] mChosenPassword;
        private byte[] mCurrentPassword;
        private String mChosenPassword;
        private String mCurrentPassword;
        private int mRequestedQuality;

        public void start(LockPatternUtils utils, boolean required,
                boolean hasChallenge, long challenge,
                byte[] chosenPassword, byte[] currentPassword, int requestedQuality, int userId) {
                String chosenPassword, String currentPassword, int requestedQuality, int userId) {
            prepare(utils, required, hasChallenge, challenge, userId);

            mChosenPassword = chosenPassword;
+16 −21
Original line number Diff line number Diff line
@@ -52,7 +52,6 @@ import com.android.setupwizardlib.GlifLayout;
import com.google.android.collect.Lists;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@@ -112,7 +111,7 @@ public class ChooseLockPattern extends SettingsActivity {
            return this;
        }

        public IntentBuilder setPattern(byte[] pattern) {
        public IntentBuilder setPattern(String pattern) {
            mIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, pattern);
            return this;
        }
@@ -171,7 +170,7 @@ public class ChooseLockPattern extends SettingsActivity {

        private static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker";

        private byte[] mCurrentPattern;
        private String mCurrentPattern;
        private boolean mHasChallenge;
        private long mChallenge;
        protected TextView mTitleText;
@@ -209,7 +208,7 @@ public class ChooseLockPattern extends SettingsActivity {
                        getActivity().setResult(RESULT_FINISHED);
                        getActivity().finish();
                    } else {
                        mCurrentPattern = data.getByteArrayExtra(
                        mCurrentPattern = data.getStringExtra(
                                ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
                    }

@@ -442,12 +441,12 @@ public class ChooseLockPattern extends SettingsActivity {
                SaveAndFinishWorker w = new SaveAndFinishWorker();
                final boolean required = getActivity().getIntent().getBooleanExtra(
                        EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
                byte[] current = intent.getByteArrayExtra(
                String current = intent.getStringExtra(
                        ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
                w.setBlocking(true);
                w.setListener(this);
                w.start(mChooseLockSettingsHelper.utils(), required,
                        false, 0, LockPatternUtils.byteArrayToPattern(current), current, mUserId);
                        false, 0, LockPatternUtils.stringToPattern(current), current, mUserId);
            }
            mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false);
            mForFingerprint = intent.getBooleanExtra(
@@ -508,8 +507,7 @@ public class ChooseLockPattern extends SettingsActivity {
            final boolean confirmCredentials = getActivity().getIntent()
                    .getBooleanExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, true);
            Intent intent = getActivity().getIntent();
            mCurrentPattern =
                    intent.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
            mCurrentPattern = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
            mHasChallenge = intent.getBooleanExtra(
                    ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false);
            mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0);
@@ -532,13 +530,13 @@ public class ChooseLockPattern extends SettingsActivity {
                }
            } else {
                // restore from previous state
                final byte[] pattern = savedInstanceState.getByteArray(KEY_PATTERN_CHOICE);
                if (pattern != null) {
                    mChosenPattern = LockPatternUtils.byteArrayToPattern(pattern);
                final String patternString = savedInstanceState.getString(KEY_PATTERN_CHOICE);
                if (patternString != null) {
                    mChosenPattern = LockPatternUtils.stringToPattern(patternString);
                }

                if (mCurrentPattern == null) {
                    mCurrentPattern = savedInstanceState.getByteArray(KEY_CURRENT_PATTERN);
                    mCurrentPattern = savedInstanceState.getString(KEY_CURRENT_PATTERN);
                }
                updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]);

@@ -634,12 +632,13 @@ public class ChooseLockPattern extends SettingsActivity {

            outState.putInt(KEY_UI_STAGE, mUiStage.ordinal());
            if (mChosenPattern != null) {
                outState.putByteArray(KEY_PATTERN_CHOICE,
                        LockPatternUtils.patternToByteArray(mChosenPattern));
                outState.putString(KEY_PATTERN_CHOICE,
                        LockPatternUtils.patternToString(mChosenPattern));
            }

            if (mCurrentPattern != null) {
                outState.putByteArray(KEY_CURRENT_PATTERN, mCurrentPattern);
                outState.putString(KEY_CURRENT_PATTERN,
                        mCurrentPattern);
            }
        }

@@ -785,10 +784,6 @@ public class ChooseLockPattern extends SettingsActivity {
        public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData) {
            getActivity().setResult(RESULT_FINISHED, resultData);

            if (mCurrentPattern != null) {
                Arrays.fill(mCurrentPattern, (byte) 0);
            }

            if (!wasSecureBefore) {
                Intent intent = getRedactionInterstitialIntent(getActivity());
                if (intent != null) {
@@ -803,12 +798,12 @@ public class ChooseLockPattern extends SettingsActivity {
    public static class SaveAndFinishWorker extends SaveChosenLockWorkerBase {

        private List<LockPatternView.Cell> mChosenPattern;
        private byte[] mCurrentPattern;
        private String mCurrentPattern;
        private boolean mLockVirgin;

        public void start(LockPatternUtils utils, boolean credentialRequired,
                boolean hasChallenge, long challenge,
                List<LockPatternView.Cell> chosenPattern, byte[] currentPattern, int userId) {
                List<LockPatternView.Cell> chosenPattern, String currentPattern, int userId) {
            prepare(utils, credentialRequired, hasChallenge, challenge, userId);

            mCurrentPattern = currentPattern;
+4 −5
Original line number Diff line number Diff line
@@ -332,9 +332,8 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
                return;
            }

            // TODO(b/120484642): This is a point of entry for passwords from the UI
            final byte[] pin = LockPatternUtils.charSequenceToByteArray(mPasswordEntry.getText());
            if (pin == null || pin.length == 0) {
            final String pin = mPasswordEntry.getText().toString();
            if (TextUtils.isEmpty(pin)) {
                return;
            }

@@ -360,7 +359,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
            return getActivity() instanceof ConfirmLockPassword.InternalActivity;
        }

        private void startVerifyPassword(final byte[] pin, final Intent intent) {
        private void startVerifyPassword(final String pin, final Intent intent) {
            long challenge = getActivity().getIntent().getLongExtra(
                    ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0);
            final int localEffectiveUserId = mEffectiveUserId;
@@ -391,7 +390,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
                            onVerifyCallback);
        }

        private void startCheckPassword(final byte[] pin, final Intent intent) {
        private void startCheckPassword(final String pin, final Intent intent) {
            final int localEffectiveUserId = mEffectiveUserId;
            mPendingLockCheck = LockPatternChecker.checkPassword(
                    mLockPatternUtils,
Loading