Skip to content

Commit

Permalink
Set WebView proxy to 0.0.0.0 when possible (#2539)
Browse files Browse the repository at this point in the history
* Set WebView proxy to 0.0.0.0 when possible

* add DcHttpResponse to wrapper

* use new DcHttpResponse to show images in email-html-view

* null-encoding is fine for WebResourceResponse()

---------

Co-authored-by: B. Petersen <r10s@b44t.com>
  • Loading branch information
link2xt and r10s authored Apr 20, 2023
1 parent f130336 commit 0e657ee
Show file tree
Hide file tree
Showing 5 changed files with 146 additions and 0 deletions.
69 changes: 69 additions & 0 deletions jni/dc_wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -1021,6 +1021,15 @@ JNIEXPORT jlong Java_com_b44t_messenger_DcContext_getProviderFromEmailWithDnsCPt
}


JNIEXPORT jlong Java_com_b44t_messenger_DcContext_getHttpResponseCPtr(JNIEnv *env, jobject obj, jstring url)
{
CHAR_REF(url);
jlong ret = (jlong)dc_get_http_response(get_dc_context(env, obj), urlPtr);
CHAR_UNREF(url);
return ret;
}


/*******************************************************************************
* DcEventEmitter
******************************************************************************/
Expand Down Expand Up @@ -2068,3 +2077,63 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcProvider_getOverviewPage(JNIEnv *env
return ret;
}


/*******************************************************************************
* DcHttpResponse
******************************************************************************/


static dc_http_response_t* get_dc_http_response(JNIEnv *env, jobject obj)
{
static jfieldID fid = 0;
if (fid==0) {
jclass cls = (*env)->GetObjectClass(env, obj);
fid = (*env)->GetFieldID(env, cls, "httpResponseCPtr", "J" /*Signature, J=long*/);
}
if (fid) {
return (dc_http_response_t*)(*env)->GetLongField(env, obj, fid);
}
return NULL;
}


JNIEXPORT void Java_com_b44t_messenger_DcHttpResponse_unrefHttpResponseCPtr(JNIEnv *env, jobject obj)
{
dc_http_response_unref(get_dc_http_response(env, obj));
}


JNIEXPORT jstring Java_com_b44t_messenger_DcHttpResponse_getMimetype(JNIEnv *env, jobject obj)
{
char* temp = dc_http_response_get_mimetype(get_dc_http_response(env, obj));
jstring ret = NULL;
if (temp) {
ret = JSTRING_NEW(temp);
}
dc_str_unref(temp);
return ret;
}


JNIEXPORT jstring Java_com_b44t_messenger_DcHttpResponse_getEncoding(JNIEnv *env, jobject obj)
{
char* temp = dc_http_response_get_encoding(get_dc_http_response(env, obj));
jstring ret = NULL;
if (temp) {
ret = JSTRING_NEW(temp);
}
dc_str_unref(temp);
return ret;
}


