Skip to content

Commit b83af90

Browse files
committed
fix: Set X-Requested-With header on all requests to avoid browser auth dialogs
Signed-off-by: Julius Härtl <jus@bitgrid.net>
1 parent 59ba768 commit b83af90

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

core/src/init.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { setUp as setUpContactsMenu } from './components/ContactsMenu.js'
3535
import { setUp as setUpMainMenu } from './components/MainMenu.js'
3636
import { setUp as setUpUserMenu } from './components/UserMenu.js'
3737
import PasswordConfirmation from './OC/password-confirmation.js'
38+
import { interceptRequests } from './utils/xhr-request.js'
3839

3940
// keep in sync with core/css/variables.scss
4041
const breakpointMobileWidth = 1024
@@ -78,6 +79,8 @@ moment.locale(locale)
7879
* Initializes core
7980
*/
8081
export const initCore = () => {
82+
interceptRequests()
83+
8184
$(window).on('unload.main', () => { OC._unloadCalled = true })
8285
$(window).on('beforeunload.main', () => {
8386
// super-trick thanks to http://stackoverflow.com/a/4651049

core/src/utils/xhr-request.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* @copyright Copyright (c) 2023 Julius Härtl <jus@bitgrid.net>
3+
*
4+
* @author Julius Härtl <jus@bitgrid.net>
5+
*
6+
* @license GNU AGPL version 3 or any later version
7+
*
8+
* This program is free software: you can redistribute it and/or modify
9+
* it under the terms of the GNU Affero General Public License as
10+
* published by the Free Software Foundation, either version 3 of the
11+
* License, or (at your option) any later version.
12+
*
13+
* This program is distributed in the hope that it will be useful,
14+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16+
* GNU Affero General Public License for more details.
17+
*
18+
* You should have received a copy of the GNU Affero General Public License
19+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
20+
*/
21+
22+
/**
23+
* Intercept XMLHttpRequest and fetch API calls to add X-Requested-With header
24+
*
25+
* This is also done in @nextcloud/axios but not all requests pass through that
26+
*/
27+
export const interceptRequests = () => {
28+
XMLHttpRequest.prototype.open = (function(open) {
29+
return function(method, url, async) {
30+
open.apply(this, arguments)
31+
if (!this.getResponseHeader('X-Requested-With')) {
32+
this.setRequestHeader('X-Requested-With', 'XMLHttpRequest')
33+
}
34+
}
35+
})(XMLHttpRequest.prototype.open)
36+
37+
window.fetch = (function(fetch) {
38+
return (input, init) => {
39+
if (!init) {
40+
init = {}
41+
}
42+
if (!init.headers) {
43+
init.headers = new Headers()
44+
}
45+
46+
if (init.headers instanceof Headers && !init.headers.has('X-Requested-With')) {
47+
init.headers.append('X-Requested-With', 'XMLHttpRequest')
48+
} else if (init.headers instanceof Object && !init.headers['X-Requested-With']) {
49+
init.headers['X-Requested-With'] = 'XMLHttpRequest'
50+
}
51+
52+
return fetch(input, init)
53+
}
54+
})(window.fetch)
55+
}

0 commit comments

Comments
 (0)