Fix up whitespace tagging and tag detection prompt.

1) Fix up the whitespace tagging so that it's a little more strict.

2) Don't display whitespace tags that we add to our own messages.

3) Make the tag detection prompt a little more visually pleasing.
This commit is contained in:
Moxie Marlinspike 2012-09-07 21:21:12 -07:00
parent 4c3b7cbe08
commit f39b8e5fc8
6 changed files with 55 additions and 18 deletions

View File

@ -9,12 +9,15 @@
<TextView android:id="@+id/description_text" <TextView android:id="@+id/description_text"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip" android:layout_marginBottom="5dip"
android:text="@string/you_have_received_a_message_from_someone_who_supports_textsecure_encrypted_sessions_would_you_like_to_initiate_a_key_exchange_so_you_can_communicate_securely"/> android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/you_have_received_a_message_from_someone_who_supports_textsecure_encrypted_sessions_would_you_like_to_initiate_a_secure_session"/>
<LinearLayout android:layout_width="fill_parent" <LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dip" android:layout_marginTop="10dip"
android:layout_marginBottom="10dip"
android:orientation="horizontal"> android:orientation="horizontal">
<Button android:id="@+id/initiate_button" <Button android:id="@+id/initiate_button"

View File

@ -204,7 +204,7 @@
<string name="most_recent_from_s">Most recent from: %s</string> <string name="most_recent_from_s">Most recent from: %s</string>
<!-- auto_initiate_activity --> <!-- auto_initiate_activity -->
<string name="you_have_received_a_message_from_someone_who_supports_textsecure_encrypted_sessions_would_you_like_to_initiate_a_key_exchange_so_you_can_communicate_securely">You have received a message from someone who supports TextSecure encrypted sessions. Would you like to initiate a key exchange so you can communicate securely?</string> <string name="you_have_received_a_message_from_someone_who_supports_textsecure_encrypted_sessions_would_you_like_to_initiate_a_secure_session">You have received a message from someone who supports TextSecure encrypted sessions. Would you like to initiate a secure session?</string>
<string name="initiate_exchange">Initiate Exchange</string> <string name="initiate_exchange">Initiate Exchange</string>
<!-- change_passphrase_activity --> <!-- change_passphrase_activity -->

View File

@ -30,6 +30,7 @@ import org.thoughtcrime.securesms.crypto.KeyExchangeInitiator;
import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.LocalKeyRecord; import org.thoughtcrime.securesms.database.LocalKeyRecord;
import org.thoughtcrime.securesms.database.RemoteKeyRecord; import org.thoughtcrime.securesms.database.RemoteKeyRecord;
import org.thoughtcrime.securesms.protocol.Tag;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.MemoryCleaner; import org.thoughtcrime.securesms.util.MemoryCleaner;
@ -98,13 +99,9 @@ public class AutoInitiateActivity extends SherlockActivity {
Recipient recipient, String message, long threadId) Recipient recipient, String message, long threadId)
{ {
return return
isMessageTagged(message) && Tag.isTagged(message) &&
isThreadQualified(context, threadId) && isThreadQualified(context, threadId) &&
isExchangeQualified(context, masterSecret, recipient); isExchangeQualified(context, masterSecret, recipient);
}
private static boolean isMessageTagged(String message) {
return message.endsWith(" ");
} }
private static boolean isThreadQualified(Context context, long threadId) { private static boolean isThreadQualified(Context context, long threadId) {

View File

@ -23,7 +23,6 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
@ -59,6 +58,7 @@ import org.thoughtcrime.securesms.mms.AttachmentManager;
import org.thoughtcrime.securesms.mms.AttachmentTypeSelectorAdapter; import org.thoughtcrime.securesms.mms.AttachmentTypeSelectorAdapter;
import org.thoughtcrime.securesms.mms.MediaTooLargeException; import org.thoughtcrime.securesms.mms.MediaTooLargeException;
import org.thoughtcrime.securesms.mms.SlideDeck; import org.thoughtcrime.securesms.mms.SlideDeck;
import org.thoughtcrime.securesms.protocol.Tag;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientFormattingException; import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
import org.thoughtcrime.securesms.recipients.Recipients; import org.thoughtcrime.securesms.recipients.Recipients;
@ -542,14 +542,13 @@ public class ConversationActivity extends SherlockFragmentActivity
} }
private String getMessage() throws InvalidMessageException { private String getMessage() throws InvalidMessageException {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); String rawText = composeText.getText().toString();
String rawText = composeText.getText().toString();
if (rawText.length() < 1 && !attachmentManager.isAttachmentPresent()) if (rawText.length() < 1 && !attachmentManager.isAttachmentPresent())
throw new InvalidMessageException(getString(R.string.message_is_empty_exclamation)); throw new InvalidMessageException(getString(R.string.message_is_empty_exclamation));
if (!sendEncrypted && sp.getBoolean(ApplicationPreferencesActivity.WHITESPACE_PREF, true) && rawText.length() <= 145) if (!sendEncrypted && Tag.isTaggable(this, rawText))
rawText = rawText + " "; rawText = Tag.getTaggedMessage(rawText);
return rawText; return rawText;
} }

