summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorMartin Fietz <marf@hadiko-99-4.hadiko.uni-karlsruhe.de>2015-04-11 23:46:33 +0200
committerMartin Fietz <marf@hadiko-99-4.hadiko.uni-karlsruhe.de>2015-04-11 23:46:33 +0200
commit9bd6bcf9d3f0114c907ac2fad0a95d1106121a25 (patch)
tree862accd258dc78be3dbe1f5b59c7599fafcea4f5 /core/src
parenta34acb71d117a153606f0af26c1a297e7e524455 (diff)
downloadAntennaPod-9bd6bcf9d3f0114c907ac2fad0a95d1106121a25.zip
Picasso can handle basic authentication
Diffstat (limited to 'core/src')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/asynctask/PicassoProvider.java52
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java29
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java14
4 files changed, 95 insertions, 2 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/asynctask/PicassoProvider.java b/core/src/main/java/de/danoeh/antennapod/core/asynctask/PicassoProvider.java
index b6ece6dc8..e91ae3322 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/asynctask/PicassoProvider.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/asynctask/PicassoProvider.java
@@ -6,8 +6,12 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
+import android.text.TextUtils;
import android.util.Log;
+import com.squareup.okhttp.Interceptor;
+import com.squareup.okhttp.OkHttpClient;
+import com.squareup.okhttp.Response;
import com.squareup.picasso.Cache;
import com.squareup.picasso.LruCache;
import com.squareup.picasso.OkHttpDownloader;
@@ -22,13 +26,18 @@ import org.apache.commons.lang3.StringUtils;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.net.HttpURLConnection;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import de.danoeh.antennapod.core.service.download.HttpDownloader;
+import de.danoeh.antennapod.core.storage.DBReader;
+
/**
* Provides access to Picasso instances.
*/
public class PicassoProvider {
+
private static final String TAG = "PicassoProvider";
private static final boolean DEBUG = false;
@@ -56,10 +65,12 @@ public class PicassoProvider {
if (picassoSetup) {
return;
}
+ OkHttpClient client = new OkHttpClient();
+ client.networkInterceptors().add(new BasicAuthenticationInterceptor(appContext));
Picasso picasso = new Picasso.Builder(appContext)
.indicatorsEnabled(DEBUG)
.loggingEnabled(DEBUG)
- .downloader(new OkHttpDownloader(appContext))
+ .downloader(new OkHttpDownloader(client))
.addRequestHandler(new MediaRequestHandler(appContext))
.executor(getExecutorService())
.memoryCache(getMemoryCache(appContext))
@@ -75,6 +86,45 @@ public class PicassoProvider {
picassoSetup = true;
}
+ private static class BasicAuthenticationInterceptor implements Interceptor {
+
+ private final Context context;
+
+ public BasicAuthenticationInterceptor(Context context) {
+ this.context = context;
+ }
+
+ @Override
+ public Response intercept(Chain chain) throws IOException {
+ com.squareup.okhttp.Request request = chain.request();
+ String url = request.urlString();
+ // add authentication
+ String authentication = DBReader.getImageAuthentication(context, url);
+ if(TextUtils.isEmpty(authentication) == false) {
+ String[] auth = authentication.split(":");
+ String credentials = HttpDownloader.encodeCredentials(auth[0], auth[1], "ISO-8859-1");
+ com.squareup.okhttp.Request newRequest = request
+ .newBuilder()
+ .addHeader("Authorization", credentials)
+ .build();
+ Response response = chain.proceed(newRequest);
+ if (!response.isSuccessful() && response.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
+ credentials = HttpDownloader.encodeCredentials(auth[0], auth[1], "UTF-8");
+ newRequest = request
+ .newBuilder()
+ .addHeader("Authorization", credentials)
+ .build();
+ return chain.proceed(newRequest);
+ } else {
+ return response;
+ }
+ }
+ else { // no authentication required
+ return chain.proceed(request);
+ }
+ }
+ }
+
private static class MediaRequestHandler extends RequestHandler {
final Context context;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
index f7ce38cd5..ac0fe8036 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
@@ -272,7 +272,7 @@ public class HttpDownloader extends Downloader {
}
}
- private static String encodeCredentials(String username, String password, String charset) {
+ public static String encodeCredentials(String username, String password, String charset) {
try {
String credentials = username + ":" + password;
byte[] bytes = credentials.getBytes(charset);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
index a7c98c7c6..aafe4071a 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
@@ -712,6 +712,35 @@ public final class DBReader {
}
/**
+ * Returns credentials based on image URL
+ *
+ * @param context A context that is used for opening a database connection.
+ * @param imageUrl The URL of the image
+ * @return Credentials in format "<Username>:<Password>", empty String if no authorization given
+ */
+ public static String getImageAuthentication(final Context context, final String imageUrl) {
+ Log.d(TAG, "Loading credentials for image with URL " + imageUrl);
+
+ PodDBAdapter adapter = new PodDBAdapter(context);
+ adapter.open();
+ String credentials = getImageAuthentication(context, imageUrl, adapter);
+ adapter.close();
+ return credentials;
+
+ }
+
+ static String getImageAuthentication(final Context context, final String imageUrl, PodDBAdapter adapter) {
+ String credentials = null;
+ Cursor cursor = adapter.getImageAuthenticationCursor(imageUrl);
+ if (cursor.moveToFirst()) {
+ String username = cursor.getString(0);
+ String password = cursor.getString(1);
+ return username + ":" + password;
+ }
+ return "";
+ }
+
+ /**
* Loads a specific FeedItem from the database.
*
* @param context A context that is used for opening a database connection.
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
index f518a4f5f..229f3d034 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
@@ -1146,6 +1146,20 @@ public class PodDBAdapter {
return db.rawQuery(query, null);
}
+ public Cursor getImageAuthenticationCursor(final String imageUrl) {
+ final String query = "SELECT " + KEY_USERNAME + "," + KEY_PASSWORD + " FROM "
+ + TABLE_NAME_FEED_IMAGES + " INNER JOIN " + TABLE_NAME_FEEDS + " ON " +
+ TABLE_NAME_FEED_IMAGES + "." + KEY_ID + "=" + TABLE_NAME_FEEDS + "." + KEY_IMAGE + " WHERE "
+ + TABLE_NAME_FEED_IMAGES + "." + KEY_DOWNLOAD_URL + "='" + imageUrl + "' UNION SELECT "
+ + KEY_USERNAME + "," + KEY_PASSWORD + " FROM " + TABLE_NAME_FEED_IMAGES + " INNER JOIN "
+ + TABLE_NAME_FEED_ITEMS + " ON " + TABLE_NAME_FEED_IMAGES + "." + KEY_ID + "=" +
+ TABLE_NAME_FEED_ITEMS + "." + KEY_IMAGE + " INNER JOIN " + TABLE_NAME_FEEDS + " ON "
+ + TABLE_NAME_FEED_ITEMS + "." + KEY_FEED + "=" + TABLE_NAME_FEEDS + "." + KEY_ID + " WHERE "
+ + TABLE_NAME_FEED_IMAGES + "." + KEY_DOWNLOAD_URL + "='" + imageUrl + "'";
+ Log.d(TAG, "Query: " + query);
+ return db.rawQuery(query, null);
+ }
+
public int getQueueSize() {
final String query = String.format("SELECT COUNT(%s) FROM %s", KEY_ID, TABLE_NAME_QUEUE);
Cursor c = db.rawQuery(query, null);