JNIEXPORT jbyteArray Java_com_b44t_messenger_DcHttpResponse_getBlob(JNIEnv *env, jobject obj)
{
jbyteArray ret = NULL;
dc_http_response_t* http_response = get_dc_http_response(env, obj);
size_t ptr_size = dc_http_response_get_size(http_response);
uint8_t* ptr = dc_http_response_get_blob(http_response);
ret = ptr2jbyteArray(env, ptr, ptr_size);
dc_str_unref((char*)ptr);
return ret;
}
2 changes: 2 additions & 0 deletions src/com/b44t/messenger/DcContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ public void unref() {
public DcArray getLocations (int chat_id, int contact_id, long timestamp_start, long timestamp_end) { return new DcArray(getLocationsCPtr(chat_id, contact_id, timestamp_start, timestamp_end)); }
public native void deleteAllLocations ();
public DcProvider getProviderFromEmailWithDns (String email) { long cptr = getProviderFromEmailWithDnsCPtr(email); return cptr!=0 ? new DcProvider(cptr) : null; }
public DcHttpResponse getHttpResponse (String url) { long cptr = getHttpResponseCPtr(url); return cptr!=0 ? new DcHttpResponse(cptr) : null; }

public String getNameNAddr() {
String displayname = getConfig("displayname");
Expand Down Expand Up @@ -255,4 +256,5 @@ public String getNameNAddr() {
private native long checkQrCPtr (String qr);
private native long getProviderFromEmailWithDnsCPtr (String addr);
private native long newBackupProviderCPtr();
private native long getHttpResponseCPtr(String url);
}
22 changes: 22 additions & 0 deletions src/com/b44t/messenger/DcHttpResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.b44t.messenger;

public class DcHttpResponse {

public DcHttpResponse(long httpResponseCPtr) {
this.httpResponseCPtr = httpResponseCPtr;
}

@Override protected void finalize() throws Throwable {
super.finalize();
unrefHttpResponseCPtr();
httpResponseCPtr = 0;
}

public native String getMimetype ();
public native String getEncoding ();
public native byte[] getBlob ();

// working with raw c-data
private long httpResponseCPtr; // CAVE: the name is referenced in the JNI
private native void unrefHttpResponseCPtr();
}
26 changes: 26 additions & 0 deletions src/org/thoughtcrime/securesms/FullMsgActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;

import androidx.appcompat.app.AlertDialog;

import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcHttpResponse;

import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;

import java.io.ByteArrayInputStream;
import java.lang.ref.WeakReference;

public class FullMsgActivity extends WebViewActivity
Expand Down Expand Up @@ -164,4 +167,27 @@ private void onChangeLoadRemoteContent(LoadRemoteContent loadRemoteContent) {
webView.getSettings().setBlockNetworkLoads(!this.loadRemoteContent);
webView.reload();
}

@Override
protected WebResourceResponse interceptRequest(String url) {
WebResourceResponse res = null;
try {
if (url == null) {
throw new Exception("no url specified");
}
DcHttpResponse httpResponse = dcContext.getHttpResponse(url);
if (httpResponse == null) {
throw new Exception(dcContext.getLastError());
}
String mimeType = httpResponse.getMimetype();
if (mimeType == null) {
mimeType = "application/octet-stream";
}
res = new WebResourceResponse(mimeType, httpResponse.getEncoding(), new ByteArrayInputStream(httpResponse.getBlob()));
} catch (Exception e) {
e.printStackTrace();
res = new WebResourceResponse("text/plain", "UTF-8", new ByteArrayInputStream(("Error: " + e.getMessage()).getBytes()));
}
return res;
}
}
27 changes: 27 additions & 0 deletions src/org/thoughtcrime/securesms/WebViewActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,14 @@
import androidx.appcompat.widget.SearchView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;
import androidx.webkit.ProxyController;
import androidx.webkit.ProxyConfig;

import org.thoughtcrime.securesms.util.DynamicLanguage;
import org.thoughtcrime.securesms.util.DynamicTheme;

import java.util.concurrent.Executor;

public class WebViewActivity extends PassphraseRequiredActionBarActivity
implements SearchView.OnQueryTextListener,
WebView.FindListener
Expand All @@ -39,6 +43,29 @@ public class WebViewActivity extends PassphraseRequiredActionBarActivity
protected void onPreCreate() {
dynamicTheme.onCreate(this);
dynamicLanguage.onCreate(this);

if (WebViewFeature.isFeatureSupported(WebViewFeature.PROXY_OVERRIDE)) {
// Set proxy to non-routable address.
ProxyConfig proxyConfig = new ProxyConfig.Builder()
.removeImplicitRules()
.addProxyRule("0.0.0.0")
.build();
Executor executor = new Executor() {
@Override
public void execute(Runnable command) {
command.run();
}
};
Runnable listener = new Runnable() {
@Override
public void run() {
Log.i(TAG, "Successfully set WebView proxy.");
}
};
ProxyController.getInstance().setProxyOverride(proxyConfig, executor, listener);
} else {
Log.w(TAG, "Cannot set WebView proxy.");
}
}

@Override
Expand Down

0 comments on commit 0e657ee

Please sign in to comment.