Skip to content

Commit e803082

Browse files
authored
Merge pull request #6 from OpacityLabs/oscar/sdk-160-support-for-extracting-cookies-on-android
Add support for get cookies for current url
2 parents 83ae6ba + 255f1f5 commit e803082

File tree

6 files changed

+279
-123
lines changed

6 files changed

+279
-123
lines changed

OpacityCore/src/main/assets/extension/background.js

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
browser.webRequest.onHeadersReceived.addListener(
22
function (details) {
3+
let url = details.url;
4+
5+
let domain = new URL(url).hostname;
6+
37
let cookiesHeaders = details.responseHeaders.filter(
48
(header) => header.name.toLowerCase() === "set-cookie"
59
);
@@ -30,36 +34,40 @@ browser.webRequest.onHeadersReceived.addListener(
3034
browser.runtime.sendNativeMessage("gecko", {
3135
event: "cookies",
3236
cookies: cookieDict,
37+
domain: domain,
3338
});
3439
},
3540
{ urls: ["<all_urls>"] }, // Intercept all URLs
3641
["responseHeaders"]
3742
);
3843

3944
browser.webNavigation.onDOMContentLoaded.addListener(function (details) {
40-
if (details.frameId === 0) { // Ensure it's the top-level frame
45+
if (details.frameId === 0) {
46+
// Ensure it's the top-level frame
4147
// Inject a script to fetch the outerHTML of the current document
42-
browser.tabs.executeScript(details.tabId, {
43-
code: "document.documentElement.outerHTML"
44-
}).then(result => {
45-
if (result && result.length > 0) {
46-
const htmlBody = result[0]; // The outerHTML of the page
47-
48-
// Send the HTML content and cookies to the native app
49-
browser.runtime.sendNativeMessage("gecko", {
50-
event: "html_body",
51-
html: htmlBody
52-
});
48+
browser.tabs
49+
.executeScript(details.tabId, {
50+
code: "document.documentElement.outerHTML",
51+
})
52+
.then((result) => {
53+
if (result && result.length > 0) {
54+
const htmlBody = result[0]; // The outerHTML of the page
5355

54-
} else {
56+
// Send the HTML content and cookies to the native app
57+
browser.runtime.sendNativeMessage("gecko", {
58+
event: "html_body",
59+
html: htmlBody,
60+
});
61+
} else {
62+
browser.runtime.sendNativeMessage("gecko", {
63+
event: "No results when getting outerHTML",
64+
});
65+
}
66+
})
67+
.catch((err) => {
5568
browser.runtime.sendNativeMessage("gecko", {
56-
event: "No results when getting outerHTML",
69+
event: "Execute script error: " + err.toString(),
5770
});
58-
}
59-
}).catch(err => {
60-
browser.runtime.sendNativeMessage("gecko", {
61-
event: "Execute script error: " + err.toString(),
6271
});
63-
})
6472
}
65-
});
73+
});

OpacityCore/src/main/cpp/OpacityCore.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,41 @@ extern "C" void android_close_webview() {
198198
env->CallVoidMethod(java_object, method);
199199
}
200200

201+
extern "C" const char *android_get_browser_cookies_for_current_url() {
202+
JNIEnv *env = GetJniEnv();
203+
204+
jclass jOpacityCore = env->GetObjectClass(java_object);
205+
206+
jmethodID method = env->GetMethodID(
207+
jOpacityCore, "getBrowserCookiesForCurrentUrl", "()Ljava/lang/String;");
208+
auto res = (jstring)env->CallObjectMethod(java_object, method);
209+
210+
if (res == nullptr) {
211+
return nullptr;
212+
}
213+
214+
const char *val_str = env->GetStringUTFChars(res, nullptr);
215+
return val_str;
216+
}
217+
218+
extern "C" const char *
219+
android_get_browser_cookies_for_domain(const char *domain) {
220+
JNIEnv *env = GetJniEnv();
221+
222+
jclass jOpacityCore = env->GetObjectClass(java_object);
223+
jmethodID method =
224+
env->GetMethodID(jOpacityCore, "getBrowserCookiesForDomain",
225+
"(Ljava/lang/String;)Ljava/lang/String;");
226+
jstring jdomain = env->NewStringUTF(domain);
227+
auto res = (jstring)env->CallObjectMethod(java_object, method, jdomain);
228+
if (res == nullptr) {
229+
return nullptr;
230+
}
231+
const char *val_str = env->GetStringUTFChars(res, nullptr);
232+
// opacity_core::free_string(domain); // Free the domain string
233+
return val_str; // Caller must free this memory
234+
}
235+
201236
extern "C" JNIEXPORT jint JNICALL
202237
Java_com_opacitylabs_opacitycore_OpacityCore_init(
203238
JNIEnv *env, jobject thiz, jstring api_key, jboolean dry_run,
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.opacitylabs.opacitycore
2+
3+
4+
import android.os.Parcel
5+
import android.os.Parcelable
6+
import org.json.JSONObject
7+
import java.util.concurrent.CountDownLatch
8+
import java.util.concurrent.TimeUnit
9+
10+
11+
class CookieResultReceiver() : Parcelable {
12+
private var cookies: JSONObject? = null
13+
private val latch = CountDownLatch(1)
14+
15+
constructor(parcel: Parcel) : this()
16+
17+
fun onReceiveResult(cookies: JSONObject?) {
18+
this.cookies = cookies
19+
latch.countDown()
20+
}
21+
22+
fun waitForResult(timeoutMs: Long): JSONObject? {
23+
latch.await(timeoutMs, TimeUnit.MILLISECONDS)
24+
return cookies
25+
}
26+
27+
override fun writeToParcel(parcel: Parcel, flags: Int) {}
28+
29+
override fun describeContents(): Int = 0
30+
31+
companion object CREATOR : Parcelable.Creator<CookieResultReceiver> {
32+
override fun createFromParcel(parcel: Parcel): CookieResultReceiver {
33+
return CookieResultReceiver(parcel)
34+
}
35+
36+
override fun newArray(size: Int): Array<CookieResultReceiver?> {
37+
return arrayOfNulls(size)
38+
}
39+
}
40+
}

0 commit comments

Comments
 (0)