aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Mayer <[email protected]>2024-12-13 17:31:07 +0700
committerGitHub <[email protected]>2024-12-13 10:31:07 +0000
commit3c7abb55e68fcbcf41560539a15845e7c8882765 (patch)
treeba9a5cda0362f80dcd6ae8ffe1dfee02325ffbee
parent13538a71203f02a87e49422549ab0160878bfcf4 (diff)
downloadfaker-3c7abb55e68fcbcf41560539a15845e7c8882765.tar.xz
faker-3c7abb55e68fcbcf41560539a15845e7c8882765.zip
feat(internet): update to simplified modern user-agent list (#3324)
* feat(internet): update to simplified modern user-agent list * fix reviews suggestions, fix extraneous } --------- Co-authored-by: ST-DDT <[email protected]>
-rw-r--r--src/definitions/internet.ts5
-rw-r--r--src/locales/base/internet/index.ts2
-rw-r--r--src/locales/base/internet/user_agent_pattern.ts22
-rw-r--r--src/modules/internet/index.ts7
-rw-r--r--src/modules/internet/user-agent.ts340
-rw-r--r--test/modules/__snapshots__/internet.spec.ts.snap6
-rw-r--r--test/modules/internet.spec.ts4
7 files changed, 37 insertions, 349 deletions
diff --git a/src/definitions/internet.ts b/src/definitions/internet.ts
index fdcd6a0f..dcd1d5ae 100644
--- a/src/definitions/internet.ts
+++ b/src/definitions/internet.ts
@@ -31,4 +31,9 @@ export type InternetDefinition = LocaleEntry<{
http_status_code: Record<HTTPStatusCodeType, number[]>;
jwt_algorithm: string[];
+
+ /**
+ * List of user agent patterns.
+ */
+ user_agent_pattern: string[];
}>;
diff --git a/src/locales/base/internet/index.ts b/src/locales/base/internet/index.ts
index 55709025..39a51764 100644
--- a/src/locales/base/internet/index.ts
+++ b/src/locales/base/internet/index.ts
@@ -6,11 +6,13 @@ import type { InternetDefinition } from '../../..';
import emoji from './emoji';
import http_status_code from './http_status_code';
import jwt_algorithm from './jwt_algorithm';
+import user_agent_pattern from './user_agent_pattern';
const internet: InternetDefinition = {
emoji,
http_status_code,
jwt_algorithm,
+ user_agent_pattern,
};
export default internet;
diff --git a/src/locales/base/internet/user_agent_pattern.ts b/src/locales/base/internet/user_agent_pattern.ts
new file mode 100644
index 00000000..d94d8a55
--- /dev/null
+++ b/src/locales/base/internet/user_agent_pattern.ts
@@ -0,0 +1,22 @@
+export default [
+ //typical IE user agent on Windows
+ 'Mozilla/5.0 (compatible; MSIE {{number.int({"min":6,"max":10})}}.0; Windows NT {{helpers.arrayElement(["5.1","5.2","6.0","6.1","6.2","6.3","10.0"])}}; Trident/{{number.int({"min":4,"max":7})}}.0)',
+ //typical Edge user agent on Windows
+ 'Mozilla/5.0 (Windows NT {{helpers.arrayElement(["5.1","5.2","6.0","6.1","6.2","6.3","10.0"])}}; Win64; x64) AppleWebKit/{{number.int({"min":536,"max":605})}}.{{number.int({"min":0,"max":99})}} (KHTML, like Gecko) Chrome/{{number.int({"min":55,"max":131})}}.{{system.semver}} Safari/{{number.int({"min":536,"max":605})}}.{{number.int({"min":0,"max":99})}} Edg/{{number.int({"min":110,"max":131})}}.{{system.semver}}',
+ //typical Safari user agent on MacOS
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/{{number.int({"min":536,"max":605})}}.{{number.int({"min":0,"max":99})}}.{{number.int({"min":0,"max":99})}} (KHTML, like Gecko) Version/16.1 Safari/{{number.int({"min":536,"max":605})}}.{{number.int({"min":0,"max":99})}}.{{number.int({"min":0,"max":99})}}',
+ //typical Firefox user agent on MacOS
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:{{number.int({"min":75, "max":133})}}.0) Gecko/20100101 Firefox/{{number.int({"min":75, "max":133})}}.0',
+ //typical Chrome user agent on MacOS
+ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_15_7) AppleWebKit/{{number.int({"min":536,"max":605})}}.{{number.int({"min":0,"max":99})}}.{{number.int({"min":0,"max":99})}} (KHTML, like Gecko) Chrome/{{number.int({"min":55,"max":131})}}.{{system.semver}} Safari/{{number.int({"min":536,"max":605})}}.{{number.int({"min":0,"max":99})}}.{{number.int({"min":0,"max":99})}}',
+ //typical Firefox user agent on Linux
+ 'Mozilla/5.0 (X11; Linux x86_64; rv:{{number.int({"min":75,"max":133})}}.0) Gecko/20100101 Firefox/{{number.int({"min":75,"max":133})}}.0',
+ //typical user agent for a bot
+ 'FakerBot/{{system.semver}}',
+ //typical Googlebot user agent
+ 'Googlebot/2.1 (+http://www.google.com/bot.html)',
+ //typical Safari user agent on iOS
+ 'Mozilla/5.0 (iPhone; CPU iPhone OS {{number.int({"min":10,"max":18})}}_{{number.int({"min":0,"max":4})}} like Mac OS X) AppleWebKit/{{number.int({"min":536,"max":605})}}.{{number.int({"min":0,"max":99})}}.{{number.int({"min":0,"max":99})}} (KHTML, like Gecko) Version/{{number.int({"min":10,"max":18})}}_{{number.int({"min":0,"max":4})}} Mobile/15E148 Safari/{{number.int({"min":536,"max":605})}}.{{number.int({"min":0,"max":99})}}',
+ //typical Chrome user agent on Android
+ 'Mozilla/5.0 (Linux; Android {{number.int({"min":5,"max":13})}}; {{helpers.arrayElement(["SM-G998U","SM-G998B","SM-G998N","SM-G998P","SM-T800"])}}) AppleWebKit/{{number.int({"min":536,"max":605})}}.{{number.int({"min":0,"max":99})}} (KHTML, like Gecko) Chrome/{{number.int({"min":55,"max":131})}}.{{system.semver}} Mobile Safari/{{number.int({"min":536,"max":605})}}.{{number.int({"min":0,"max":99})}}',
+];
diff --git a/src/modules/internet/index.ts b/src/modules/internet/index.ts
index 3cdf2a36..35a3e7d8 100644
--- a/src/modules/internet/index.ts
+++ b/src/modules/internet/index.ts
@@ -4,7 +4,6 @@ import { toBase64Url } from '../../internal/base64';
import { deprecated } from '../../internal/deprecated';
import { ModuleBase } from '../../internal/module-base';
import { charMapping } from './char-mappings';
-import * as random_ua from './user-agent';
export type EmojiType =
| 'smiley'
@@ -798,12 +797,14 @@ export class InternetModule extends ModuleBase {
*
* @example
* faker.internet.userAgent()
- * // 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_8_8) AppleWebKit/536.0.2 (KHTML, like Gecko) Chrome/27.0.849.0 Safari/536.0.2'
+ * // 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_1 like Mac OS X) AppleWebKit/537.19.86 (KHTML, like Gecko) Version/18_3 Mobile/15E148 Safari/598.43'
*
* @since 2.0.1
*/
userAgent(): string {
- return random_ua.generate(this.faker);
+ return this.faker.helpers.fake(
+ this.faker.definitions.internet.user_agent_pattern
+ );
}
/**
diff --git a/src/modules/internet/user-agent.ts b/src/modules/internet/user-agent.ts
deleted file mode 100644
index fba5ed05..00000000
--- a/src/modules/internet/user-agent.ts
+++ /dev/null
@@ -1,340 +0,0 @@
-/**
- * Copyright (c) 2022-2023 Faker
- *
- * This is a version of the original code migrated to TypeScript and modified
- * by the Faker team.
- *
- * Check LICENSE for more details about the copyright.
- *
- * -----------------------------------------------------------------------------
- *
- * Copyright (c) 2012-2014 Jeffrey Mealo
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * -----------------------------------------------------------------------------
- *
- * Based loosely on Luka Pusic's PHP Script:
- * http://360percents.com/posts/php-random-user-agent-generator/
- *
- * The license for that script is as follows:
- *
- * "THE BEER-WARE LICENSE" (Revision 42):
- *
- * <[email protected]> wrote this file. As long as you retain this notice you
- * can do whatever you want with this stuff. If we meet some day, and you think
- * this stuff is worth it, you can buy me a beer in return. Luka Pusic
- */
-
-import type { Faker } from '../..';
-
-type OS = 'lin' | 'mac' | 'win';
-
-type Browser = 'chrome' | 'iexplorer' | 'firefox' | 'safari' | 'opera';
-
-/**
- * Generates a random user-agent.
- *
- * @param faker An existing faker instance.
- */
-export function generate(faker: Faker): string {
- const randomLang = (): string =>
- faker.helpers.arrayElement([
- 'AB',
- 'AF',
- 'AN',
- 'AR',
- 'AS',
- 'AZ',
- 'BE',
- 'BG',
- 'BN',
- 'BO',
- 'BR',
- 'BS',
- 'CA',
- 'CE',
- 'CO',
- 'CS',
- 'CU',
- 'CY',
- 'DA',
- 'DE',
- 'EL',
- 'EN',
- 'EO',
- 'ES',
- 'ET',
- 'EU',
- 'FA',
- 'FI',
- 'FJ',
- 'FO',
- 'FR',
- 'FY',
- 'GA',
- 'GD',
- 'GL',
- 'GV',
- 'HE',
- 'HI',
- 'HR',
- 'HT',
- 'HU',
- 'HY',
- 'ID',
- 'IS',
- 'IT',
- 'JA',
- 'JV',
- 'KA',
- 'KG',
- 'KO',
- 'KU',
- 'KW',
- 'KY',
- 'LA',
- 'LB',
- 'LI',
- 'LN',
- 'LT',
- 'LV',
- 'MG',
- 'MK',
- 'MN',
- 'MO',
- 'MS',
- 'MT',
- 'MY',
- 'NB',
- 'NE',
- 'NL',
- 'NN',
- 'NO',
- 'OC',
- 'PL',
- 'PT',
- 'RM',
- 'RO',
- 'RU',
- 'SC',
- 'SE',
- 'SK',
- 'SL',
- 'SO',
- 'SQ',
- 'SR',
- 'SV',
- 'SW',
- 'TK',
- 'TR',
- 'TY',
- 'UK',
- 'UR',
- 'UZ',
- 'VI',
- 'VO',
- 'YI',
- 'ZH',
- ]);
-
- const randomBrowserAndOS = (): [Browser, OS] => {
- const browserToOsMap = {
- chrome: ['win', 'mac', 'lin'],
- firefox: ['win', 'mac', 'lin'],
- opera: ['win', 'mac', 'lin'],
- safari: ['win', 'mac'],
- iexplorer: ['win'],
- } satisfies Record<Browser, OS[]>;
- const browser: Browser = faker.helpers.objectKey(browserToOsMap);
- const os: OS = faker.helpers.arrayElement(browserToOsMap[browser]);
-
- return [browser, os];
- };
-
- const randomProc = (arch: OS): string =>
- faker.helpers.arrayElement(
- (
- {
- lin: ['i686', 'x86_64'],
- mac: ['Intel', 'PPC', 'U; Intel', 'U; PPC'],
- win: ['', 'WOW64', 'Win64; x64'],
- } satisfies Record<OS, string[]>
- )[arch]
- );
-
- const randomRevision = (dots: number): string => {
- let return_val = '';
- //generate a random revision
- //dots = 2 returns .x.y where x & y are between 0 and 9
- for (let x = 0; x < dots; x++) {
- return_val += `.${faker.string.numeric({ allowLeadingZeros: true })}`;
- }
-
- return return_val;
- };
-
- const version_string = {
- net() {
- return [
- faker.number.int({ min: 1, max: 4 }),
- faker.number.int(9),
- faker.number.int({ min: 10000, max: 99999 }),
- faker.number.int(9),
- ].join('.');
- },
- nt() {
- return [faker.number.int({ min: 5, max: 6 }), faker.number.int(3)].join(
- '.'
- );
- },
- ie() {
- return faker.number.int({ min: 7, max: 11 });
- },
- trident() {
- return [faker.number.int({ min: 3, max: 7 }), faker.number.int(1)].join(
- '.'
- );
- },
- osx(delim?: string) {
- return [
- 10,
- faker.number.int({ min: 5, max: 10 }),
- faker.number.int(9),
- ].join(delim || '.');
- },
- chrome() {
- return [
- faker.number.int({ min: 13, max: 39 }),
- 0,
- faker.number.int({ min: 800, max: 899 }),
- 0,
- ].join('.');
- },
- presto() {
- return `2.9.${faker.number.int({ min: 160, max: 190 })}`;
- },
- presto2() {
- return `${faker.number.int({ min: 10, max: 12 })}.00`;
- },
- safari() {
- return [
- faker.number.int({ min: 531, max: 538 }),
- faker.number.int(2),
- faker.number.int(2),
- ].join('.');
- },
- };
-
- const browserMap = {
- firefox(arch: OS): string {
- //https://developer.mozilla.org/en-US/docs/Gecko_user_agent_string_reference
- const firefox_ver = `${faker.number.int({
- min: 5,
- max: 15,
- })}${randomRevision(2)}`,
- gecko_ver = `Gecko/20100101 Firefox/${firefox_ver}`,
- proc = randomProc(arch),
- os_ver =
- arch === 'win'
- ? `(Windows NT ${version_string.nt()}${proc ? `; ${proc}` : ''}`
- : arch === 'mac'
- ? `(Macintosh; ${proc} Mac OS X ${version_string.osx()}`
- : `(X11; Linux ${proc}`;
-
- return `Mozilla/5.0 ${os_ver}; rv:${firefox_ver.slice(
- 0,
- -2
- )}) ${gecko_ver}`;
- },
-
- iexplorer(): string {
- const ver = version_string.ie();
-
- if (ver >= 11) {
- //http://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx
- return `Mozilla/5.0 (Windows NT 6.${faker.number.int({
- min: 1,
- max: 3,
- })}; Trident/7.0; ${
- faker.datatype.boolean() ? 'Touch; ' : ''
- }rv:11.0) like Gecko`;
- }
-
- //http://msdn.microsoft.com/en-us/library/ie/ms537503(v=vs.85).aspx
- return `Mozilla/5.0 (compatible; MSIE ${ver}.0; Windows NT ${version_string.nt()}; Trident/${version_string.trident()}${
- faker.datatype.boolean() ? `; .NET CLR ${version_string.net()}` : ''
- })`;
- },
-
- opera(arch: OS): string {
- //http://www.opera.com/docs/history/
- const presto_ver = ` Presto/${version_string.presto()} Version/${version_string.presto2()})`,
- os_ver =
- arch === 'win'
- ? `(Windows NT ${version_string.nt()}; U; ${randomLang()}${presto_ver}`
- : arch === 'lin'
- ? `(X11; Linux ${randomProc(
- arch
- )}; U; ${randomLang()}${presto_ver}`
- : `(Macintosh; Intel Mac OS X ${version_string.osx()} U; ${randomLang()} Presto/${version_string.presto()} Version/${version_string.presto2()})`;
-
- return `Opera/${faker.number.int({
- min: 9,
- max: 14,
- })}.${faker.number.int(99)} ${os_ver}`;
- },
-
- safari(arch: OS): string {
- const safari = version_string.safari(),
- ver = `${faker.number.int({
- min: 4,
- max: 7,
- })}.${faker.number.int(1)}.${faker.number.int(10)}`,
- os_ver =
- arch === 'mac'
- ? `(Macintosh; ${randomProc('mac')} Mac OS X ${version_string.osx(
- '_'
- )} rv:${faker.number.int({
- min: 2,
- max: 6,
- })}.0; ${randomLang()}) `
- : `(Windows; U; Windows NT ${version_string.nt()})`;
-
- return `Mozilla/5.0 ${os_ver}AppleWebKit/${safari} (KHTML, like Gecko) Version/${ver} Safari/${safari}`;
- },
-
- chrome(arch: OS): string {
- const safari = version_string.safari(),
- os_ver =
- arch === 'mac'
- ? `(Macintosh; ${randomProc('mac')} Mac OS X ${version_string.osx(
- '_'
- )}) `
- : arch === 'win'
- ? `(Windows; U; Windows NT ${version_string.nt()})`
- : `(X11; Linux ${randomProc(arch)}`;
-
- return `Mozilla/5.0 ${os_ver} AppleWebKit/${safari} (KHTML, like Gecko) Chrome/${version_string.chrome()} Safari/${safari}`;
- },
- };
-
- const [browser, arch] = randomBrowserAndOS();
- return browserMap[browser](arch);
-}
diff --git a/test/modules/__snapshots__/internet.spec.ts.snap b/test/modules/__snapshots__/internet.spec.ts.snap
index 835929e2..43350774 100644
--- a/test/modules/__snapshots__/internet.spec.ts.snap
+++ b/test/modules/__snapshots__/internet.spec.ts.snap
@@ -110,7 +110,7 @@ exports[`internet > 42 > url > with slash appended 1`] = `"https://hospitable-un
exports[`internet > 42 > url > without slash appended and with http protocol 1`] = `"http://hospitable-unit.net"`;
-exports[`internet > 42 > userAgent 1`] = `"Mozilla/5.0 (X11; Linux i686; rv:13.5) Gecko/20100101 Firefox/13.5.1"`;
+exports[`internet > 42 > userAgent 1`] = `"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:131.0) Gecko/20100101 Firefox/118.0"`;
exports[`internet > 42 > userName > noArgs 1`] = `"Garnet.Reynolds-Miller15"`;
@@ -254,7 +254,7 @@ exports[`internet > 1211 > url > with slash appended 1`] = `"https://velvety-tar
exports[`internet > 1211 > url > without slash appended and with http protocol 1`] = `"http://velvety-tarragon.biz"`;
-exports[`internet > 1211 > userAgent 1`] = `"Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"`;
+exports[`internet > 1211 > userAgent 1`] = `"Mozilla/5.0 (Linux; Android 13; SM-G998B) AppleWebKit/605.67 (KHTML, like Gecko) Chrome/107.7.3.6 Mobile Safari/592.76"`;
exports[`internet > 1211 > userName > noArgs 1`] = `"Tito67"`;
@@ -398,7 +398,7 @@ exports[`internet > 1337 > url > with slash appended 1`] = `"https://fatal-co-pr
exports[`internet > 1337 > url > without slash appended and with http protocol 1`] = `"http://fatal-co-producer.biz"`;
-exports[`internet > 1337 > userAgent 1`] = `"Mozilla/5.0 (Windows NT 5.3; WOW64; rv:8.4) Gecko/20100101 Firefox/8.4.3"`;
+exports[`internet > 1337 > userAgent 1`] = `"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/547.27.45 (KHTML, like Gecko) Version/16.1 Safari/558.51.26"`;
exports[`internet > 1337 > userName > noArgs 1`] = `"Devyn.Gottlieb"`;
diff --git a/test/modules/internet.spec.ts b/test/modules/internet.spec.ts
index 9de3a8d9..9dc376f9 100644
--- a/test/modules/internet.spec.ts
+++ b/test/modules/internet.spec.ts
@@ -841,9 +841,7 @@ describe('internet', () => {
expect(ua).toBeTruthy();
expect(ua).toBeTypeOf('string');
expect(ua.length).toBeGreaterThanOrEqual(1);
- expect(ua).toMatch(
- /^(([^\d]+\/[\dA-Za-z.]+(\s\(.*\)))|([^\d]+\/[\dA-Za-z.]+(\s\(.*\)*))(\s[^\d]+\/[\dA-Za-z.]+(\s\(.*\)*))*)$/
- );
+ expect(ua).includes('/');
});
});