Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#1079 Show DisplayName instead of uid attribute for LDAP users #1211

Merged
merged 12 commits into from
May 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ dependencies {
// Testing
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:3.9.0'
def powermockVersion = "2.0.9"
testImplementation "org.powermock:powermock-core:$powermockVersion"
testImplementation "org.powermock:powermock-module-junit4:$powermockVersion"
testImplementation "org.powermock:powermock-api-mockito2:$powermockVersion"
testImplementation 'org.robolectric:robolectric:4.5.1'
testImplementation 'androidx.test:core:1.3.0'
testImplementation 'androidx.test.ext:junit:1.1.2'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
account$.observe(requireActivity(), (currentLocalAccount) -> {
account$.removeObservers(requireActivity());

binding.accountName.setText(currentLocalAccount.getUserName());
binding.accountName.setText(currentLocalAccount.getDisplayName());
binding.accountHost.setText(Uri.parse(currentLocalAccount.getUrl()).getHost());
Glide.with(requireContext())
.load(currentLocalAccount.getUrl() + "/index.php/avatar/" + Uri.encode(currentLocalAccount.getUserName()) + "/64")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public AccountSwitcherViewHolder(@NonNull View itemView) {
}

public void bind(@NonNull Account localAccount, @NonNull Consumer<Account> onAccountClick) {
binding.accountName.setText(localAccount.getUserName());
binding.accountName.setText(localAccount.getDisplayName());
binding.accountHost.setText(Uri.parse(localAccount.getUrl()).getHost());
Glide.with(itemView.getContext())
.load(new SingleSignOnUrl(localAccount.getAccountName(), localAccount.getUrl() + "/index.php/avatar/" + Uri.encode(localAccount.getUserName()) + "/64"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import it.niedermann.owncloud.notes.shared.model.ApiVersion;
import it.niedermann.owncloud.notes.shared.model.DBStatus;
import it.niedermann.owncloud.notes.shared.model.ISyncCallback;
import it.niedermann.owncloud.notes.shared.util.ApiVersionUtil;
import it.niedermann.owncloud.notes.shared.util.NoteUtil;
import it.niedermann.owncloud.notes.shared.util.NotesColorUtil;
import it.niedermann.owncloud.notes.shared.util.ShareUtil;
Expand Down Expand Up @@ -193,7 +194,8 @@ public void onPrepareOptionsMenu(@NonNull Menu menu) {
if (note != null) {
prepareFavoriteOption(menu.findItem(R.id.menu_favorite));

menu.findItem(R.id.menu_title).setVisible(localAccount.getPreferredApiVersion() != null && localAccount.getPreferredApiVersion().compareTo(ApiVersion.API_VERSION_1_0) >= 0);
final ApiVersion preferredApiVersion = ApiVersionUtil.getPreferredApiVersion(localAccount.getApiVersion());
menu.findItem(R.id.menu_title).setVisible(preferredApiVersion != null && preferredApiVersion.compareTo(ApiVersion.API_VERSION_1_0) >= 0);
menu.findItem(R.id.menu_delete).setVisible(!isNew);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package it.niedermann.owncloud.notes.importaccount;

import android.content.Context;
import android.accounts.NetworkErrorException;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
Expand Down Expand Up @@ -93,7 +91,8 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
Log.i(TAG, "Loading capabilities for " + ssoAccount.name);
final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplicationContext(), ssoAccount, null);
importAccountViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities, new IResponseCallback<Account>() {
final String displayName = CapabilitiesClient.getDisplayName(getApplicationContext(), ssoAccount);
importAccountViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities, displayName, new IResponseCallback<Account>() {

/**
* Update syncing when adding account
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import android.app.Application;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;

Expand All @@ -23,7 +24,7 @@ public ImportAccountViewModel(@NonNull Application application) {
this.repo = NotesRepository.getInstance(application);
}

public void addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities, @NonNull IResponseCallback<Account> callback) {
repo.addAccount(url, username, accountName, capabilities, callback);
public void addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities, @Nullable String displayName, @NonNull IResponseCallback<Account> callback) {
repo.addAccount(url, username, accountName, capabilities, displayName, callback);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -657,7 +657,8 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
Log.i(TAG, "Refreshing capabilities for " + ssoAccount.name);
final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplicationContext(), ssoAccount, null);
mainViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities, new IResponseCallback<Account>() {
final String displayName = CapabilitiesClient.getDisplayName(getApplicationContext(), ssoAccount);
mainViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities, displayName, new IResponseCallback<Account>() {
@Override
public void onSuccess(Account result) {
new Thread(() -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException;
import com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException;
import com.nextcloud.android.sso.helper.SingleAccountHelper;
import com.nextcloud.android.sso.model.SingleSignOnAccount;

import java.util.ArrayList;
import java.util.Collection;
Expand Down Expand Up @@ -394,26 +395,29 @@ public void synchronizeCapabilities(@NonNull Account localAccount, @NonNull IRes
}
if (repo.isSyncPossible()) {
try {
final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplication(), AccountImporter.getSingleSignOnAccount(getApplication(), localAccount.getAccountName()), localAccount.getCapabilitiesETag());
repo.updateCapabilitiesETag(localAccount.getId(), capabilities.getETag());
repo.updateBrand(localAccount.getId(), capabilities.getColor(), capabilities.getTextColor());
localAccount.setColor(capabilities.getColor());
localAccount.setTextColor(capabilities.getTextColor());
BrandingUtil.saveBrandColors(getApplication(), localAccount.getColor(), localAccount.getTextColor());
repo.updateApiVersion(localAccount.getId(), capabilities.getApiVersion());
callback.onSuccess(null);
final SingleSignOnAccount ssoAccount = AccountImporter.getSingleSignOnAccount(getApplication(), localAccount.getAccountName());
try {
final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplication(), ssoAccount, localAccount.getCapabilitiesETag());
repo.updateCapabilitiesETag(localAccount.getId(), capabilities.getETag());
repo.updateBrand(localAccount.getId(), capabilities.getColor(), capabilities.getTextColor());
localAccount.setColor(capabilities.getColor());
localAccount.setTextColor(capabilities.getTextColor());
BrandingUtil.saveBrandColors(getApplication(), localAccount.getColor(), localAccount.getTextColor());
repo.updateApiVersion(localAccount.getId(), capabilities.getApiVersion());
callback.onSuccess(null);
} catch (Throwable t) {
if (t.getClass() == NextcloudHttpRequestFailedException.class || t instanceof NextcloudHttpRequestFailedException) {
if (((NextcloudHttpRequestFailedException) t).getStatusCode() == HTTP_NOT_MODIFIED) {
Log.d(TAG, "Server returned HTTP Status Code " + ((NextcloudHttpRequestFailedException) t).getStatusCode() + " - Capabilities not modified.");
callback.onSuccess(null);
return;
}
}
callback.onError(t);
}
} catch (NextcloudFilesAppAccountNotFoundException e) {
repo.deleteAccount(localAccount);
callback.onError(e);
} catch (Throwable t) {
if (t.getClass() == NextcloudHttpRequestFailedException.class || t instanceof NextcloudHttpRequestFailedException) {
if (((NextcloudHttpRequestFailedException) t).getStatusCode() == HTTP_NOT_MODIFIED) {
Log.d(TAG, "Server returned HTTP Status Code " + ((NextcloudHttpRequestFailedException) t).getStatusCode() + " - Capabilities not modified.");
callback.onSuccess(null);
return;
}
}
callback.onError(t);
}
} else {
if (repo.isNetworkConnected() && repo.isSyncOnlyOnWifi()) {
Expand Down Expand Up @@ -528,8 +532,8 @@ public LiveData<Void> deleteNotesAndSync(@NonNull Collection<Long> ids) {
});
}

public void addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities, @NonNull IResponseCallback<Account> callback) {
repo.addAccount(url, username, accountName, capabilities, callback);
public void addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities, @Nullable String displayName, @NonNull IResponseCallback<Account> callback) {
repo.addAccount(url, username, accountName, capabilities, displayName, callback);
}

public LiveData<Note> getFullNote$(long id) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@

import it.niedermann.owncloud.notes.persistence.sync.OcsAPI;
import it.niedermann.owncloud.notes.shared.model.Capabilities;
import it.niedermann.owncloud.notes.shared.model.OcsResponse;
import it.niedermann.owncloud.notes.shared.model.OcsUser;
import retrofit2.Response;

@WorkerThread
public class CapabilitiesClient {
Expand All @@ -22,11 +25,12 @@ public class CapabilitiesClient {

private static final String HEADER_KEY_ETAG = "ETag";

@WorkerThread
public static Capabilities getCapabilities(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount, @Nullable String lastETag) throws Throwable {
final OcsAPI ocsAPI = ApiProvider.getOcsAPI(context, ssoAccount);
try {
final ParsedResponse<Capabilities> response = ocsAPI.getCapabilities(lastETag).blockingSingle();
final Capabilities capabilities = response.getResponse();
final ParsedResponse<OcsResponse<Capabilities>> response = ocsAPI.getCapabilities(lastETag).blockingSingle();
final Capabilities capabilities = response.getResponse().ocs.data;
final Map<String, String> headers = response.getHeaders();
if (headers != null) {
capabilities.setETag(headers.get(HEADER_KEY_ETAG));
Expand All @@ -36,11 +40,33 @@ public static Capabilities getCapabilities(@NonNull Context context, @NonNull Si
return capabilities;
} catch (RuntimeException e) {
final Throwable cause = e.getCause();
if(cause != null) {
if (cause != null) {
throw cause;
} else {
throw e;
}
}
}

@WorkerThread
@Nullable
public static String getDisplayName(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount) {
final OcsAPI ocsAPI = ApiProvider.getOcsAPI(context, ssoAccount);
try {
final Response<OcsResponse<OcsUser>> userResponse = ocsAPI.getUser(ssoAccount.userId).execute();
if (userResponse.isSuccessful()) {
final OcsResponse<OcsUser> ocsResponse = userResponse.body();
if (ocsResponse != null) {
return ocsResponse.ocs.data.displayName;
} else {
Log.w(TAG, "ocsResponse is null");
}
} else {
Log.w(TAG, "Fetching user was not successful.");
}
} catch (Throwable t) {
t.printStackTrace();
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public Result doWork() {
repo.updateBrand(account.getId(), capabilities.getColor(), capabilities.getTextColor());
repo.updateApiVersion(account.getId(), capabilities.getApiVersion());
Log.i(TAG, capabilities.toString());
repo.updateDisplayName(account.getId(), CapabilitiesClient.getDisplayName(getApplicationContext(), ssoAccount));
} catch (Throwable e) {
if (e instanceof NextcloudHttpRequestFailedException) {
if (((NextcloudHttpRequestFailedException) e).getStatusCode() == HttpURLConnection.HTTP_NOT_MODIFIED) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import it.niedermann.owncloud.notes.persistence.migration.Migration_19_20;
import it.niedermann.owncloud.notes.persistence.migration.Migration_20_21;
import it.niedermann.owncloud.notes.persistence.migration.Migration_21_22;
import it.niedermann.owncloud.notes.persistence.migration.Migration_22_23;
import it.niedermann.owncloud.notes.persistence.migration.Migration_9_10;

@Database(
Expand All @@ -42,7 +43,7 @@
CategoryOptions.class,
SingleNoteWidgetData.class,
NotesListWidgetData.class
}, version = 22
}, version = 23
)
@TypeConverters({Converters.class})
public abstract class NotesDatabase extends RoomDatabase {
Expand Down Expand Up @@ -76,7 +77,8 @@ private static NotesDatabase create(final Context context) {
new Migration_18_19(context),
new Migration_19_20(context),
new Migration_20_21(),
new Migration_21_22(context)
new Migration_21_22(context),
new Migration_22_23()
)
.fallbackToDestructiveMigrationOnDowngrade()
.fallbackToDestructiveMigration()
Expand Down
Loading