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

Commit 61ac15dd authored by Fahim Salam Chowdhury's avatar Fahim Salam Chowdhury 👽
Browse files

fix: race condition on updating cookie

- as the rootFolderSetup calls are executing concurrently, the cookie update sometime faces race-codition. As a result some requests are facing 401. We have to execute the request one after one to prevent this.

- simplify the davClient cleanup implementation
parent 29c6ce7a
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@ android {
}

dependencies {
    implementation 'foundation.e:Nextcloud-Android-Library:1.0.1-alpha'
    implementation 'foundation.e:Nextcloud-Android-Library:1.0.5-alpha'
    implementation "commons-httpclient:commons-httpclient:3.1@jar"
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    api 'androidx.annotation:annotation:1.6.0'
+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ import foundation.e.drive.R
import foundation.e.drive.utils.AccountUtils
import foundation.e.drive.utils.AppConstants
import foundation.e.drive.utils.CommonUtils
import foundation.e.drive.utils.DavClientProvider
import foundation.e.drive.utils.WorkerUtils
import timber.log.Timber

@@ -44,6 +45,7 @@ class AccountAddedReceiver() : BroadcastReceiver() {
            .putString(AccountManager.KEY_ACCOUNT_NAME, accountName)
            .apply()

        DavClientProvider.getInstance().cleanUp();
        WorkerUtils.registerSetupWorkers(context)
}

+2 −21
Original line number Diff line number Diff line
@@ -11,7 +11,6 @@ package foundation.e.drive.account.receivers;
import static foundation.e.drive.utils.AppConstants.INITIAL_FOLDER_NUMBER;
import static foundation.e.drive.utils.AppConstants.SETUP_COMPLETED;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.annotation.SuppressLint;
import android.app.NotificationManager;
@@ -30,7 +29,6 @@ import foundation.e.drive.EdriveApplication;
import foundation.e.drive.R;
import foundation.e.drive.database.DbHelper;
import foundation.e.drive.database.FailedSyncPrefsManager;
import foundation.e.drive.synchronization.SyncWorker;
import foundation.e.drive.utils.AppConstants;
import foundation.e.drive.utils.DavClientProvider;
import foundation.e.drive.utils.ViewUtils;
@@ -57,7 +55,8 @@ public class AccountRemoveCallbackReceiver extends BroadcastReceiver {
        cleanSharedPreferences(applicationContext, preferences);
        removeCachedFiles(applicationContext);
        deleteNotificationChannels(applicationContext);
        clearDavClient(intent, applicationContext);

        DavClientProvider.getInstance().cleanUp();

        ViewUtils.updateWidgetView(applicationContext);
    }
@@ -79,24 +78,6 @@ public class AccountRemoveCallbackReceiver extends BroadcastReceiver {
        }
    }

    private void clearDavClient(@NonNull Intent intent, @NonNull Context context) {
        if (intent.getExtras() == null) {
            return;
        }

        final String accountType = intent.getExtras().getString(AccountManager.KEY_ACCOUNT_TYPE);
        final String accountName = intent.getExtras().getString(AccountManager.KEY_ACCOUNT_NAME);

        AccountManager accountManager = AccountManager.get(context);

        for (Account account : accountManager.getAccountsByType(accountType)) {
            if (account.name.equals(accountName)) {
                DavClientProvider.getInstance().cleanUp(context, account);
                break;
            }
        }
    }

    private boolean shouldProceedWithRemoval(@NonNull Intent intent, @NonNull SharedPreferences preferences, @NonNull Context context) {
        if (isInvalidAction(intent) || intent.getExtras() == null) {
            Timber.w("Invalid account removal request");
+2 −7
Original line number Diff line number Diff line
@@ -80,14 +80,9 @@ public class DavClientProvider {

    }

    public void cleanUp(@NonNull Context context, @NonNull Account account) {
    public void cleanUp() {
        OwnCloudClientManager ownCloudClientManager = OwnCloudClientManagerFactory.getDefaultSingleton();
        try {
            OwnCloudAccount ocAccount = new OwnCloudAccount(account, context);
            ownCloudClientManager.removeClientFor(ocAccount);
        } catch (AccountUtils.AccountNotFoundException e) {
            Timber.e(e);
        }
        ownCloudClientManager.removeClientForByName(null);
    }

    public void saveAccounts(@NonNull Context context) {
+8 −3
Original line number Diff line number Diff line
@@ -30,9 +30,14 @@ object WorkerUtils {
            null
        )

        WorkManager.getInstance(context)
        var workContinuation = WorkManager.getInstance(context)
            .beginWith(getUserInfoRequest)
            .then(rootFolderSetupWorkers)

        rootFolderSetupWorkers.forEach {
            workContinuation = workContinuation.then(it)
        }

        workContinuation
            .then(finishSetupRequest)
            .enqueue()
    }