Switch to warning flag for authentication failures

This commit is contained in:
M66B 2019-07-09 11:02:43 +02:00
parent 3d814f5ff9
commit 6032fad099
9 changed files with 117 additions and 73 deletions

6
FAQ.md
View File

@ -1624,9 +1624,9 @@ This is why texts with dots are sometimes incorrectly recognized as links, which
Spam filtering, verification of the [DKIM](https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail) signature
and [SPF](https://en.wikipedia.org/wiki/Sender_Policy_Framework) authorization is a task of email servers, not of an email client.
However, FairEmail can show a small vertical warning stripe at the end of the message header
if DKIM, SPF or [DMARC](https://en.wikipedia.org/wiki/DMARC) authentication failed on the receiving server.
You can enable this in the settings.
However, FairEmail will show a small warning flag
when DKIM, SPF or [DMARC](https://en.wikipedia.org/wiki/DMARC) authentication failed on the receiving server.
You can enable/disable this in the miscellaneous settings.
<br />

View File

@ -47,6 +47,7 @@ This app starts a foreground service with a low priority status bar notification
* Confirm showing images to prevent tracking
* Confirm opening links to prevent tracking and phishing
* Automatically recognize and disable tracking images
* Warn when a message could not be [authenticated](https://github.com/M66B/open-source-email/blob/master/FAQ.md#user-content-faq92)
## Pro features

View File

@ -207,7 +207,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
BottomNavigationView.OnNavigationItemSelectedListener, View.OnLongClickListener {
private View view;
private View vwColor;
private View vwStatus;
private ImageView ivExpander;
private ImageView ivFlagged;
private ImageView ivAvatar;
@ -215,6 +214,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
private TextView tvSize;
private TextView tvTime;
private ImageView ivType;
private ImageView ivAuth;
private ImageView ivSnoozed;
private ImageView ivBrowsed;
private ImageView ivAnswered;
@ -309,7 +309,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
view = itemView.findViewById(R.id.clItem);
vwColor = itemView.findViewById(R.id.vwColor);
vwStatus = itemView.findViewById(R.id.vwStatus);
ivExpander = itemView.findViewById(R.id.ivExpander);
ivFlagged = itemView.findViewById(R.id.ivFlagged);
ivAvatar = itemView.findViewById(R.id.ivAvatar);
@ -317,6 +316,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
tvSize = itemView.findViewById(R.id.tvSize);
tvTime = itemView.findViewById(R.id.tvTime);
ivType = itemView.findViewById(R.id.ivType);
ivAuth = itemView.findViewById(R.id.ivAuth);
ivSnoozed = itemView.findViewById(R.id.ivSnoozed);
ivBrowsed = itemView.findViewById(R.id.ivBrowsed);
ivAnswered = itemView.findViewById(R.id.ivAnswered);
@ -518,7 +518,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
private void clear() {
vwColor.setVisibility(View.GONE);
vwStatus.setVisibility(View.GONE);
ivExpander.setVisibility(View.GONE);
ivFlagged.setVisibility(View.GONE);
ivAvatar.setVisibility(View.GONE);
@ -526,6 +525,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
tvSize.setText(null);
tvTime.setText(null);
ivType.setVisibility(View.GONE);
ivAuth.setVisibility(View.GONE);
ivSnoozed.setVisibility(View.GONE);
ivBrowsed.setVisibility(View.GONE);
ivAnswered.setVisibility(View.GONE);
@ -587,6 +587,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
tvSize.setAlpha(dim ? Helper.LOW_LIGHT : 1.0f);
tvTime.setAlpha(dim ? Helper.LOW_LIGHT : 1.0f);
ivType.setAlpha(dim ? Helper.LOW_LIGHT : 1.0f);
ivAuth.setAlpha(dim ? Helper.LOW_LIGHT : 1.0f);
ivSnoozed.setAlpha(dim ? Helper.LOW_LIGHT : 1.0f);
ivBrowsed.setAlpha(dim ? Helper.LOW_LIGHT : 1.0f);
ivAnswered.setAlpha(dim ? Helper.LOW_LIGHT : 1.0f);
@ -624,13 +625,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
vwColor.setBackgroundColor(message.accountColor == null ? Color.TRANSPARENT : message.accountColor);
vwColor.setVisibility(Helper.isPro(context) ? View.VISIBLE : View.INVISIBLE);
vwStatus.setBackgroundColor(
Boolean.FALSE.equals(message.dkim) ||
Boolean.FALSE.equals(message.spf) ||
Boolean.FALSE.equals(message.dmarc)
? colorAccent : Color.TRANSPARENT);
vwStatus.setVisibility(authentication ? View.VISIBLE : View.GONE);
// Expander
boolean expanded = (viewType == ViewType.THREAD && properties.getValue("expanded", message.id));
ivExpander.setImageLevel(expanded ? 0 /* less */ : 1 /* more */);
@ -650,6 +644,11 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
// Line 2
tvSubject.setText(message.subject);
boolean authenticated =
!(Boolean.FALSE.equals(message.dkim) ||
Boolean.FALSE.equals(message.spf) ||
Boolean.FALSE.equals(message.dmarc));
// Line 3
ivType.setImageResource(message.drafts > 0
? R.drawable.baseline_edit_24 : EntityFolder.getIcon(message.folderType));
@ -657,6 +656,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
(viewType == ViewType.UNIFIED && !EntityFolder.INBOX.equals(message.folderType)) ||
(viewType == ViewType.THREAD && EntityFolder.SENT.equals(message.folderType))
? View.VISIBLE : View.GONE);
ivAuth.setVisibility(authentication && !authenticated ? View.VISIBLE : View.GONE);
ivSnoozed.setVisibility(message.ui_snoozed == null ? View.GONE : View.VISIBLE);
ivBrowsed.setVisibility(message.ui_browsed ? View.VISIBLE : View.GONE);
ivAnswered.setVisibility(message.ui_answered ? View.VISIBLE : View.GONE);
@ -2918,7 +2918,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
this.contrast = prefs.getBoolean("contrast", false);
this.monospaced = prefs.getBoolean("monospaced", false);
this.autoimages = (this.contacts && prefs.getBoolean("autoimages", false));
this.authentication = prefs.getBoolean("authentication", false);
this.authentication = prefs.getBoolean("authentication", true);
this.debug = prefs.getBoolean("debug", false);
AsyncDifferConfig<TupleMessageEx> config = new AsyncDifferConfig.Builder<>(DIFF_CALLBACK)

View File

@ -243,7 +243,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swSubscribedOnly.setChecked(prefs.getBoolean("subscribed_only", false));
swEnglish.setChecked(prefs.getBoolean("english", false));
swAuthentication.setChecked(prefs.getBoolean("authentication", false));
swAuthentication.setChecked(prefs.getBoolean("authentication", true));
swWatchdog.setChecked(prefs.getBoolean("watchdog", true));
swUpdates.setChecked(prefs.getBoolean("updates", true));
swUpdates.setVisibility(Helper.isPlayStoreInstall(getContext()) ? View.GONE : View.VISIBLE);

View File

@ -23,9 +23,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_thread"
android:padding="12dp"
app:srcCompat="@drawable/baseline_message_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/baseline_message_24" />
<TextView
android:id="@+id/tvThread"
@ -45,9 +45,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_zoom"
android:padding="12dp"
app:srcCompat="@drawable/baseline_format_size_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivThread" />
app:layout_constraintTop_toBottomOf="@id/ivThread"
app:srcCompat="@drawable/baseline_format_size_24" />
<TextView
android:id="@+id/tvZoom"
@ -67,9 +67,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_draft"
android:padding="12dp"
app:srcCompat="@drawable/baseline_edit_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivZoom" />
app:layout_constraintTop_toBottomOf="@id/ivZoom"
app:srcCompat="@drawable/baseline_edit_24" />
<TextView
android:id="@+id/tvDraft"
@ -83,15 +83,38 @@
app:layout_constraintStart_toEndOf="@id/ivDraft"
app:layout_constraintTop_toTopOf="@id/ivDraft" />
<ImageView
android:id="@+id/ivAuth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_auth"
android:padding="12dp"
android:tint="?colorError"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivDraft"
app:srcCompat="@drawable/baseline_flag_24" />
<TextView
android:id="@+id/tvAuth"
android:layout_width="0dp"
android:layout_height="0dp"
android:gravity="center_vertical"
android:text="@string/title_legend_auth"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintBottom_toBottomOf="@id/ivAuth"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/ivAuth"
app:layout_constraintTop_toTopOf="@id/ivAuth" />
<ImageView
android:id="@+id/ivSnoozed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_snoozed"
android:padding="12dp"
app:srcCompat="@drawable/baseline_timelapse_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivDraft" />
app:layout_constraintTop_toBottomOf="@id/ivAuth"
app:srcCompat="@drawable/baseline_timelapse_24" />
<TextView
android:id="@+id/tvSnoozed"
@ -111,9 +134,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_browsed"
android:padding="12dp"
app:srcCompat="@drawable/baseline_playlist_add_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivSnoozed" />
app:layout_constraintTop_toBottomOf="@id/ivSnoozed"
app:srcCompat="@drawable/baseline_playlist_add_24" />
<TextView
android:id="@+id/tvBrowsed"
@ -133,9 +156,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_answered"
android:padding="12dp"
app:srcCompat="@drawable/baseline_reply_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivBrowsed" />
app:layout_constraintTop_toBottomOf="@id/ivBrowsed"
app:srcCompat="@drawable/baseline_reply_24" />
<TextView
android:id="@+id/tvAnswered"
@ -155,9 +178,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_plain_only"
android:padding="12dp"
app:srcCompat="@drawable/baseline_notes_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivAnswered" />
app:layout_constraintTop_toBottomOf="@id/ivAnswered"
app:srcCompat="@drawable/baseline_notes_24" />
<TextView
android:id="@+id/tvPlain"
@ -177,9 +200,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_receipt"
android:padding="12dp"
app:srcCompat="@drawable/baseline_playlist_add_check_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivPlain" />
app:layout_constraintTop_toBottomOf="@id/ivPlain"
app:srcCompat="@drawable/baseline_playlist_add_check_24" />
<TextView
android:id="@+id/tvReceipt"
@ -199,9 +222,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_attachment"
android:padding="12dp"
app:srcCompat="@drawable/baseline_attachment_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivReceipt" />
app:layout_constraintTop_toBottomOf="@id/ivReceipt"
app:srcCompat="@drawable/baseline_attachment_24" />
<TextView
android:id="@+id/tvAttachment"
@ -221,9 +244,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_flagged"
android:padding="12dp"
app:srcCompat="@drawable/baseline_star_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvAttachment" />
app:layout_constraintTop_toBottomOf="@id/tvAttachment"
app:srcCompat="@drawable/baseline_star_24" />
<TextView
android:id="@+id/tvStarred"
@ -243,9 +266,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_contacts"
android:padding="12dp"
app:srcCompat="@drawable/baseline_import_contacts_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivStarred" />
app:layout_constraintTop_toBottomOf="@id/ivStarred"
app:srcCompat="@drawable/baseline_import_contacts_24" />
<TextView
android:id="@+id/tvContacts"
@ -265,9 +288,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_search"
android:padding="12dp"
app:srcCompat="@drawable/baseline_search_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivContacts" />
app:layout_constraintTop_toBottomOf="@id/ivContacts"
app:srcCompat="@drawable/baseline_search_24" />
<TextView
android:id="@+id/tvSearch"
@ -287,9 +310,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_view"
android:padding="12dp"
app:srcCompat="@drawable/baseline_visibility_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivSearch" />
app:layout_constraintTop_toBottomOf="@id/ivSearch"
app:srcCompat="@drawable/baseline_visibility_24" />
<TextView
android:id="@+id/tvView"
@ -309,9 +332,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_hide"
android:padding="12dp"
app:srcCompat="@drawable/baseline_visibility_off_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivView" />
app:layout_constraintTop_toBottomOf="@id/ivView"
app:srcCompat="@drawable/baseline_visibility_off_24" />
<TextView
android:id="@+id/tvHide"
@ -331,9 +354,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_download"
android:padding="12dp"
app:srcCompat="@drawable/baseline_cloud_download_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivHide" />
app:layout_constraintTop_toBottomOf="@id/ivHide"
app:srcCompat="@drawable/baseline_cloud_download_24" />
<TextView
android:id="@+id/tvDownload"
@ -353,9 +376,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_external_image"
android:padding="12dp"
app:srcCompat="@drawable/baseline_image_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivDownload" />
app:layout_constraintTop_toBottomOf="@id/ivDownload"
app:srcCompat="@drawable/baseline_image_24" />
<TextView
android:id="@+id/tvExternalImage"
@ -375,9 +398,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_embedded_image"
android:padding="12dp"
app:srcCompat="@drawable/baseline_photo_library_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivExternalImage" />
app:layout_constraintTop_toBottomOf="@id/ivExternalImage"
app:srcCompat="@drawable/baseline_photo_library_24" />
<TextView
android:id="@+id/tvEmbeddedImage"
@ -397,9 +420,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_broken_image"
android:padding="12dp"
app:srcCompat="@drawable/baseline_broken_image_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivEmbeddedImage" />
app:layout_constraintTop_toBottomOf="@id/ivEmbeddedImage"
app:srcCompat="@drawable/baseline_broken_image_24" />
<TextView
android:id="@+id/tvBrokenImage"

View File

@ -107,13 +107,26 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swEnglish" />
<ImageView
android:id="@+id/ivAuth"
android:layout_width="21dp"
android:layout_height="21dp"
android:contentDescription="@string/title_legend_auth"
android:src="@drawable/baseline_flag_24"
android:tint="?colorError"
app:layout_constraintBottom_toBottomOf="@+id/swAuthentication"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/swAuthentication" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swAuthentication"
android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_marginTop="12dp"
android:text="@string/title_advanced_authentication"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/ivAuth"
app:layout_constraintTop_toBottomOf="@id/tvEnglishHint"
app:switchPadding="12dp" />

View File

@ -115,6 +115,18 @@
app:layout_constraintStart_toEndOf="@id/paddingStart"
app:layout_constraintTop_toTopOf="@+id/tvSubject" />
<ImageView
android:id="@+id/ivAuth"
android:layout_width="21dp"
android:layout_height="21dp"
android:layout_marginStart="6dp"
android:contentDescription="@string/title_legend_auth"
android:src="@drawable/baseline_flag_24"
android:tint="?colorError"
app:layout_constraintBottom_toBottomOf="@+id/tvSubject"
app:layout_constraintStart_toEndOf="@id/ivType"
app:layout_constraintTop_toTopOf="@+id/tvSubject" />
<ImageView
android:id="@+id/ivSnoozed"
android:layout_width="21dp"
@ -123,7 +135,7 @@
android:contentDescription="@string/title_legend_snoozed"
android:src="@drawable/baseline_timelapse_24"
app:layout_constraintBottom_toBottomOf="@+id/tvSubject"
app:layout_constraintStart_toEndOf="@id/ivType"
app:layout_constraintStart_toEndOf="@id/ivAuth"
app:layout_constraintTop_toTopOf="@+id/tvSubject" />
<ImageView
@ -287,15 +299,6 @@
android:layout_width="6dp"
android:layout_height="0dp"
android:visibility="gone"
app:layout_constraintEnd_toStartOf="@+id/vwStatus"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/vwStatus"
android:layout_width="6dp"
android:layout_height="0dp"
android:background="@color/colorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/paddingBottom"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

View File

@ -140,6 +140,18 @@
app:layout_constraintStart_toEndOf="@id/ivAvatar"
app:layout_constraintTop_toTopOf="@+id/tvFolder" />
<ImageView
android:id="@+id/ivAuth"
android:layout_width="21dp"
android:layout_height="21dp"
android:layout_marginStart="6dp"
android:contentDescription="@string/title_legend_auth"
android:src="@drawable/baseline_flag_24"
android:tint="?colorError"
app:layout_constraintBottom_toBottomOf="@+id/tvFolder"
app:layout_constraintStart_toEndOf="@id/ivType"
app:layout_constraintTop_toTopOf="@+id/tvFolder" />
<ImageView
android:id="@+id/ivSnoozed"
android:layout_width="21dp"
@ -148,7 +160,7 @@
android:contentDescription="@string/title_legend_snoozed"
android:src="@drawable/baseline_timelapse_24"
app:layout_constraintBottom_toBottomOf="@+id/tvFolder"
app:layout_constraintStart_toEndOf="@id/ivType"
app:layout_constraintStart_toEndOf="@id/ivAuth"
app:layout_constraintTop_toTopOf="@+id/tvFolder" />
<ImageView
@ -282,15 +294,6 @@
android:layout_width="6dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="@+id/paddingBottom"
app:layout_constraintEnd_toStartOf="@+id/vwStatus"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/vwStatus"
android:layout_width="6dp"
android:layout_height="0dp"
android:background="@color/colorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/paddingBottom"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

View File

@ -643,6 +643,7 @@
<string name="title_legend_thread">Conversation</string>
<string name="title_legend_zoom">Change text size</string>
<string name="title_legend_draft">Has draft</string>
<string name="title_legend_auth">Authentication failed</string>
<string name="title_legend_snoozed">Is snoozed</string>
<string name="title_legend_browsed">Is browsed or searched</string>
<string name="title_legend_answered">Has been answered</string>