Escape string within Full Text Search.

Fixes #8975
This commit is contained in:
Alan Evans 2019-08-09 12:49:57 -04:00 committed by Greyson Parrelli
parent 942154a61f
commit a58f564d1e

View file

@ -1,6 +1,8 @@
package org.thoughtcrime.securesms.database;
import android.content.Context;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.annimon.stream.Stream;
@ -9,9 +11,6 @@ import net.sqlcipher.Cursor;
import net.sqlcipher.database.SQLiteDatabase;
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
import org.thoughtcrime.securesms.util.Util;
import java.util.List;
/**
* Contains all databases necessary for full-text search (FTS).
@ -112,31 +111,48 @@ public class SearchDatabase extends Database {
}
public Cursor queryMessages(@NonNull String query) {
SQLiteDatabase db = databaseHelper.getReadableDatabase();
String prefixQuery = adjustQuery(query);
SQLiteDatabase db = databaseHelper.getReadableDatabase();
String fullTextSearchQuery = createFullTextSearchQuery(query);
if (TextUtils.isEmpty(fullTextSearchQuery)) {
return null;
}
Cursor cursor = db.rawQuery(MESSAGES_QUERY, new String[] { fullTextSearchQuery,
fullTextSearchQuery });
Cursor cursor = db.rawQuery(MESSAGES_QUERY, new String[] { prefixQuery, prefixQuery });
setNotifyConverationListListeners(cursor);
return cursor;
}
public Cursor queryMessages(@NonNull String query, long threadId) {
SQLiteDatabase db = databaseHelper.getReadableDatabase();
String prefixQuery = adjustQuery(query);
SQLiteDatabase db = databaseHelper.getReadableDatabase();
String fullTextSearchQuery = createFullTextSearchQuery(query);
if (TextUtils.isEmpty(fullTextSearchQuery)) {
return null;
}
Cursor cursor = db.rawQuery(MESSAGES_FOR_THREAD_QUERY, new String[] { fullTextSearchQuery,
String.valueOf(threadId),
fullTextSearchQuery,
String.valueOf(threadId) });
Cursor cursor = db.rawQuery(MESSAGES_FOR_THREAD_QUERY, new String[] { prefixQuery, String.valueOf(threadId), prefixQuery, String.valueOf(threadId) });
setNotifyConverationListListeners(cursor);
return cursor;
}
private String adjustQuery(@NonNull String query) {
List<String> tokens = Stream.of(query.split(" ")).filter(s -> s.trim().length() > 0).toList();
String prefixQuery = Util.join(tokens, "* ");
private static String createFullTextSearchQuery(@NonNull String query) {
return Stream.of(query.split(" "))
.map(String::trim)
.filter(s -> s.length() > 0)
.map(SearchDatabase::fullTextSearchEscape)
.collect(StringBuilder::new, (sb, s) -> sb.append(s).append("* "))
.toString();
}
prefixQuery += "*";
return prefixQuery;
private static String fullTextSearchEscape(String s) {
return "\"" + s.replace("\"", "\"\"") + "\"";
}
}