exodus-privacy-android-app/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/Utils.java

281 lines
11 KiB
Java

package org.eu.exodus_privacy.exodusprivacy;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Build;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Utils {
@SuppressWarnings("unused")
public static final String TAG = "Exodus_privacy";
public static final String APP_PREFS = "app_prefs";
public static final String LAST_REFRESH = "last_refresh";
@SuppressLint("PackageManagerGetSignatures")
public static String getCertificateSHA1Fingerprint(PackageManager pm, String packageName) {
int flags = PackageManager.GET_SIGNATURES;
PackageInfo packageInfo = null;
try {
packageInfo = pm.getPackageInfo(packageName, flags);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
assert packageInfo != null;
Signature[] signatures = packageInfo.signatures;
StringBuilder builder = new StringBuilder();
builder.append(packageName);
for (Signature signature : signatures) {
InputStream input = new ByteArrayInputStream(signature.toByteArray());
CertificateFactory cf = null;
try {
cf = CertificateFactory.getInstance("X509");
} catch (CertificateException e) {
e.printStackTrace();
}
try {
assert cf != null;
X509Certificate c = (X509Certificate) cf.generateCertificate(input);
try {
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] publicKey = md.digest(c.getEncoded());
builder.append(' ');
builder.append(byte2HexFormatted(publicKey).toUpperCase());
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
} catch (CertificateException e) {
e.printStackTrace();
}
}
String hexString = null;
try {
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] publicKey = md.digest(builder.toString().getBytes());
hexString = byte2HexFormatted(publicKey);
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
assert hexString != null;
return hexString.toUpperCase();
}
private static String byte2HexFormatted(byte[] arr) {
StringBuilder str = new StringBuilder(arr.length * 2);
for (byte anArr : arr) {
String h = Integer.toHexString(anArr);
int l = h.length();
if (l == 1) h = "0" + h;
if (l > 2) h = h.substring(l - 2, l);
str.append(h.toUpperCase());
}
return str.toString();
}
/**
* Convert a date in String -> format yyyy-MM-dd HH:mm:ss
*
* @param date Date
* @return String
*/
public static String dateToString(Date date) {
if (date == null)
return null;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
return dateFormat.format(date);
}
/**
* Convert String date from db to Date Object
*
* @param stringDate date to convert
* @return Date
*/
public static Date stringToDate(Context context, String stringDate) {
if (stringDate == null)
return null;
Locale userLocale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
userLocale = context.getResources().getConfiguration().getLocales().get(0);
} else {
userLocale = context.getResources().getConfiguration().locale;
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", userLocale);
Date date = null;
try {
date = dateFormat.parse(stringDate);
} catch (java.text.ParseException ignored) {
}
return date;
}
/*
Simple and not complete markdownToHtml converter
*/
public static String markdownToHtml(String markdown) {
StringBuilder builder = new StringBuilder();
String[] lines = markdown.split("\r\n");
ArrayList<String> listStarter = new ArrayList<>();
ArrayList<String> formatStarter = new ArrayList<>();
ArrayList<String> closeTags = new ArrayList<>();
for (String line : lines) {
if (line.matches("^#{1,5} .*")) {
int nb = line.indexOf(" ");
String hx = "<h" + nb + ">";
String endhx = "</h" + nb + ">";
builder.append(hx);
closeTags.add(endhx);
line = line.substring(line.indexOf(" ") + 1);
} else if (line.matches("^ *[+\\-*] .*")) {
String starter = "";
if (listStarter.size() > 0 && line.startsWith(listStarter.get(listStarter.size() - 1))) {
starter = listStarter.get(listStarter.size() - 1);
} else {
Pattern pattern = Pattern.compile("^( *[+\\-*] )");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
starter = matcher.group(1);
listStarter.add(starter);
builder.append("<ul>\n");
}
}
builder.append("<li> ");
int beginIndex = 0;
if (starter != null) {
beginIndex = line.indexOf(starter) + starter.length();
}
line = line.substring(beginIndex);
closeTags.add("</li>");
} else {
while (!listStarter.isEmpty()) {
listStarter.remove(listStarter.size() - 1);
builder.append("</ul>\n");
}
builder.append("<p>");
closeTags.add("</p>");
}
while (!line.isEmpty()) {
Pattern pattern = Pattern.compile("^\\[(.+?)(?=]\\()]\\((http.+?)(?=\\))\\)");
//Pattern pattern = Pattern.compile("^\\[(.*)\\]\\((http.*)\\)");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
builder.append("<a href=\"");
builder.append(matcher.group(2));
builder.append("\">");
builder.append(matcher.group(1));
builder.append("</a>");
line = line.substring(line.indexOf(")") + 1);
continue;
}
pattern = Pattern.compile("^(http.*)");
matcher = pattern.matcher(line);
if (matcher.find()) {
builder.append("<a href=\"");
builder.append(matcher.group(1));
builder.append("\">");
builder.append(matcher.group(1));
builder.append("</a>");
String sub = matcher.group(1);
if (sub != null) {
line = line.substring(sub.length());
}
continue;
}
pattern = Pattern.compile("^[*_]{2}(.+)[*_]{2}");
matcher = pattern.matcher(line);
if (matcher.find()) {
if (line.startsWith("*")) {
line = line.replaceFirst("\\*\\*", "<b>");
formatStarter.add("**");
} else {
line = line.replaceFirst("__", "<b>");
formatStarter.add("__");
}
continue;
}
pattern = Pattern.compile("^[*_](.+)");
matcher = pattern.matcher(line);
if (matcher.find()) {
if (line.startsWith("*")) {
line = line.replaceFirst("\\*", "<i>");
formatStarter.add("*");
} else {
line = line.replaceFirst("_", "<i>");
formatStarter.add("_");
}
continue;
}
if (formatStarter.size() > 0) {
String checkFormat;
if (line.contains(" "))
checkFormat = line.substring(0, line.indexOf(" "));
else
checkFormat = line;
String lastFormat = formatStarter.get(formatStarter.size() - 1);
if (checkFormat.contains(lastFormat)) {
if (lastFormat.length() == 2) {
if (lastFormat.contains("*"))
line = line.replaceFirst("\\*\\*", "</b>");
else
line = line.replaceFirst("__", "</b>");
} else {
if (lastFormat.contains("*"))
line = line.replaceFirst("\\*", "</i>");
else
line = line.replaceFirst("_", "</i>");
}
formatStarter.remove(formatStarter.size() - 1);
continue;
}
}
if (line.contains(" ")) {
builder.append(line.substring(0, line.indexOf(" ") + 1));
line = line.substring(line.indexOf(" ") + 1);
} else {
builder.append(line);
line = "";
}
}
//close all unclosed tags starting at the end
while (!closeTags.isEmpty()) {
builder.append(closeTags.remove(closeTags.size() - 1));
}
builder.append("\n");
}
while (!listStarter.isEmpty()) {
listStarter.remove(listStarter.size() - 1);
builder.append("</ul>\n");
}
return builder.toString();
}
}