Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stop using chrome.webRequest.onSendHeaders #119

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions scripts/brave_rewards/publisher/common/XHREvents.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
export class Headers {[name: string] : string}

export function makeEvent<T>(eventName: string, args: T) {
return new CustomEvent<T>(
eventName,
{detail: args}
)
}

export function subscribe<T>(eventName: string, callback: (args: T) => void) {
addEventListener(eventName, (e: CustomEvent<T>) => callback(e?.detail))
}


export class RequestHandlerMessageEvent {
static eventName = 'request-handler-message'
url?: string;
headers: Headers;

static makeEvent(args: RequestHandlerMessageEvent) {
return new CustomEvent<RequestHandlerMessageEvent>(
this.eventName,
{detail: args}
)
}

static subscribe(callback: (args: RequestHandlerMessageEvent) => void) {
addEventListener(this.eventName,
(e: CustomEvent<RequestHandlerMessageEvent>) => callback(e?.detail))
}
}

export class RegisterRequestHandlerEvent{
urlPattern?: string;
static eventName = 'register-request-handler'

static makeEvent(args: RegisterRequestHandlerEvent) {
return new CustomEvent<RegisterRequestHandlerEvent>(
this.eventName,
{detail: args}
)
}

static subscribe<T>(callback: (args: RegisterRequestHandlerEvent) => void) {
addEventListener(this.eventName,
(e: CustomEvent<RegisterRequestHandlerEvent>) => callback(e?.detail))
}
}
74 changes: 74 additions & 0 deletions scripts/brave_rewards/publisher/common/XHRInterceptor.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/. */

import {RequestHandlerMessageEvent, RegisterRequestHandlerEvent} from '../common/XHREvents'

let headerProcessUrlPattern: RegExp | undefined;
class CustomXMLHttpRequest extends XMLHttpRequest {
headers: {[header: string]: string} = {}
// url: string | undefined;

// override open(method: string, url: string | URL): void;
// override open(
// method: string, url: string | URL, isAsync: boolean,
// username?: any): void;
// override open(
// method: string, url: string | URL, isAsync?: boolean,
// username?: any,
// password?: any): void {

// this.url = url instanceof URL ? url.toString() : url
// const realAsync = isAsync ? isAsync : true;
// super.open(method, url, realAsync, username, password);
// }

override setRequestHeader(name: string, value: string): void {
this.headers[name] = value
super.setRequestHeader(name, value)
}

private onLoaded() {
const match = !headerProcessUrlPattern || this.responseURL.match(headerProcessUrlPattern)
if (match) {
console.debug('process url', this.responseURL, this.headers)
window.dispatchEvent(RequestHandlerMessageEvent.makeEvent(
{url: this.responseURL, headers: this.headers}))
} else {
console.debug('skip url', this.responseURL)
}
}

override send(body?: any): void {
this.addEventListener("loadend", () => {this.onLoaded()});
super.send(body)
}

// override send(body?: any): void {
// if (!headerProcessUrlPattern || !this.url) {
// if (this.url && headerProcessUrlPattern && this.url.match(headerProcessUrlPattern)) {
// window.dispatchEvent(RequestHandlerMessageEvent.makeEvent(
// {url: this.url, headers: this.headers}))
// } else {
// console.log('skip url', this.url)
// }
// }
// super.send(body)
// }
}

const initRequestHandler = (urlPattern?: string) => {
XMLHttpRequest = CustomXMLHttpRequest
headerProcessUrlPattern = urlPattern ? new RegExp(urlPattern) : undefined
console.log('initRequestHandler', urlPattern, headerProcessUrlPattern)
}


export const initScript = () => {
RegisterRequestHandlerEvent.subscribe((e) => {
const urlPattern = e.urlPattern
initRequestHandler(urlPattern)
})
}

initScript()
27 changes: 6 additions & 21 deletions scripts/brave_rewards/publisher/common/tabHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */

import { getPort } from '../common/messaging'

let registeredOnUpdatedTab = false

