From e0f7c681851a87644cdf6aa90e19aeaaffad4368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Carr?= Date: Mon, 24 Aug 2020 19:59:15 -0700 Subject: [PATCH] Fix bug with multiple Shaarli accounts --- Shaarlier.iml | 2 +- app/app.iml | 6 +- .../helpers/RestAPINetworkManager.java | 6 +- .../shaarlier/services/NetworkService.java | 98 ++++++++----------- .../shaarlier/utils/ShaarliAccount.java | 7 +- 5 files changed, 54 insertions(+), 65 deletions(-) diff --git a/Shaarlier.iml b/Shaarlier.iml index 961c171..54678ba 100644 --- a/Shaarlier.iml +++ b/Shaarlier.iml @@ -1,5 +1,5 @@ - + diff --git a/app/app.iml b/app/app.iml index 76e59d7..a913e83 100644 --- a/app/app.iml +++ b/app/app.iml @@ -1,5 +1,5 @@ - + @@ -19,8 +19,8 @@ diff --git a/app/src/main/java/com/dimtion/shaarlier/helpers/RestAPINetworkManager.java b/app/src/main/java/com/dimtion/shaarlier/helpers/RestAPINetworkManager.java index da0f030..408685e 100644 --- a/app/src/main/java/com/dimtion/shaarlier/helpers/RestAPINetworkManager.java +++ b/app/src/main/java/com/dimtion/shaarlier/helpers/RestAPINetworkManager.java @@ -183,6 +183,7 @@ public void pushLink(Link link) throws IOException { * @return */ private Connection newConnection(String url, Connection.Method method) { + Log.i("RestAPI", "Creating new connection " + url + " : " + method); return Jsoup.connect(url) .header("Authorization", "Bearer " + this.getJwt()) .header("Content-Type", "application/json") @@ -215,13 +216,14 @@ public List retrieveTags() throws Exception { * @return JWT encoded in base 64 */ String getJwt() { - // TODO: we are obligated to stay with jjwt 0.9.1 because of Shaarli week keys + // TODO: we are obligated to stay with jjwt 0.9.1 because of Shaarli weak keys + Log.i("JWT", "Generating JWT for account " + this.mAccount); // iat in the payload Date date = new Date(); // During debugging I found that given that some servers and phones are not absolutely in sync // It happens that the token would looked like being generated in the future - // To compensate that we remove 5 from the actual date. + // To compensate that we remove 5 seconds from the actual date. date.setTime(date.getTime() - 5000); // The key used to sign the token, you can find it by logging to your Shaarli instance // and then going to "Tools" diff --git a/app/src/main/java/com/dimtion/shaarlier/services/NetworkService.java b/app/src/main/java/com/dimtion/shaarlier/services/NetworkService.java index ccb9ceb..a152cbc 100644 --- a/app/src/main/java/com/dimtion/shaarlier/services/NetworkService.java +++ b/app/src/main/java/com/dimtion/shaarlier/services/NetworkService.java @@ -19,7 +19,6 @@ import android.widget.Toast; import com.dimtion.shaarlier.R; -import com.dimtion.shaarlier.helpers.AccountsSource; import com.dimtion.shaarlier.helpers.NetworkManager; import com.dimtion.shaarlier.helpers.NetworkUtils; import com.dimtion.shaarlier.utils.Link; @@ -50,7 +49,6 @@ public class NetworkService extends IntentService { private Context mContext; private Handler mToastHandler; private Exception mError; - private ShaarliAccount mShaarliAccount; private String loadedDescription; public NetworkService() { @@ -77,6 +75,7 @@ protected void onHandleIntent(Intent intent) { Exception object = shaarliLstatus == NETWORK_ERROR ? mError : null; sendBackMessage(intent, shaarliLstatus, object); break; + case INTENT_POST: Link link = (Link) intent.getSerializableExtra("link"); @@ -88,26 +87,14 @@ protected void onHandleIntent(Intent intent) { link.setDescription(this.loadedDescription); this.loadedDescription = null; } - long accountId = intent.getLongExtra("chosenAccountId", -1); - - try { - AccountsSource acs = new AccountsSource(this); - mShaarliAccount = (accountId != -1 ? acs.getShaarliAccountById(accountId) : acs.getDefaultAccount()); - } catch (Exception e) { - e.printStackTrace(); - sendNotificationShareError(link); - } postLink(link); stopSelf(); break; + case INTENT_PREFETCH: Link sharedLink = (Link) intent.getSerializableExtra("link"); - mShaarliAccount = sharedLink.getAccount(); - Link prefetchedLink = prefetchLink(sharedLink); - sendBackMessage(intent, PREFETCH_LINK, prefetchedLink); - break; case INTENT_RETRIEVE_TITLE_AND_DESCRIPTION: @@ -152,43 +139,6 @@ private void sendBackMessage(@NonNull Intent intent, int message_id, @Nullable O } } - /** - * Display Toast in the main thread - * Thanks : http://stackoverflow.com/a/3955826 - */ - private class DisplayToast implements Runnable{ - private final String mText; - - public DisplayToast(String text){ - mText = text; - } - - public void run(){ - Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show(); - } - } - - /** - * Check if the given credentials are correct - * @param account The account with the credentials - * @return NO_ERROR if nothing is wrong - */ - private int checkShaarli(ShaarliAccount account){ - NetworkManager manager = NetworkUtils.getNetworkManager(account); - try { - if (!manager.isCompatibleShaarli()) { - return TOKEN_ERROR; - } - if (!manager.login()) { - return LOGIN_ERROR; - } - } catch (IOException e) { - mError = e; - return NETWORK_ERROR; - } - return NO_ERROR; - } - /** * Try to prefetch the data of the link * Will return exactly the same link if the link does not exist @@ -205,7 +155,7 @@ private Link prefetchLink(Link sharedLink) { if (manager.isCompatibleShaarli() && manager.login()) { prefetchedLink = manager.prefetchLinkData(sharedLink); } else { - mError = new Exception("Could not connect to the shaarli. Possibles causes : unhandled shaarli, bad username or password"); + mError = new Exception("Could not connect to shaarli. Possibles causes: unhandled shaarli, bad username or password"); Log.e("ERROR", mError.getMessage()); } } catch (IOException | NullPointerException e) { @@ -215,12 +165,33 @@ private Link prefetchLink(Link sharedLink) { return prefetchedLink; } + /** + * Check if the given credentials are correct + * + * @param account The account with the credentials + * @return NO_ERROR if nothing is wrong + */ + private int checkShaarli(ShaarliAccount account) { + NetworkManager manager = NetworkUtils.getNetworkManager(account); + try { + if (!manager.isCompatibleShaarli()) { + return TOKEN_ERROR; + } + if (!manager.login()) { + return LOGIN_ERROR; + } + } catch (IOException e) { + mError = e; + return NETWORK_ERROR; + } + return NO_ERROR; + } private void postLink(Link link) { boolean posted = true; // Assume it is shared try { // Connect the user to the site : - NetworkManager manager = NetworkUtils.getNetworkManager(mShaarliAccount); + NetworkManager manager = NetworkUtils.getNetworkManager(link.getAccount()); if (manager.isCompatibleShaarli() && manager.login()) { manager.pushLink(link); } else { @@ -241,13 +212,30 @@ private void postLink(Link link) { } } + /** + * Display Toast in the main thread + * Thanks: http://stackoverflow.com/a/3955826 + */ + private class DisplayToast implements Runnable { + private final String mText; + + public DisplayToast(String text) { + mText = text; + } + + public void run() { + Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show(); + } + } + /** * Retrieve the title of a page + * * @param url the page to get the title * @return the title page, "" if there is an error */ @NonNull - private String[] getPageTitleAndDescription(String url){ + private String[] getPageTitleAndDescription(String url) { return NetworkUtils.loadTitleAndDescription(url); } diff --git a/app/src/main/java/com/dimtion/shaarlier/utils/ShaarliAccount.java b/app/src/main/java/com/dimtion/shaarlier/utils/ShaarliAccount.java index 19da2b3..f6e2834 100644 --- a/app/src/main/java/com/dimtion/shaarlier/utils/ShaarliAccount.java +++ b/app/src/main/java/com/dimtion/shaarlier/utils/ShaarliAccount.java @@ -24,12 +24,11 @@ public class ShaarliAccount implements Serializable { @NonNull @Override public String toString() { - if (!this.shortName.equals("")) { + if (this.shortName != null && !this.shortName.equals("")) { return shortName; - } else if (!this.username.equals("")) { - return this.username; + } else { + return this.urlShaarli; } - return this.urlShaarli; } public long getId() {