diff options
Diffstat (limited to 'app/src/main/java/fr/gouv/etalab/mastodon/client')
5 files changed, 105 insertions, 86 deletions
diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java index 280bcb735..f748d04f6 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java @@ -20,7 +20,6 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; -import android.util.Log; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -204,11 +203,11 @@ public class API { response = new HttpsConnection(context).get(nodeInfo.getHref(), 30, null, null); JSONObject resobj = new JSONObject(response); JSONObject jsonObject = resobj.getJSONObject("software"); - String name = "MASTODON"; + String name = jsonObject.getString("name").toUpperCase(); if( jsonObject.getString("name") != null ){ switch (jsonObject.getString("name").toUpperCase()){ - case "PEERTUBE": - name = "PEERTUBE"; + case "PLEROMA": + name = "MASTODON"; break; case "HUBZILLA": case "REDMATRIX": @@ -374,40 +373,45 @@ public class API { isPleromaAdmin(account.getAcct()); } } catch (HttpsConnection.HttpsConnectionException e) { - SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT); - HashMap<String, String> values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token()); - if( values.containsKey("access_token") && values.get("access_token") != null) { - targetedAccount.setToken(values.get("access_token")); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); - //This account is currently logged in, the token is updated - if( prefKeyOauthTokenT.equals(token)){ - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken()); - editor.apply(); - } - }if( values.containsKey("refresh_token") && values.get("refresh_token") != null) - targetedAccount.setRefresh_token(values.get("refresh_token")); - new AccountDAO(context, db).updateAccount(targetedAccount); - String response; - try { - response = new HttpsConnection(context).get(getAbsoluteUrl("/accounts/verify_credentials"), 60, null, targetedAccount.getToken()); - account = parseAccountResponse(context, new JSONObject(response)); - if( account.getSocial().equals("PLEROMA")){ - isPleromaAdmin(account.getAcct()); + e.printStackTrace(); + if( e.getStatusCode() == 401 || e.getStatusCode() == 403){ + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT); + if( targetedAccount == null) + return null; + HashMap<String, String> values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token()); + if( values.containsKey("access_token") && values.get("access_token") != null) { + targetedAccount.setToken(values.get("access_token")); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); + //This account is currently logged in, the token is updated + if( prefKeyOauthTokenT.equals(token)){ + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken()); + editor.apply(); + } + }if( values.containsKey("refresh_token") && values.get("refresh_token") != null) + targetedAccount.setRefresh_token(values.get("refresh_token")); + new AccountDAO(context, db).updateAccount(targetedAccount); + String response; + try { + response = new HttpsConnection(context).get(getAbsoluteUrl("/accounts/verify_credentials"), 60, null, targetedAccount.getToken()); + account = parseAccountResponse(context, new JSONObject(response)); + if( account.getSocial().equals("PLEROMA")){ + isPleromaAdmin(account.getAcct()); + } + } catch (IOException e1) { + e1.printStackTrace(); + } catch (NoSuchAlgorithmException e1) { + e1.printStackTrace(); + } catch (KeyManagementException e1) { + e1.printStackTrace(); + } catch (JSONException e1) { + e1.printStackTrace(); + } catch (HttpsConnection.HttpsConnectionException e1) { + e1.printStackTrace(); + setError(e.getStatusCode(), e); } - } catch (IOException e1) { - e1.printStackTrace(); - } catch (NoSuchAlgorithmException e1) { - e1.printStackTrace(); - } catch (KeyManagementException e1) { - e1.printStackTrace(); - } catch (JSONException e1) { - e1.printStackTrace(); - } catch (HttpsConnection.HttpsConnectionException e1) { - e1.printStackTrace(); - setError(e.getStatusCode(), e); } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); @@ -440,10 +444,6 @@ public class API { String token = resobj.get("access_token").toString(); if( resobj.has("refresh_token")) refresh_token = resobj.get("refresh_token").toString(); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, token); - editor.apply(); newValues.put("access_token",token); newValues.put("refresh_token",refresh_token); @@ -2220,8 +2220,9 @@ public class API { */ public Poll getPoll(Status status){ try { + Poll _p = (status.getReblog() != null)?status.getReblog().getPoll():status.getPoll(); HttpsConnection httpsConnection = new HttpsConnection(context); - String response = httpsConnection.get(getAbsoluteUrl(String.format("/polls/%s", status.getPoll().getId())), 60, null, prefKeyOauthTokenT); + String response = httpsConnection.get(getAbsoluteUrl(String.format("/polls/%s", _p.getId())), 60, null, prefKeyOauthTokenT); Poll poll = parsePoll(context, new JSONObject(response)); Bundle b = new Bundle(); status.setPoll(poll); @@ -2425,24 +2426,35 @@ public class API { parameters.append("exclude_types[]=").append("follow").append("&"); parameters.append("exclude_types[]=").append("favourite").append("&"); parameters.append("exclude_types[]=").append("reblog").append("&"); + parameters.append("exclude_types[]=").append("poll").append("&"); parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16)); params.put("exclude_types[]", parameters.toString()); }else if(type == DisplayNotificationsFragment.Type.FAVORITE){ parameters.append("exclude_types[]=").append("follow").append("&"); parameters.append("exclude_types[]=").append("mention").append("&"); parameters.append("exclude_types[]=").append("reblog").append("&"); + parameters.append("exclude_types[]=").append("poll").append("&"); parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16)); params.put("exclude_types[]", parameters.toString()); }else if(type == DisplayNotificationsFragment.Type.BOOST){ parameters.append("exclude_types[]=").append("follow").append("&"); parameters.append("exclude_types[]=").append("mention").append("&"); parameters.append("exclude_types[]=").append("favourite").append("&"); + parameters.append("exclude_types[]=").append("poll").append("&"); + parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16)); + params.put("exclude_types[]", parameters.toString()); + }else if(type == DisplayNotificationsFragment.Type.POOL){ + parameters.append("exclude_types[]=").append("reblog").append("&"); + parameters.append("exclude_types[]=").append("follow").append("&"); + parameters.append("exclude_types[]=").append("mention").append("&"); + parameters.append("exclude_types[]=").append("favourite").append("&"); parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16)); params.put("exclude_types[]", parameters.toString()); }else if(type == DisplayNotificationsFragment.Type.FOLLOW){ parameters.append("exclude_types[]=").append("reblog").append("&"); parameters.append("exclude_types[]=").append("mention").append("&"); parameters.append("exclude_types[]=").append("favourite").append("&"); + parameters.append("exclude_types[]=").append("poll").append("&"); parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16)); params.put("exclude_types[]", parameters.toString()); } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java index ff6b4feca..0ba3a6a4b 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java @@ -318,9 +318,7 @@ public class Status implements Parcelable{ public void setContent(String content) { //Remove UTM by default - this.content = content.replaceAll("&utm_\\w+=[0-9a-zA-Z._-]*", ""); - this.content = this.content.replaceAll("&utm_\\w+=[0-9a-zA-Z._-]*", ""); - this.content = this.content.replaceAll("\\?utm_\\w+=[0-9a-zA-Z._-]*", "?"); + this.content = Helper.remove_tracking_param(content); } public Status getReblog() { @@ -888,10 +886,10 @@ public class Status implements Parcelable{ } SpannableString spannableStringT; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - spannableStringT = new SpannableString(Html.fromHtml(spannableString.toString().replaceAll("^<p>","").replaceAll("<p>","<br/><br/>").replaceAll("</p>",""), Html.FROM_HTML_MODE_LEGACY)); + spannableStringT = new SpannableString(Html.fromHtml(spannableString.toString().replaceAll("^<p>","").replaceAll("<p>","<br/><br/>").replaceAll("</p>","").replaceAll("<br />","<br/>").replaceAll("[\\s]{2}"," "), Html.FROM_HTML_MODE_LEGACY)); else //noinspection deprecation - spannableStringT = new SpannableString(Html.fromHtml(spannableString.toString().replaceAll("^<p>","").replaceAll("<p>","<br/><br/>").replaceAll("</p>",""))); + spannableStringT = new SpannableString(Html.fromHtml(spannableString.toString().replaceAll("^<p>","").replaceAll("<p>","<br/><br/>").replaceAll("</p>","").replaceAll("<br />","<br/>").replaceAll("[\\s]{2}"," "))); URLSpan[] spans = spannableStringT.getSpans(0, spannableStringT.length(), URLSpan.class); for (URLSpan span : spans) { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Version.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Version.java index 9c6ceb501..42cdac5ba 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Version.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Version.java @@ -19,6 +19,10 @@ public class Version implements Comparable<Version> { public Version(String version) { if(version == null) version = "2.1"; + if( version.contains("+")){ + String[] versionA = version.split("\\+"); + version = versionA[0]; + } if( version.endsWith(".")) version = version.substring(0, version.length() - 1); version = version.replaceAll("[^\\d.]", ""); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java index c78feaea2..deba58833 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java @@ -20,7 +20,6 @@ import android.database.sqlite.SQLiteDatabase; import android.os.Build; import android.text.Html; import android.text.SpannableString; -import android.util.Log; import com.google.common.io.ByteStreams; import com.google.gson.JsonObject; @@ -66,6 +65,7 @@ import fr.gouv.etalab.mastodon.asynctasks.UpdateAccountInfoAsyncTask; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Attachment; import fr.gouv.etalab.mastodon.client.Entities.Error; +import fr.gouv.etalab.mastodon.helper.FileNameCleaner; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnDownloadInterface; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveAttachmentInterface; @@ -154,6 +154,8 @@ public class HttpsConnection { httpsURLConnection.setConnectTimeout(timeout * 1000); httpsURLConnection.setRequestProperty("http.keepAlive", "false"); httpsURLConnection.setRequestProperty("User-Agent", Helper.USER_AGENT); + httpsURLConnection.setRequestProperty("Content-Type", "application/json"); + httpsURLConnection.setRequestProperty("Accept", "application/json"); httpsURLConnection.setSSLSocketFactory(new TLSSocketFactory()); if (token != null && !token.startsWith("Basic ")) httpsURLConnection.setRequestProperty("Authorization", "Bearer " + token); @@ -246,6 +248,8 @@ public class HttpsConnection { httpsURLConnection = (HttpsURLConnection)url.openConnection(); httpsURLConnection.setConnectTimeout(30 * 1000); httpsURLConnection.setRequestProperty("http.keepAlive", "false"); + httpsURLConnection.setRequestProperty("Content-Type", "application/json"); + httpsURLConnection.setRequestProperty("Accept", "application/json"); httpsURLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36"); httpsURLConnection.setSSLSocketFactory(new TLSSocketFactory()); httpsURLConnection.setRequestMethod("GET"); @@ -605,6 +609,7 @@ public class HttpsConnection { fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1, downloadUrl.length()); } + fileName = FileNameCleaner.cleanFileName(fileName); // opens input stream from the HTTP connection InputStream inputStream = httpsURLConnection.getInputStream(); File saveDir = context.getCacheDir(); @@ -692,6 +697,7 @@ public class HttpsConnection { fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1, downloadUrl.length()); } + fileName = FileNameCleaner.cleanFileName(fileName); // opens input stream from the HTTP connection InputStream inputStream = httpURLConnection.getInputStream(); File saveDir = context.getCacheDir(); @@ -815,6 +821,7 @@ public class HttpsConnection { @SuppressWarnings("SameParameterValue") private void patchImage(String urlConnection, int timeout, imageType it, InputStream image, String fileName, String token) throws IOException, NoSuchAlgorithmException, KeyManagementException, HttpsConnectionException { + fileName = FileNameCleaner.cleanFileName(fileName); String twoHyphens = "--"; String boundary = "*****" + Long.toString(System.currentTimeMillis()) + "*****"; String lineEnd = "\r\n"; @@ -1201,8 +1208,8 @@ public class HttpsConnection { * @param inputStream InputStream of the file to upload * @param listener - OnRetrieveAttachmentInterface: listener to send information about attachment once uploaded. */ - public void upload(final InputStream inputStream, String fileName, String tokenUsed, final OnRetrieveAttachmentInterface listener) { - + public void upload(final InputStream inputStream, String fname, String tokenUsed, final OnRetrieveAttachmentInterface listener) { + final String fileName = FileNameCleaner.cleanFileName(fname); if( Helper.getLiveInstanceWithProtocol(context).startsWith("https://")) { new Thread(new Runnable() { @Override diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/PeertubeAPI.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/PeertubeAPI.java index 1f5c4152b..c49e673f8 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/PeertubeAPI.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/PeertubeAPI.java @@ -380,40 +380,42 @@ public class PeertubeAPI { } catch (JSONException e) { e.printStackTrace(); }catch (HttpsConnection.HttpsConnectionException e) { - SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT); - HashMap<String, String> values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token()); - if( values.containsKey("access_token") && values.get("access_token") != null) { - targetedAccount.setToken(values.get("access_token")); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); - //This account is currently logged in, the token is updated - if( prefKeyOauthTokenT.equals(token)){ - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken()); - editor.apply(); + if( e.getStatusCode() == 401 || e.getStatusCode() == 403){ + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT); + HashMap<String, String> values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token()); + if( values.containsKey("access_token") && values.get("access_token") != null) { + targetedAccount.setToken(values.get("access_token")); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); + //This account is currently logged in, the token is updated + if( prefKeyOauthTokenT.equals(token)){ + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken()); + editor.apply(); + } + }if( values.containsKey("refresh_token") && values.get("refresh_token") != null) + targetedAccount.setRefresh_token(values.get("refresh_token")); + new AccountDAO(context, db).updateAccount(targetedAccount); + String response; + try { + response = new HttpsConnection(context).get(getAbsoluteUrl("/users/me"), 60, null, targetedAccount.getToken()); + JSONObject accountObject = new JSONObject(response).getJSONObject("account"); + account = parseAccountResponsePeertube(context, accountObject); + } catch (IOException e1) { + e1.printStackTrace(); + } catch (NoSuchAlgorithmException e1) { + e1.printStackTrace(); + } catch (KeyManagementException e1) { + e1.printStackTrace(); + } catch (JSONException e1) { + e1.printStackTrace(); + } catch (HttpsConnection.HttpsConnectionException e1) { + e1.printStackTrace(); + setError(e.getStatusCode(), e); } - }if( values.containsKey("refresh_token") && values.get("refresh_token") != null) - targetedAccount.setRefresh_token(values.get("refresh_token")); - new AccountDAO(context, db).updateAccount(targetedAccount); - String response; - try { - response = new HttpsConnection(context).get(getAbsoluteUrl("/users/me"), 60, null, targetedAccount.getToken()); - JSONObject accountObject = new JSONObject(response).getJSONObject("account"); - account = parseAccountResponsePeertube(context, accountObject); - } catch (IOException e1) { - e1.printStackTrace(); - } catch (NoSuchAlgorithmException e1) { - e1.printStackTrace(); - } catch (KeyManagementException e1) { - e1.printStackTrace(); - } catch (JSONException e1) { - e1.printStackTrace(); - } catch (HttpsConnection.HttpsConnectionException e1) { - e1.printStackTrace(); - setError(e.getStatusCode(), e); + e.printStackTrace(); } - e.printStackTrace(); } return account; } @@ -436,10 +438,6 @@ public class PeertubeAPI { String token = resobj.get("access_token").toString(); if( resobj.has("refresh_token")) refresh_token = resobj.get("refresh_token").toString(); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, token); - editor.apply(); newValues.put("access_token",token); newValues.put("refresh_token",refresh_token); |