2024-08-06 06:56:17 +05:30
|
|
|
// Licensed to the Software Freedom Conservancy (SFC) under one
|
|
|
|
|
// or more contributor license agreements. See the NOTICE file
|
|
|
|
|
// distributed with this work for additional information
|
|
|
|
|
// regarding copyright ownership. The SFC licenses this file
|
|
|
|
|
// to you under the Apache License, Version 2.0 (the
|
|
|
|
|
// "License"); you may not use this file except in compliance
|
|
|
|
|
// with the License. You may obtain a copy of the License at
|
|
|
|
|
//
|
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
//
|
|
|
|
|
// Unless required by applicable law or agreed to in writing,
|
|
|
|
|
// software distributed under the License is distributed on an
|
|
|
|
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
|
|
// KIND, either express or implied. See the License for the
|
|
|
|
|
// specific language governing permissions and limitations
|
|
|
|
|
// under the License.
|
|
|
|
|
|
2025-02-05 21:31:25 +05:30
|
|
|
const { Network: getNetwork } = require('../bidi/network')
|
2024-08-06 06:56:17 +05:30
|
|
|
const { InterceptPhase } = require('../bidi/interceptPhase')
|
|
|
|
|
const { AddInterceptParameters } = require('../bidi/addInterceptParameters')
|
|
|
|
|
|
|
|
|
|
class Network {
|
2024-11-13 10:35:40 +05:30
|
|
|
#callbackId = 0
|
2024-08-06 06:56:17 +05:30
|
|
|
#driver
|
|
|
|
|
#network
|
2024-11-13 10:35:40 +05:30
|
|
|
#authHandlers = new Map()
|
2024-08-06 06:56:17 +05:30
|
|
|
|
|
|
|
|
constructor(driver) {
|
|
|
|
|
this.#driver = driver
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This should be done in the constructor.
|
|
|
|
|
// But since it needs to call async methods we cannot do that in the constructor.
|
2024-10-04 10:18:50 +05:30
|
|
|
// We can have a separate async method that initialises the Network instance.
|
2024-08-06 06:56:17 +05:30
|
|
|
// However, that pattern does not allow chaining the methods as we would like the user to use it.
|
|
|
|
|
// Since it involves awaiting to get the instance and then another await to call the method.
|
|
|
|
|
// Using this allows the user to do this "await driver.network.addAuthenticationHandler(callback)"
|
|
|
|
|
async #init() {
|
|
|
|
|
if (this.#network !== undefined) {
|
|
|
|
|
return
|
|
|
|
|
}
|
2025-02-05 21:31:25 +05:30
|
|
|
this.#network = await getNetwork(this.#driver)
|
2024-08-06 06:56:17 +05:30
|
|
|
|
2024-11-13 10:35:40 +05:30
|
|
|
await this.#network.addIntercept(new AddInterceptParameters(InterceptPhase.AUTH_REQUIRED))
|
2024-08-06 06:56:17 +05:30
|
|
|
|
2024-11-13 10:35:40 +05:30
|
|
|
await this.#network.authRequired(async (event) => {
|
|
|
|
|
const requestId = event.request.request
|
|
|
|
|
const uri = event.request.url
|
|
|
|
|
const credentials = this.getAuthCredentials(uri)
|
|
|
|
|
if (credentials !== null) {
|
|
|
|
|
await this.#network.continueWithAuth(requestId, credentials.username, credentials.password)
|
|
|
|
|
return
|
|
|
|
|
}
|
2024-08-06 06:56:17 +05:30
|
|
|
|
2024-11-13 10:35:40 +05:30
|
|
|
await this.#network.continueWithAuthNoCredentials(requestId)
|
2024-08-06 06:56:17 +05:30
|
|
|
})
|
2024-11-13 10:35:40 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getAuthCredentials(uri) {
|
|
|
|
|
for (let [, value] of this.#authHandlers) {
|
|
|
|
|
if (uri.match(value.uri)) {
|
|
|
|
|
return value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null
|
|
|
|
|
}
|
|
|
|
|
async addAuthenticationHandler(username, password, uri = '//') {
|
|
|
|
|
await this.#init()
|
2024-08-06 06:56:17 +05:30
|
|
|
|
2024-11-13 10:35:40 +05:30
|
|
|
const id = this.#callbackId++
|
|
|
|
|
|
|
|
|
|
this.#authHandlers.set(id, { username, password, uri })
|
2024-08-06 06:56:17 +05:30
|
|
|
return id
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async removeAuthenticationHandler(id) {
|
|
|
|
|
await this.#init()
|
|
|
|
|
|
2024-11-13 10:35:40 +05:30
|
|
|
if (this.#authHandlers.has(id)) {
|
|
|
|
|
this.#authHandlers.delete(id)
|
|
|
|
|
} else {
|
|
|
|
|
throw Error(`Callback with id ${id} not found`)
|
|
|
|
|
}
|
2024-08-06 06:56:17 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async clearAuthenticationHandlers() {
|
2024-11-13 10:35:40 +05:30
|
|
|
this.#authHandlers.clear()
|
2024-08-06 06:56:17 +05:30
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = Network
|