export const registerOnUpdatedTab = (
Expand All @@ -16,25 +14,12 @@ export const registerOnUpdatedTab = (

registeredOnUpdatedTab = true

const port = getPort()
if (!port) {
return
const runCallback = () => {
console.debug('OnUpdatedTab', location.href)
// Adapter for registerOnUpdatedTab consumers.
callback({status : 'complete', url: location.href})
}

port.postMessage({
type: 'RegisterOnUpdatedTab',
mediaType: mediaType
})

port.onMessage.addListener(function (msg: any) {
if (!msg.data) {
return
}
switch (msg.type) {
case 'OnUpdatedTab': {
callback(msg.data.changeInfo)
break
}
}
})
// TODO: filter events
(window as any).navigation.addEventListener('navigate', runCallback)
}
81 changes: 7 additions & 74 deletions scripts/brave_rewards/publisher/common/webRequestHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,80 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */

import { getPort } from '../common/messaging'
import {RequestHandlerMessageEvent, RegisterRequestHandlerEvent} from '../common/XHREvents'

let registeredOnCompletedWebRequestHandler = false
let registeredOnSendHeadersWebRequest = false

export const registerOnCompletedWebRequestHandler = (
mediaType: string,
urlPattern: string,
callback: (mediaType: string, details: any) => void
) => {
if (!mediaType || registeredOnCompletedWebRequestHandler) {
return
}

registeredOnCompletedWebRequestHandler = true

const port = getPort()
if (!port) {
return
}

port.postMessage({
type: 'RegisterOnCompletedWebRequest',
mediaType,
data: {
urlPatterns: [urlPattern]
}
})

port.onMessage.addListener((msg: any) => {
switch (msg.type) {
case 'OnCompletedWebRequest': {
callback(msg.mediaType, msg.details)
break
}
}
})
}

export const registerOnSendHeadersWebRequest = (
mediaType: string,
urlPatterns: string[],
extra: string[],
callback: (mediaType: string, details: any) => void
export const registerOnBeforeRequestHandler = (
urlPattern: string | undefined,
callback: (event: RequestHandlerMessageEvent) => void
) => {
if (!mediaType || registeredOnSendHeadersWebRequest) {
return
}

registeredOnSendHeadersWebRequest = true

const port = getPort()
if (!port) {
return
}

port.postMessage({
type: 'RegisterOnSendHeadersWebRequest',
mediaType,
data: {
urlPatterns,
extra
}
})

port.onMessage.addListener(function (msg: any) {
if (!msg.data) {
return
}
switch (msg.type) {
case 'OnSendHeadersWebRequest': {
callback(msg.mediaType, msg.data.details)
break
}
}
})
RequestHandlerMessageEvent.subscribe((e) => callback(e))
console.log('send RegisterRequestHandlerEvent')
dispatchEvent(RegisterRequestHandlerEvent.makeEvent({urlPattern}))
}
41 changes: 23 additions & 18 deletions scripts/brave_rewards/publisher/twitter/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,18 @@ const authTokenCookieRegex = /[; ]_twitter_sess=([^\s;]*)/

let lastSessionId: SessionId = null

let authHeaders: any = {}
class AuthHeaders {
[header: string]: string;
}

let authHeaders: AuthHeaders = {}

const readSessionCookie = (cookiesString: string): SessionId => {
if (!cookiesString) {
const readSessionCookie = (): SessionId => {
if (!document.cookie) {
return null
}

const match = cookiesString.match(authTokenCookieRegex)
const match = document.cookie.match(authTokenCookieRegex)
if (!match) {
return null
}
Expand All @@ -41,26 +45,27 @@ export const hasRequiredAuthHeaders = () => {
(authHeaders['x-csrf-token'] && authHeaders['x-guest-token']))
}

export const processRequestHeaders = (requestHeaders: any[]) => {
export const processRequestHeaders = (requestHeaders: {[header: string]: string}) => {
if (!requestHeaders) {
return false
}

let headers = {}
let headers = new AuthHeaders()

for (const header of requestHeaders) {
const currentSessionId = readSessionCookie()
const hasAuthChanged = (currentSessionId !== lastSessionId)
if (hasAuthChanged) {
// Clear cached auth data when session changes
lastSessionId = currentSessionId
// TODO: why it was headers = {}?
authHeaders = {}
}
for (const name in requestHeaders) {
const value = requestHeaders[name]
// Parse cookies for session id
if (header.name === 'Cookie') {
const currentSessionId = readSessionCookie(header.value as string)
const hasAuthChanged = (currentSessionId !== lastSessionId)
if (hasAuthChanged) {
// Clear cached auth data when session changes
lastSessionId = currentSessionId
headers = {}
}
} else if (authHeaderNames.includes(header.name) ||
header.name.startsWith('x-twitter-')) {
headers[header.name] = header.value
if (authHeaderNames.includes(name) ||
name.startsWith('x-twitter-')) {
headers[name] = value
}
}

Expand Down
29 changes: 13 additions & 16 deletions scripts/brave_rewards/publisher/twitter/twitterBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,6 @@ import * as types from './types'
import * as utils from '../common/utils'
import * as webRequestHandlers from '../common/webRequestHandlers'

const handleOnSendHeadersWebRequest = (mediaType: string, details: any) => {
if (mediaType !== types.mediaType || !details || !details.requestHeaders) {
return
}

if (auth.processRequestHeaders(details.requestHeaders)) {
publisherInfo.send()
}
}

const handleOnUpdatedTab = (changeInfo: any) => {
if (!changeInfo || !changeInfo.url) {
return
Expand Down Expand Up @@ -59,12 +49,19 @@ const initScript = () => {
}
})

webRequestHandlers.registerOnSendHeadersWebRequest(
types.mediaType,
types.sendHeadersUrls,
types.sendHeadersExtra,
handleOnSendHeadersWebRequest)
tabHandlers.registerOnUpdatedTab(types.mediaType, handleOnUpdatedTab)
// TODO: remove the timeout when XHRInterceptor is injected automatically.
setTimeout( () => {
webRequestHandlers.registerOnBeforeRequestHandler(
'^' + types.sendHeadersUrl,
(event) => {
if (auth.processRequestHeaders(event.headers)) {
publisherInfo.send()
}
}
)

tabHandlers.registerOnUpdatedTab(types.mediaType, handleOnUpdatedTab)
}, 5000);
})

console.info('Greaselion script loaded: twitterBase.ts')
Expand Down
3 changes: 1 addition & 2 deletions scripts/brave_rewards/publisher/twitter/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,4 @@ export const mediaType = 'twitter'
export const mediaDomain = 'twitter.com'

export const baseApiUrl = 'https://api.' + location.hostname
export const sendHeadersUrls = [baseApiUrl + '/1.1/*']
export const sendHeadersExtra = ['requestHeaders', 'extraHeaders']
export const sendHeadersUrl = baseApiUrl + '/1.1/'
1 change: 1 addition & 0 deletions scripts/brave_rewards/publisher/youtube/mediaDuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export const sendMetadataFromUrl = (url: URL) => {
const mediaId = utils.getMediaIdFromParts(searchParams)
const mediaKey = commonUtils.buildMediaKey(types.mediaType, mediaId)
const duration = utils.getMediaDurationFromParts(searchParams)
console.debug('parsed MediaDurationMetadata', mediaKey, duration, firstVisit)

const port = getPort()
if (!port) {
Expand Down
Loading
Loading