diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-01-05 14:35:58 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2021-01-05 14:35:58 +0300 |
commit | dd8cf671c6eeba486a42e6074dcf1d7b270e447c (patch) | |
tree | a6131d90d8912e7b3a253aedde899fe01fb0d9e7 /app/src/main/java/it/niedermann | |
parent | c92f9d251f6795130539c123c41ac431589332e6 (diff) |
Ensure that internal notes links are not persisted
Diffstat (limited to 'app/src/main/java/it/niedermann')
5 files changed, 11 insertions, 122 deletions
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java index e220f3e6..754b4cb5 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java @@ -6,6 +6,7 @@ import android.graphics.Typeface; import android.os.Bundle; import android.text.Layout; import android.text.method.LinkMovementMethod; +import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; @@ -28,17 +29,15 @@ import com.nextcloud.android.sso.model.SingleSignOnAccount; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.FragmentNotePreviewBinding; import it.niedermann.owncloud.notes.persistence.NotesDatabase; -import it.niedermann.owncloud.notes.shared.model.DBNote; -import it.niedermann.owncloud.notes.shared.util.NoteLinksUtils; import it.niedermann.owncloud.notes.shared.util.SSOUtil; -import it.niedermann.owncloud.notes.shared.util.text.NoteLinksProcessor; -import it.niedermann.owncloud.notes.shared.util.text.TextProcessorChain; import static androidx.core.view.ViewCompat.isAttachedToWindow; import static it.niedermann.owncloud.notes.shared.util.NoteUtil.getFontSizeFromPreferences; public class NotePreviewFragment extends SearchableBaseNoteFragment implements OnRefreshListener { + private static final String TAG = NotePreviewFragment.class.getSimpleName(); + private String changedText; protected FragmentNotePreviewBinding binding; @@ -83,18 +82,20 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); binding.singleNoteContent.registerOnLinkClickCallback((link) -> { - if (NoteLinksUtils.isNoteLink(link)) { - final long noteRemoteId = NoteLinksUtils.extractNoteRemoteId(link); - final long noteLocalId = db.getLocalIdByRemoteId(this.note.getAccountId(), noteRemoteId); + try { + final long noteLocalId = db.getLocalIdByRemoteId(this.note.getAccountId(), Long.parseLong(link)); final Intent intent = new Intent(requireActivity().getApplicationContext(), EditNoteActivity.class); intent.putExtra(EditNoteActivity.PARAM_NOTE_ID, noteLocalId); startActivity(intent); return true; + } catch (NumberFormatException e) { + Log.v(TAG, "Clicked link \"" + link + "\" is not a " + Long.class.getSimpleName() + ". Do not try to treat it as another note."); + } catch (IllegalArgumentException e) { + Log.i(TAG, "It looks like \"" + link + "\" might be a remote id of a note, but a note with this remote id could not be found.", e); } return false; }); - final TextProcessorChain chain = defaultTextProcessorChain(note); - binding.singleNoteContent.setMarkdownString(chain.apply(note.getContent())); + binding.singleNoteContent.setMarkdownString(note.getContent()); binding.singleNoteContent.setMovementMethod(LinkMovementMethod.getInstance()); changedText = note.getContent(); @@ -131,12 +132,11 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O if (db.getNoteServerSyncHelper().isSyncPossible() && SSOUtil.isConfigured(getContext())) { binding.swiperefreshlayout.setRefreshing(true); try { - TextProcessorChain chain = defaultTextProcessorChain(note); SingleSignOnAccount ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(requireContext()); db.getNoteServerSyncHelper().addCallbackPull(ssoAccount, () -> { note = db.getNote(note.getAccountId(), note.getId()); changedText = note.getContent(); - binding.singleNoteContent.setMarkdownString(chain.apply(note.getContent())); + binding.singleNoteContent.setMarkdownString(note.getContent()); binding.swiperefreshlayout.setRefreshing(false); }); db.getNoteServerSyncHelper().scheduleSync(ssoAccount, false); @@ -156,12 +156,6 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O binding.singleNoteContent.setHighlightColor(getTextHighlightBackgroundColor(requireContext(), mainColor, colorPrimary, colorAccent)); } - private TextProcessorChain defaultTextProcessorChain(DBNote note) { - TextProcessorChain chain = new TextProcessorChain(); - chain.add(new NoteLinksProcessor(db.getRemoteIds(note.getAccountId()))); - return chain; - } - public static BaseNoteFragment newInstance(long accountId, long noteId) { final BaseNoteFragment fragment = new NotePreviewFragment(); final Bundle args = new Bundle(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteLinksUtils.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteLinksUtils.java deleted file mode 100644 index 668d2746..00000000 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteLinksUtils.java +++ /dev/null @@ -1,26 +0,0 @@ -package it.niedermann.owncloud.notes.shared.util; - -import it.niedermann.owncloud.notes.shared.util.text.NoteLinksProcessor; - -public class NoteLinksUtils { - - /** - * Tests if the given link is a note-link (which was transformed in {@link it.niedermann.owncloud.notes.shared.util.text.NoteLinksProcessor}) or not - * - * @param link Link under test - * @return true if the link is a note-link - */ - public static boolean isNoteLink(String link) { - return link.startsWith(NoteLinksProcessor.RELATIVE_LINK_WORKAROUND_PREFIX); - } - - /** - * Extracts the remoteId back from links that were transformed in {@link it.niedermann.owncloud.notes.shared.util.text.NoteLinksProcessor}. - * - * @param link Link that was transformed in {@link it.niedermann.owncloud.notes.shared.util.text.NoteLinksProcessor} - * @return the remoteId of the linked note - */ - public static long extractNoteRemoteId(String link) { - return Long.parseLong(link.replace(NoteLinksProcessor.RELATIVE_LINK_WORKAROUND_PREFIX, "")); - } -} diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/NoteLinksProcessor.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/NoteLinksProcessor.java deleted file mode 100644 index bc656dd8..00000000 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/NoteLinksProcessor.java +++ /dev/null @@ -1,57 +0,0 @@ -package it.niedermann.owncloud.notes.shared.util.text; - -import android.text.TextUtils; - -import java.util.HashSet; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import androidx.annotation.VisibleForTesting; - -public class NoteLinksProcessor extends TextProcessor { - - public static final String RELATIVE_LINK_WORKAROUND_PREFIX = "https://nextcloudnotes/notes/"; - - @VisibleForTesting - private static final String linksThatLookLikeNoteLinksRegEx = "\\[[^]]*]\\((\\d+)\\)"; - private static final String replaceNoteRemoteIdsRegEx = "\\[([^\\]]*)\\]\\((%s)\\)"; - - private final Set<String> existingNoteRemoteIds; - - public NoteLinksProcessor(Set<String> existingNoteRemoteIds) { - this.existingNoteRemoteIds = existingNoteRemoteIds; - } - - /** - * Replaces all links to other notes of the form `[<link-text>](<note-file-id>)` - * in the markdown string with links to a dummy url. - * - * Why is this needed? - * See discussion in issue #623 - * - * @return Markdown with all note-links replaced with dummy-url-links - */ - @Override - public String process(String s) { - return replaceNoteLinksWithDummyUrls(s, existingNoteRemoteIds); - } - - private static String replaceNoteLinksWithDummyUrls(String markdown, Set<String> existingNoteRemoteIds) { - Pattern noteLinkCandidates = Pattern.compile(linksThatLookLikeNoteLinksRegEx); - Matcher matcher = noteLinkCandidates.matcher(markdown); - - Set<String> noteRemoteIdsToReplace = new HashSet<>(); - while (matcher.find()) { - String presumedNoteId = matcher.group(1); - if (existingNoteRemoteIds.contains(presumedNoteId)) { - noteRemoteIdsToReplace.add(presumedNoteId); - } - } - - String noteRemoteIdsCondition = TextUtils.join("|", noteRemoteIdsToReplace); - Pattern replacePattern = Pattern.compile(String.format(replaceNoteRemoteIdsRegEx, noteRemoteIdsCondition)); - Matcher replaceMatcher = replacePattern.matcher(markdown); - return replaceMatcher.replaceAll(String.format("[$1](%s$2)", RELATIVE_LINK_WORKAROUND_PREFIX)); - } -} diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessor.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessor.java deleted file mode 100644 index 4eb4e4f7..00000000 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package it.niedermann.owncloud.notes.shared.util.text; - -abstract public class TextProcessor { - /** - * Applies a specified transformation on a text string and returns the updated string. - * @param s Text to transform - * @return Transformed text - */ - abstract public String process(String s); -}
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessorChain.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessorChain.java deleted file mode 100644 index 70af737a..00000000 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessorChain.java +++ /dev/null @@ -1,12 +0,0 @@ -package it.niedermann.owncloud.notes.shared.util.text; - -import java.util.LinkedList; - -public class TextProcessorChain extends LinkedList<TextProcessor> { - public String apply(String s) { - for (TextProcessor textProcessor : this) { - s = textProcessor.process(s); - } - return s; - } -} |