Skip to content

Commit ac24a6c

Browse files
Remove addon.fetch, introduce ?sareferer URL parameter for background requests (ScratchAddons#1681)
* Remove addon.fetch, introduce ?sareferer URL parameter for background requests * Remove another use of addon.fetch in userscript
1 parent 5a9f3d1 commit ac24a6c

File tree

5 files changed

+49
-66
lines changed

5 files changed

+49
-66
lines changed

Diff for: addons/full-signature/happen.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,17 @@ export default async function ({ addon, global, console, msg }) {
1313
loadMore.addEventListener("click", async function () {
1414
dataLoaded += 5;
1515
if (dataLoaded > fetched.length) {
16-
await addon
17-
.fetch(
18-
`
16+
await fetch(
17+
`
1918
https://api.scratch.mit.edu/users/${addon.auth.username}/following/users/activity?limit=40&offset=${
20-
Math.floor(dataLoaded / 40) * 40
21-
}`
22-
)
19+
Math.floor(dataLoaded / 40) * 40
20+
}`,
21+
{
22+
headers: {
23+
"X-Token": addon.auth.xToken,
24+
},
25+
}
26+
)
2327
.then((response) => response.json())
2428
.then((rows) => {
2529
rows

Diff for: addons/scratch-messaging/background.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,9 @@ export default async function ({ addon, global, console, setTimeout, setInterval
230230
return new Promise((resolve) => {
231231
// For some weird reason, this only works with XHR in Chrome...
232232
const xhr = new XMLHttpRequest();
233-
xhr.open("POST", `https://scratch.mit.edu/site-api/comments/${resourceType}/${resourceId}/add/`, true);
234-
xhr.setRequestHeader("X-ScratchAddons-Uses-Fetch", "true");
233+
xhr.open("POST", `https://scratch.mit.edu/site-api/comments/${resourceType}/${resourceId}/add/?sareferer`, true);
234+
xhr.setRequestHeader("x-csrftoken", addon.auth.csrfToken);
235+
xhr.setRequestHeader("x-requested-with", "XMLHttpRequest");
235236

236237
xhr.onload = function () {
237238
if (xhr.status === 200) {
@@ -253,8 +254,9 @@ export default async function ({ addon, global, console, setTimeout, setInterval
253254
function deleteComment({ resourceType, resourceId, commentId }) {
254255
return new Promise((resolve) => {
255256
const xhr = new XMLHttpRequest();
256-
xhr.open("POST", `https://scratch.mit.edu/site-api/comments/${resourceType}/${resourceId}/del/`, true);
257-
xhr.setRequestHeader("X-ScratchAddons-Uses-Fetch", "true");
257+
xhr.open("POST", `https://scratch.mit.edu/site-api/comments/${resourceType}/${resourceId}/del/?sareferer`, true);
258+
xhr.setRequestHeader("x-csrftoken", addon.auth.csrfToken);
259+
xhr.setRequestHeader("x-requested-with", "XMLHttpRequest");
258260

259261
xhr.onload = function () {
260262
if (xhr.status === 200) {

Diff for: addons/studio-tools/mystuff.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ export default async function ({ addon, global, console, msg }) {
88
leaveButton.setAttribute("data-id", item.parentElement.querySelector(".title a").href.match(/[0-9]+/g));
99
leaveButton.addEventListener("click", async function (e) {
1010
if (confirm(msg("leave-confirm"))) {
11-
await addon.fetch(
11+
await fetch(
1212
`https://scratch.mit.edu/site-api/users/curators-in/${leaveButton.getAttribute(
1313
"data-id"
1414
)}/remove/?usernames=${Scratch.INIT_DATA.LOGGED_IN_USER.model.username}`,
15-
{ method: "PUT" }
15+
{ method: "PUT", headers: { "x-csrftoken": addon.auth.csrfToken, "x-requested-with": "XMLHttpRequest" } }
1616
);
1717
window.location.reload();
1818
}

Diff for: background/handle-fetch.js

+29-50
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,24 @@
11
const extraInfoSpec = ["blocking", "requestHeaders"];
2-
const extraInfoSpec2 = ["blocking", "responseHeaders"];
3-
if (Object.prototype.hasOwnProperty.call(chrome.webRequest.OnBeforeSendHeadersOptions, "EXTRA_HEADERS")) {
2+
if (Object.prototype.hasOwnProperty.call(chrome.webRequest.OnBeforeSendHeadersOptions, "EXTRA_HEADERS"))
43
extraInfoSpec.push("extraHeaders");
5-
extraInfoSpec2.push("extraHeaders");
6-
}
7-
8-
const optionRequestIds = [];
94

105
chrome.webRequest.onBeforeSendHeaders.addListener(
116
function (details) {
127
if (details.originUrl) {
138
// Firefox
149
const origin = new URL(details.originUrl).origin;
15-
if (origin !== chrome.runtime.getURL("").slice(0, -1) && origin !== "https://scratch.mit.edu") return;
10+
if (origin !== chrome.runtime.getURL("").slice(0, -1)) return;
1611
} else if (
1712
// Chrome
18-
details.initiator !== chrome.runtime.getURL("").slice(0, -1) &&
19-
details.initiator !== "https://scratch.mit.edu"
13+
details.initiator !== chrome.runtime.getURL("").slice(0, -1)
2014
)
2115
return;
2216

23-
let interceptRequest = optionRequestIds.includes(details.requestId);
24-
if (!interceptRequest && details.requestHeaders) {
25-
for (let i = 0; i < details.requestHeaders.length; i++) {
26-
const headerName = details.requestHeaders[i].name;
27-
if (headerName === "X-ScratchAddons-Uses-Fetch") {
28-
interceptRequest = true;
29-
}
30-
}
31-
}
32-
if (interceptRequest) {
17+
if (details.url.endsWith("?sareferer") || details.url.endsWith("&sareferer")) {
3318
details.requestHeaders.push({
3419
name: "Referer",
3520
value: "https://scratch.mit.edu/",
3621
});
37-
details.requestHeaders.push({
38-
name: "X-csrftoken",
39-
value: scratchAddons.globalState.auth.csrfToken,
40-
});
41-
details.requestHeaders.push({
42-
name: "X-Token",
43-
value: scratchAddons.globalState.auth.xToken,
44-
});
45-
details.requestHeaders.push({
46-
name: "X-Requested-With",
47-
value: "XMLHttpRequest",
48-
});
4922
return {
5023
requestHeaders: details.requestHeaders,
5124
};
@@ -58,23 +31,29 @@ chrome.webRequest.onBeforeSendHeaders.addListener(
5831
extraInfoSpec
5932
);
6033

61-
chrome.webRequest.onHeadersReceived.addListener(
62-
function (details) {
63-
if (details.method === "OPTIONS" && details.responseHeaders) {
64-
for (let i = 0; i < details.responseHeaders.length; i++) {
65-
const headerName = details.responseHeaders[i].name;
66-
if (headerName === "access-control-allow-headers") {
67-
details.responseHeaders[i].value += ", x-scratchaddons-uses-fetch";
68-
return {
69-
responseHeaders: details.responseHeaders,
70-
};
71-
}
72-
}
34+
/*
35+
36+
// declarativeNetRequest alternative
37+
38+
chrome.declarativeNetRequest.updateDynamicRules({
39+
removeRuleIds: [1],
40+
addRules: [{
41+
id: 1,
42+
priority: 1,
43+
action: {
44+
type: "modifyHeaders",
45+
requestHeaders: [{
46+
header: "Referer",
47+
operation: "set",
48+
value: "https://scratch.mit.edu/"
49+
}]
50+
},
51+
condition: {
52+
domains: [chrome.runtime.id],
53+
regexFilter: "^https:\\/\\/(api\\.|clouddata\\.|)scratch\\.mit\\.edu\\/.*(\\?|\\&)sareferer",
54+
resourceTypes: ["xmlhttprequest"]
7355
}
74-
},
75-
{
76-
urls: ["https://scratch.mit.edu/*", "https://api.scratch.mit.edu/*", "https://clouddata.scratch.mit.edu/*"],
77-
types: ["xmlhttprequest"],
78-
},
79-
extraInfoSpec2
80-
);
56+
}]
57+
});
58+
59+
*/

Diff for: background/handle-messages.js

+2-4
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,9 @@ async function updateMsgCount() {
5252
}
5353
}
5454
scratchAddons.methods.clearMessages = async function () {
55-
const res = await fetch("https://scratch.mit.edu/site-api/messages/messages-clear/", {
55+
const res = await fetch("https://scratch.mit.edu/site-api/messages/messages-clear/?sareferer", {
5656
method: "POST",
57-
headers: {
58-
"X-ScratchAddons-Uses-Fetch": "true",
59-
},
57+
headers: { "x-csrftoken": scratchAddons.globalState.auth.csrfToken, "x-requested-with": "XMLHttpRequest" },
6058
});
6159
if (res.ok) {
6260
lastCountCheck = Date.now();

0 commit comments

Comments
 (0)