Rename to hkt.sh
This commit is contained in:
48
node_modules/puppeteer-extra-plugin-stealth/evasions/navigator.languages/index.js
generated
vendored
Normal file
48
node_modules/puppeteer-extra-plugin-stealth/evasions/navigator.languages/index.js
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
'use strict'
|
||||
|
||||
const { PuppeteerExtraPlugin } = require('puppeteer-extra-plugin')
|
||||
const withUtils = require('../_utils/withUtils')
|
||||
|
||||
/**
|
||||
* Pass the Languages Test. Allows setting custom languages.
|
||||
*
|
||||
* @param {Object} [opts] - Options
|
||||
* @param {Array<string>} [opts.languages] - The languages to use (default: `['en-US', 'en']`)
|
||||
*/
|
||||
class Plugin extends PuppeteerExtraPlugin {
|
||||
constructor(opts = {}) {
|
||||
super(opts)
|
||||
}
|
||||
|
||||
get name() {
|
||||
return 'stealth/evasions/navigator.languages'
|
||||
}
|
||||
|
||||
get defaults() {
|
||||
return {
|
||||
languages: [] // Empty default, otherwise this would be merged with user defined array override
|
||||
}
|
||||
}
|
||||
|
||||
async onPageCreated(page) {
|
||||
await withUtils(page).evaluateOnNewDocument(
|
||||
(utils, { opts }) => {
|
||||
const languages = opts.languages.length
|
||||
? opts.languages
|
||||
: ['en-US', 'en']
|
||||
utils.replaceGetterWithProxy(
|
||||
Object.getPrototypeOf(navigator),
|
||||
'languages',
|
||||
utils.makeHandler().getterValue(Object.freeze([...languages]))
|
||||
)
|
||||
},
|
||||
{
|
||||
opts: this.opts
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = function (pluginConfig) {
|
||||
return new Plugin(pluginConfig)
|
||||
}
|
||||
102
node_modules/puppeteer-extra-plugin-stealth/evasions/navigator.languages/index.test.js
generated
vendored
Normal file
102
node_modules/puppeteer-extra-plugin-stealth/evasions/navigator.languages/index.test.js
generated
vendored
Normal file
@@ -0,0 +1,102 @@
|
||||
const test = require('ava')
|
||||
|
||||
const {
|
||||
getVanillaFingerPrint,
|
||||
getStealthFingerPrint
|
||||
} = require('../../test/util')
|
||||
const { vanillaPuppeteer, addExtra } = require('../../test/util')
|
||||
|
||||
const Plugin = require('.')
|
||||
|
||||
// TODO: Vanilla seems fine, evasion obsolete?
|
||||
// Note: We keep it around for now, as we will need this method in a fingerprinting plugin later anyway
|
||||
test('vanilla: is array with en-US', async t => {
|
||||
const { languages } = await getVanillaFingerPrint()
|
||||
t.is(Array.isArray(languages), true)
|
||||
t.is(languages[0], 'en-US')
|
||||
})
|
||||
|
||||
test('vanilla: will not have modifications', async t => {
|
||||
const browser = await vanillaPuppeteer.launch({ headless: true })
|
||||
const page = await browser.newPage()
|
||||
|
||||
const test1 = await page.evaluate(
|
||||
() => Object.getOwnPropertyDescriptor(navigator, 'languages') // Must be undefined if native
|
||||
)
|
||||
t.is(test1, undefined)
|
||||
|
||||
const test2 = await page.evaluate(
|
||||
() => Object.getOwnPropertyNames(navigator) // Must be an empty array if native
|
||||
)
|
||||
t.false(test2.includes('languages'))
|
||||
})
|
||||
|
||||
test('stealth: is array with en-US', async t => {
|
||||
const { languages } = await getStealthFingerPrint(Plugin)
|
||||
t.is(Array.isArray(languages), true)
|
||||
t.is(languages[0], 'en-US')
|
||||
})
|
||||
|
||||
test('stealth: customized value', async t => {
|
||||
const { languages } = await getStealthFingerPrint(Plugin, null, {
|
||||
languages: ['foo', 'bar']
|
||||
})
|
||||
t.deepEqual(languages, ['foo', 'bar'])
|
||||
})
|
||||
|
||||
test('stealth: will not leak modifications', async t => {
|
||||
const puppeteer = addExtra(vanillaPuppeteer).use(Plugin())
|
||||
const browser = await puppeteer.launch({ headless: true })
|
||||
const page = await browser.newPage()
|
||||
|
||||
const test1 = await page.evaluate(
|
||||
() => Object.getOwnPropertyDescriptor(navigator, 'languages') // Must be undefined if native
|
||||
)
|
||||
t.is(test1, undefined)
|
||||
|
||||
const test2 = await page.evaluate(
|
||||
() => Object.getOwnPropertyNames(navigator) // Must be an empty array if native
|
||||
)
|
||||
t.false(test2.includes('languages'))
|
||||
})
|
||||
|
||||
test('stealth: does patch getters properly', async t => {
|
||||
const puppeteer = addExtra(vanillaPuppeteer).use(Plugin())
|
||||
const browser = await puppeteer.launch({ headless: true })
|
||||
const page = await browser.newPage()
|
||||
|
||||
const results = await page.evaluate(() => {
|
||||
const hasInvocationError = (() => {
|
||||
try {
|
||||
// eslint-disable-next-line dot-notation
|
||||
Object['seal'](Object.getPrototypeOf(navigator)['languages'])
|
||||
return false
|
||||
} catch (err) {
|
||||
return true
|
||||
}
|
||||
})()
|
||||
const hasPushError = (() => {
|
||||
try {
|
||||
// eslint-disable-next-line dot-notation
|
||||
navigator.languages.push(null)
|
||||
return false
|
||||
} catch (err) {
|
||||
return true
|
||||
}
|
||||
})()
|
||||
return {
|
||||
hasInvocationError,
|
||||
hasPushError,
|
||||
toString: Object.getOwnPropertyDescriptor(
|
||||
Object.getPrototypeOf(navigator),
|
||||
'languages'
|
||||
).get.toString()
|
||||
}
|
||||
})
|
||||
|
||||
t.deepEqual(results, {
|
||||
hasInvocationError: true,
|
||||
hasPushError: true,
|
||||
toString: 'function get languages() { [native code] }'
|
||||
})
|
||||
})
|
||||
4
node_modules/puppeteer-extra-plugin-stealth/evasions/navigator.languages/package.json
generated
vendored
Normal file
4
node_modules/puppeteer-extra-plugin-stealth/evasions/navigator.languages/package.json
generated
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"private": true,
|
||||
"main": "index.js"
|
||||
}
|
||||
18
node_modules/puppeteer-extra-plugin-stealth/evasions/navigator.languages/readme.md
generated
vendored
Normal file
18
node_modules/puppeteer-extra-plugin-stealth/evasions/navigator.languages/readme.md
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
## API
|
||||
|
||||
<!-- Generated by documentation.js. Update this documentation by updating the source code. -->
|
||||
|
||||
#### Table of Contents
|
||||
|
||||
- [class: Plugin](#class-plugin)
|
||||
|
||||
### class: [Plugin](https://github.com/berstend/puppeteer-extra/blob/e6133619b051febed630ada35241664eba59b9fa/packages/puppeteer-extra-plugin-stealth/evasions/navigator.languages/index.js#L11-L28)
|
||||
|
||||
- `opts` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)?** Options (optional, default `{}`)
|
||||
- `opts.languages` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>?** The languages to use (default: `['en-US', 'en']`)
|
||||
|
||||
**Extends: PuppeteerExtraPlugin**
|
||||
|
||||
Pass the Languages Test. Allows setting custom languages.
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user