View File

@ -47,6 +47,7 @@ import org.thoughtcrime.securesms.database.MmsDatabase;
import org.thoughtcrime.securesms.database.MmsMessageRecord; import org.thoughtcrime.securesms.database.MmsMessageRecord;
import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.mms.SlideDeck; import org.thoughtcrime.securesms.mms.SlideDeck;
import org.thoughtcrime.securesms.protocol.Tag;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientFactory; import org.thoughtcrime.securesms.recipients.RecipientFactory;
import org.thoughtcrime.securesms.recipients.RecipientFormattingException; import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
@ -211,10 +212,11 @@ public class ConversationItem extends LinearLayout {
private void setBodyText(MessageRecord messageRecord) { private void setBodyText(MessageRecord messageRecord) {
String body = messageRecord.getBody(); String body = messageRecord.getBody();
if (messageRecord.isKeyExchange() && messageRecord.isOutgoing()) body = "\n" + getContext().getString(R.string.key_exchange_message2); if (messageRecord.isKeyExchange() && messageRecord.isOutgoing()) body = "\n" + getContext().getString(R.string.key_exchange_message2);
else if (messageRecord.isProcessedKeyExchange() && !messageRecord.isOutgoing()) body = "\n" + getContext().getString(R.string.received_and_processed_key_exchange_message); else if (messageRecord.isProcessedKeyExchange() && !messageRecord.isOutgoing()) body = "\n" + getContext().getString(R.string.received_and_processed_key_exchange_message);
else if (messageRecord.isStaleKeyExchange()) body = "\n" + getContext().getString(R.string.error_received_stale_key_exchange_message); else if (messageRecord.isStaleKeyExchange()) body = "\n" + getContext().getString(R.string.error_received_stale_key_exchange_message);
else if (messageRecord.isKeyExchange() && !messageRecord.isOutgoing()) body = "\n" + getContext().getString(R.string.received_key_exchange_message_click_to_process); else if (messageRecord.isKeyExchange() && !messageRecord.isOutgoing()) body = "\n" + getContext().getString(R.string.received_key_exchange_message_click_to_process);
else if (messageRecord.isOutgoing() && Tag.isTagged(body)) body = Tag.stripTag(body);
bodyText.setText(body, TextView.BufferType.SPANNABLE); bodyText.setText(body, TextView.BufferType.SPANNABLE);

View File

@ -0,0 +1,36 @@
package org.thoughtcrime.securesms.protocol;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
public class Tag {
public static final String WHITESPACE_TAG = " ";
public static boolean isTaggable(Context context, String message) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(ApplicationPreferencesActivity.WHITESPACE_PREF, true) &&
message.matches(".*[^\\s].*") &&
message.replaceAll("\\s+$", "").length() + WHITESPACE_TAG.length() <= 158;
}
public static boolean isTagged(String message) {
return message.matches(".*[^\\s]" + WHITESPACE_TAG + "$");
}
public static String getTaggedMessage(String message) {
return message.replaceAll("\\s+$", "") + WHITESPACE_TAG;
}
public static String stripTag(String message) {
if (isTagged(message))
return message.substring(0, message.length() - WHITESPACE_TAG.length());
return message;
}
}