Merge branch 'master' into master
This commit is contained in:
commit
5cde521642
2
.github/dependabot.yml
vendored
2
.github/dependabot.yml
vendored
@ -43,6 +43,8 @@ updates:
|
|||||||
versions: [ '>=0.4.0' ]
|
versions: [ '>=0.4.0' ]
|
||||||
- dependency-name: 'geodesy'
|
- dependency-name: 'geodesy'
|
||||||
versions: [ '>=2.0.0' ]
|
versions: [ '>=2.0.0' ]
|
||||||
|
- dependency-name: 'jimp'
|
||||||
|
versions: [ '1.6.1' ]
|
||||||
- dependency-name: 'otpauth'
|
- dependency-name: 'otpauth'
|
||||||
versions: [ '>=9.4.0' ]
|
versions: [ '>=9.4.0' ]
|
||||||
- dependency-name: 'webpack-dev-server'
|
- dependency-name: 'webpack-dev-server'
|
||||||
|
|||||||
3
.github/workflows/master.yml
vendored
3
.github/workflows/master.yml
vendored
@ -26,8 +26,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Install
|
- name: Install
|
||||||
run: |
|
run: |
|
||||||
export DETECT_CHROMEDRIVER_VERSION=true
|
npm ci
|
||||||
npm install
|
|
||||||
npm run setheapsize
|
npm run setheapsize
|
||||||
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
|
|||||||
23
.github/workflows/pull_requests.yml
vendored
23
.github/workflows/pull_requests.yml
vendored
@ -22,8 +22,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Install
|
- name: Install
|
||||||
run: |
|
run: |
|
||||||
export DETECT_CHROMEDRIVER_VERSION=true
|
npm ci
|
||||||
npm install
|
|
||||||
npm run setheapsize
|
npm run setheapsize
|
||||||
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
@ -38,7 +37,22 @@ jobs:
|
|||||||
if: success()
|
if: success()
|
||||||
run: npx grunt prod
|
run: npx grunt prod
|
||||||
|
|
||||||
|
- name: Upload Build Artefact
|
||||||
|
if: success()
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: zipped-build
|
||||||
|
path: build/prod/*.zip
|
||||||
|
retention-days: 5
|
||||||
|
|
||||||
|
- name: UI Tests
|
||||||
|
if: success()
|
||||||
|
run: |
|
||||||
|
sudo apt-get install xvfb
|
||||||
|
xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
|
if: success()
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
@ -50,8 +64,3 @@ jobs:
|
|||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
- name: UI Tests
|
|
||||||
if: success()
|
|
||||||
run: |
|
|
||||||
sudo apt-get install xvfb
|
|
||||||
xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
|
|
||||||
|
|||||||
1
.github/workflows/releases.yml
vendored
1
.github/workflows/releases.yml
vendored
@ -32,7 +32,6 @@ jobs:
|
|||||||
|
|
||||||
- name: Install
|
- name: Install
|
||||||
run: |
|
run: |
|
||||||
export DETECT_CHROMEDRIVER_VERSION=true
|
|
||||||
npm ci
|
npm ci
|
||||||
npm run setheapsize
|
npm run setheapsize
|
||||||
|
|
||||||
|
|||||||
51
CHANGELOG.md
51
CHANGELOG.md
@ -13,6 +13,30 @@ All major and minor version changes will be documented in this file. Details of
|
|||||||
|
|
||||||
## Details
|
## Details
|
||||||
|
|
||||||
|
### [10.24.0] - 2026-04-27
|
||||||
|
- Update CONTRIBUTING.md [@GCHQDeveloper581] | [#2333]
|
||||||
|
- Fix, and link, Fernet tests [@GCHQDeveloper581] | [#2335]
|
||||||
|
- [#927] added parity bit operation [@j83305] | [#1036]
|
||||||
|
- Feature md link blanks [@BjoernAkAManf] [@GCHQDeveloper581] | [#660]
|
||||||
|
- Accessibility - Add support for screenreaders in operations search [@mattnotmitt] | [#1862]
|
||||||
|
- Added metadata extraction for UUID strings. [@ko80240] | [#2322]
|
||||||
|
- chore (deps): bump the patch-updates group with 6 updates | [#2330]
|
||||||
|
- chore (deps): bump @codemirror/search from 6.6.0 to 6.7.0 | [#2331]
|
||||||
|
- (Feature) Improve CI [@GCHQDeveloper581] | [#2328]
|
||||||
|
- Update dependabot.yml [@GCHQDeveloper581] | [#2326]
|
||||||
|
- chore (deps): bump lodash, grunt-legacy-log and grunt-legacy-util | [#2327]
|
||||||
|
- chore (deps): bump the patch-updates group with 6 updates [@GCHQDeveloper581] | [#2323]
|
||||||
|
- chore (deps): bump autoprefixer from 10.4.27 to 10.5.0 | [#2324]
|
||||||
|
- chore (deps): bump dompurify from 3.3.3 to 3.4.0 | [#2321]
|
||||||
|
- chore (deps): bump follow-redirects from 1.15.11 to 1.16.0 | [#2320]
|
||||||
|
- Regular Expression operation email address regex: Support IPv4 domains [@C85297] [@GCHQDeveloper581] | [#2167]
|
||||||
|
- Rewriting fixCryptoApiImports and fixSnackbarMarkup to js to make it OS agnostic [@BigYellowHammer] | [#2298]
|
||||||
|
- chore (deps): bump basic-ftp from 5.2.1 to 5.2.2 | [#2317]
|
||||||
|
- chore (deps): bump axios from 1.13.6 to 1.15.0 | [#2316]
|
||||||
|
- chore (deps): bump webpack from 5.105.4 to 5.106.0 | [#2315]
|
||||||
|
- chore (deps): bump basic-ftp from 5.2.0 to 5.2.1 | [#2313]
|
||||||
|
- Update vulnerable dependencies [@GCHQDeveloper581] | [#2311]
|
||||||
|
|
||||||
### [10.23.0] - 2026-04-06
|
### [10.23.0] - 2026-04-06
|
||||||
- Properly escape HTML entities in sampleDelim to avoid XSS issue [@GCHQDeveloper581] | [#2307]
|
- Properly escape HTML entities in sampleDelim to avoid XSS issue [@GCHQDeveloper581] | [#2307]
|
||||||
- chore (deps): bump lodash from 4.17.23 to 4.18.1 | [#2304]
|
- chore (deps): bump lodash from 4.17.23 to 4.18.1 | [#2304]
|
||||||
@ -596,6 +620,7 @@ All major and minor version changes will be documented in this file. Details of
|
|||||||
## [4.0.0] - 2016-11-28
|
## [4.0.0] - 2016-11-28
|
||||||
- Initial open source commit [@n1474335] | [b1d73a72](https://github.com/gchq/CyberChef/commit/b1d73a725dc7ab9fb7eb789296efd2b7e4b08306)
|
- Initial open source commit [@n1474335] | [b1d73a72](https://github.com/gchq/CyberChef/commit/b1d73a725dc7ab9fb7eb789296efd2b7e4b08306)
|
||||||
|
|
||||||
|
[10.24.0]: https://github.com/gchq/CyberChef/releases/tag/v10.24.0
|
||||||
[10.23.0]: https://github.com/gchq/CyberChef/releases/tag/v10.23.0
|
[10.23.0]: https://github.com/gchq/CyberChef/releases/tag/v10.23.0
|
||||||
[10.22.0]: https://github.com/gchq/CyberChef/releases/tag/v10.22.0
|
[10.22.0]: https://github.com/gchq/CyberChef/releases/tag/v10.22.0
|
||||||
[10.21.0]: https://github.com/gchq/CyberChef/releases/tag/v10.21.0
|
[10.21.0]: https://github.com/gchq/CyberChef/releases/tag/v10.21.0
|
||||||
@ -872,6 +897,10 @@ All major and minor version changes will be documented in this file. Details of
|
|||||||
[@aby-jo]: https://github.com/aby-jo
|
[@aby-jo]: https://github.com/aby-jo
|
||||||
[@atsiv1]: https://github.com/atsiv1
|
[@atsiv1]: https://github.com/atsiv1
|
||||||
[@fjh1997]: https://github.com/fjh1997
|
[@fjh1997]: https://github.com/fjh1997
|
||||||
|
[@j83305]: https://github.com/j83305
|
||||||
|
[@BjoernAkAManf]: https://github.com/BjoernAkAManf
|
||||||
|
[@ko80240]: https://github.com/ko80240
|
||||||
|
[@BigYellowHammer]: https://github.com/BigYellowHammer
|
||||||
|
|
||||||
|
|
||||||
[8ad18b]: https://github.com/gchq/CyberChef/commit/8ad18bc7db6d9ff184ba3518686293a7685bf7b7
|
[8ad18b]: https://github.com/gchq/CyberChef/commit/8ad18bc7db6d9ff184ba3518686293a7685bf7b7
|
||||||
@ -1141,4 +1170,26 @@ All major and minor version changes will be documented in this file. Details of
|
|||||||
[#2194]: https://github.com/gchq/CyberChef/pull/2194
|
[#2194]: https://github.com/gchq/CyberChef/pull/2194
|
||||||
[#2193]: https://github.com/gchq/CyberChef/pull/2193
|
[#2193]: https://github.com/gchq/CyberChef/pull/2193
|
||||||
[#2192]: https://github.com/gchq/CyberChef/pull/2192
|
[#2192]: https://github.com/gchq/CyberChef/pull/2192
|
||||||
|
[#2333]: https://github.com/gchq/CyberChef/pull/2333
|
||||||
|
[#2335]: https://github.com/gchq/CyberChef/pull/2335
|
||||||
|
[#1036]: https://github.com/gchq/CyberChef/pull/1036
|
||||||
|
[#660]: https://github.com/gchq/CyberChef/pull/660
|
||||||
|
[#1862]: https://github.com/gchq/CyberChef/pull/1862
|
||||||
|
[#2322]: https://github.com/gchq/CyberChef/pull/2322
|
||||||
|
[#2330]: https://github.com/gchq/CyberChef/pull/2330
|
||||||
|
[#2331]: https://github.com/gchq/CyberChef/pull/2331
|
||||||
|
[#2328]: https://github.com/gchq/CyberChef/pull/2328
|
||||||
|
[#2326]: https://github.com/gchq/CyberChef/pull/2326
|
||||||
|
[#2327]: https://github.com/gchq/CyberChef/pull/2327
|
||||||
|
[#2323]: https://github.com/gchq/CyberChef/pull/2323
|
||||||
|
[#2324]: https://github.com/gchq/CyberChef/pull/2324
|
||||||
|
[#2321]: https://github.com/gchq/CyberChef/pull/2321
|
||||||
|
[#2320]: https://github.com/gchq/CyberChef/pull/2320
|
||||||
|
[#2167]: https://github.com/gchq/CyberChef/pull/2167
|
||||||
|
[#2298]: https://github.com/gchq/CyberChef/pull/2298
|
||||||
|
[#2317]: https://github.com/gchq/CyberChef/pull/2317
|
||||||
|
[#2316]: https://github.com/gchq/CyberChef/pull/2316
|
||||||
|
[#2315]: https://github.com/gchq/CyberChef/pull/2315
|
||||||
|
[#2313]: https://github.com/gchq/CyberChef/pull/2313
|
||||||
|
[#2311]: https://github.com/gchq/CyberChef/pull/2311
|
||||||
|
|
||||||
|
|||||||
@ -6,10 +6,13 @@ There are lots of opportunities to contribute to CyberChef. If you want ideas, t
|
|||||||
|
|
||||||
Before your contributions can be accepted, you must:
|
Before your contributions can be accepted, you must:
|
||||||
|
|
||||||
- Sign the [GCHQ Contributor Licence Agreement](https://cla-assistant.io/gchq/CyberChef)
|
- Fork the CyberChef repo
|
||||||
|
- Create a new branch within your fork for the changes
|
||||||
- Push your changes to your fork.
|
- Push your changes to your fork.
|
||||||
|
- Sign the [GCHQ Contributor Licence Agreement](https://cla-assistant.io/gchq/CyberChef)
|
||||||
- Submit a pull request.
|
- Submit a pull request.
|
||||||
|
|
||||||
|
Please note that we will ***reject*** pull requests from the master branch of your fork owing to the mess it makes of our own working repositories and the extra work entailed.
|
||||||
|
|
||||||
## Coding conventions
|
## Coding conventions
|
||||||
|
|
||||||
|
|||||||
@ -27,7 +27,7 @@ RUN npm run build
|
|||||||
#########################################
|
#########################################
|
||||||
# Package static build files into nginx #
|
# Package static build files into nginx #
|
||||||
#########################################
|
#########################################
|
||||||
FROM nginx:stable-alpine AS cyberchef
|
FROM nginxinc/nginx-unprivileged:stable-alpine AS cyberchef
|
||||||
|
|
||||||
LABEL maintainer="GCHQ <oss@gchq.gov.uk>"
|
LABEL maintainer="GCHQ <oss@gchq.gov.uk>"
|
||||||
|
|
||||||
|
|||||||
@ -36,7 +36,7 @@ docker build --tag cyberchef --ulimit nofile=10000 .
|
|||||||
```
|
```
|
||||||
2. Run the docker container
|
2. Run the docker container
|
||||||
```bash
|
```bash
|
||||||
docker run -it -p 8080:80 cyberchef
|
docker run -it -p 8080:8080 cyberchef
|
||||||
```
|
```
|
||||||
3. Navigate to `http://localhost:8080` in your browser
|
3. Navigate to `http://localhost:8080` in your browser
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ docker run -it -p 8080:80 cyberchef
|
|||||||
If you prefer to skip the build process, you can use the pre-built image
|
If you prefer to skip the build process, you can use the pre-built image
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -it -p 8080:80 ghcr.io/gchq/cyberchef:latest
|
docker run -it -p 8080:8080 ghcr.io/gchq/cyberchef:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
Just like before, navigate to `http://localhost:8080` in your browser.
|
Just like before, navigate to `http://localhost:8080` in your browser.
|
||||||
|
|||||||
229
package-lock.json
generated
229
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "cyberchef",
|
"name": "cyberchef",
|
||||||
"version": "10.23.0",
|
"version": "10.24.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "cyberchef",
|
"name": "cyberchef",
|
||||||
"version": "10.23.0",
|
"version": "10.24.0",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -14,7 +14,7 @@
|
|||||||
"@astronautlabs/amf": "^0.0.6",
|
"@astronautlabs/amf": "^0.0.6",
|
||||||
"@blu3r4y/lzma": "^2.3.3",
|
"@blu3r4y/lzma": "^2.3.3",
|
||||||
"@wavesenterprise/crypto-gost-js": "^2.1.0-RC1",
|
"@wavesenterprise/crypto-gost-js": "^2.1.0-RC1",
|
||||||
"@xmldom/xmldom": "^0.8.12",
|
"@xmldom/xmldom": "^0.8.13",
|
||||||
"argon2-browser": "^1.18.0",
|
"argon2-browser": "^1.18.0",
|
||||||
"arrive": "^2.5.3",
|
"arrive": "^2.5.3",
|
||||||
"assert": "^2.1.0",
|
"assert": "^2.1.0",
|
||||||
@ -38,7 +38,7 @@
|
|||||||
"d3": "7.9.0",
|
"d3": "7.9.0",
|
||||||
"d3-hexbin": "^0.2.2",
|
"d3-hexbin": "^0.2.2",
|
||||||
"diff": "^5.2.2",
|
"diff": "^5.2.2",
|
||||||
"dompurify": "^3.3.3",
|
"dompurify": "^3.4.1",
|
||||||
"es6-promisify": "^7.0.0",
|
"es6-promisify": "^7.0.0",
|
||||||
"escodegen": "^2.1.0",
|
"escodegen": "^2.1.0",
|
||||||
"esprima": "^4.0.1",
|
"esprima": "^4.0.1",
|
||||||
@ -52,7 +52,7 @@
|
|||||||
"hash-wasm": "^4.12.0",
|
"hash-wasm": "^4.12.0",
|
||||||
"highlight.js": "^11.11.1",
|
"highlight.js": "^11.11.1",
|
||||||
"ieee754": "^1.2.1",
|
"ieee754": "^1.2.1",
|
||||||
"jimp": "^1.6.0",
|
"jimp": "1.6.0",
|
||||||
"jq-web": "^0.5.1",
|
"jq-web": "^0.5.1",
|
||||||
"jquery": "3.7.1",
|
"jquery": "3.7.1",
|
||||||
"js-sha3": "^0.9.3",
|
"js-sha3": "^0.9.3",
|
||||||
@ -62,7 +62,7 @@
|
|||||||
"jsonpath-plus": "^10.4.0",
|
"jsonpath-plus": "^10.4.0",
|
||||||
"jsonwebtoken": "9.0.3",
|
"jsonwebtoken": "9.0.3",
|
||||||
"jsqr": "^1.4.0",
|
"jsqr": "^1.4.0",
|
||||||
"jsrsasign": "^11.1.1",
|
"jsrsasign": "^11.1.3",
|
||||||
"kbpgp": "^2.1.17",
|
"kbpgp": "^2.1.17",
|
||||||
"libbzip2-wasm": "0.0.4",
|
"libbzip2-wasm": "0.0.4",
|
||||||
"libyara-wasm": "^1.2.1",
|
"libyara-wasm": "^1.2.1",
|
||||||
@ -85,7 +85,7 @@
|
|||||||
"path": "^0.12.7",
|
"path": "^0.12.7",
|
||||||
"popper.js": "^1.16.1",
|
"popper.js": "^1.16.1",
|
||||||
"process": "^0.11.10",
|
"process": "^0.11.10",
|
||||||
"protobufjs": "^7.5.4",
|
"protobufjs": "^7.5.5",
|
||||||
"qr-image": "^3.2.0",
|
"qr-image": "^3.2.0",
|
||||||
"reflect-metadata": "^0.2.2",
|
"reflect-metadata": "^0.2.2",
|
||||||
"rison": "^0.1.1",
|
"rison": "^0.1.1",
|
||||||
@ -115,10 +115,10 @@
|
|||||||
"@babel/runtime": "^7.29.2",
|
"@babel/runtime": "^7.29.2",
|
||||||
"@codemirror/commands": "^6.10.3",
|
"@codemirror/commands": "^6.10.3",
|
||||||
"@codemirror/language": "^6.12.3",
|
"@codemirror/language": "^6.12.3",
|
||||||
"@codemirror/search": "^6.6.0",
|
"@codemirror/search": "^6.7.0",
|
||||||
"@codemirror/state": "^6.5.4",
|
"@codemirror/state": "^6.5.4",
|
||||||
"@codemirror/view": "^6.41.0",
|
"@codemirror/view": "^6.41.1",
|
||||||
"autoprefixer": "^10.4.27",
|
"autoprefixer": "^10.5.0",
|
||||||
"babel-loader": "^10.1.1",
|
"babel-loader": "^10.1.1",
|
||||||
"base64-loader": "^1.0.0",
|
"base64-loader": "^1.0.0",
|
||||||
"chromedriver": "^146.0.6",
|
"chromedriver": "^146.0.6",
|
||||||
@ -132,7 +132,7 @@
|
|||||||
"eslint": "^9.39.4",
|
"eslint": "^9.39.4",
|
||||||
"eslint-plugin-jsdoc": "^50.8.0",
|
"eslint-plugin-jsdoc": "^50.8.0",
|
||||||
"globals": "^15.15.0",
|
"globals": "^15.15.0",
|
||||||
"grunt": "^1.6.1",
|
"grunt": "^1.6.2",
|
||||||
"grunt-chmod": "~1.1.1",
|
"grunt-chmod": "~1.1.1",
|
||||||
"grunt-concurrent": "^3.0.0",
|
"grunt-concurrent": "^3.0.0",
|
||||||
"grunt-contrib-clean": "~2.0.1",
|
"grunt-contrib-clean": "~2.0.1",
|
||||||
@ -143,19 +143,19 @@
|
|||||||
"grunt-exec": "~3.0.0",
|
"grunt-exec": "~3.0.0",
|
||||||
"grunt-webpack": "^6.0.0",
|
"grunt-webpack": "^6.0.0",
|
||||||
"grunt-zip": "^1.0.0",
|
"grunt-zip": "^1.0.0",
|
||||||
"html-webpack-plugin": "^5.6.6",
|
"html-webpack-plugin": "^5.6.7",
|
||||||
"imports-loader": "^5.0.0",
|
"imports-loader": "^5.0.0",
|
||||||
"mini-css-extract-plugin": "2.10.2",
|
"mini-css-extract-plugin": "2.10.2",
|
||||||
"modify-source-webpack-plugin": "^4.1.0",
|
"modify-source-webpack-plugin": "^4.1.0",
|
||||||
"nightwatch": "^3.15.0",
|
"nightwatch": "^3.15.0",
|
||||||
"postcss": "^8.5.8",
|
"postcss": "^8.5.10",
|
||||||
"postcss-css-variables": "^0.19.0",
|
"postcss-css-variables": "^0.19.0",
|
||||||
"postcss-import": "^16.1.1",
|
"postcss-import": "^16.1.1",
|
||||||
"postcss-loader": "^8.2.1",
|
"postcss-loader": "^8.2.1",
|
||||||
"prompt": "^1.3.0",
|
"prompt": "^1.3.0",
|
||||||
"sitemap": "^8.0.3",
|
"sitemap": "^8.0.3",
|
||||||
"terser": "^5.46.1",
|
"terser": "^5.46.2",
|
||||||
"webpack": "^5.106.0",
|
"webpack": "^5.106.2",
|
||||||
"webpack-bundle-analyzer": "^4.10.2",
|
"webpack-bundle-analyzer": "^4.10.2",
|
||||||
"webpack-dev-server": "5.0.4",
|
"webpack-dev-server": "5.0.4",
|
||||||
"webpack-node-externals": "^3.0.0",
|
"webpack-node-externals": "^3.0.0",
|
||||||
@ -1868,9 +1868,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@codemirror/search": {
|
"node_modules/@codemirror/search": {
|
||||||
"version": "6.6.0",
|
"version": "6.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.0.tgz",
|
||||||
"integrity": "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==",
|
"integrity": "sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -1890,9 +1890,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@codemirror/view": {
|
"node_modules/@codemirror/view": {
|
||||||
"version": "6.41.0",
|
"version": "6.41.1",
|
||||||
"resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.41.0.tgz",
|
"resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.41.1.tgz",
|
||||||
"integrity": "sha512-6H/qadXsVuDY219Yljhohglve8xf4B8xJkVOEWfA5uiYKiTFppjqsvsfR5iPA0RbvRBoOyTZpbLIxe9+0UR8xA==",
|
"integrity": "sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -4524,9 +4524,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@xmldom/xmldom": {
|
"node_modules/@xmldom/xmldom": {
|
||||||
"version": "0.8.12",
|
"version": "0.8.13",
|
||||||
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz",
|
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz",
|
||||||
"integrity": "sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==",
|
"integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
@ -5089,9 +5089,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/autoprefixer": {
|
"node_modules/autoprefixer": {
|
||||||
"version": "10.4.27",
|
"version": "10.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz",
|
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz",
|
||||||
"integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==",
|
"integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -5109,8 +5109,8 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"browserslist": "^4.28.1",
|
"browserslist": "^4.28.2",
|
||||||
"caniuse-lite": "^1.0.30001774",
|
"caniuse-lite": "^1.0.30001787",
|
||||||
"fraction.js": "^5.3.4",
|
"fraction.js": "^5.3.4",
|
||||||
"picocolors": "^1.1.1",
|
"picocolors": "^1.1.1",
|
||||||
"postcss-value-parser": "^4.2.0"
|
"postcss-value-parser": "^4.2.0"
|
||||||
@ -5293,9 +5293,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/baseline-browser-mapping": {
|
"node_modules/baseline-browser-mapping": {
|
||||||
"version": "2.10.0",
|
"version": "2.10.19",
|
||||||
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.19.tgz",
|
||||||
"integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==",
|
"integrity": "sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"bin": {
|
"bin": {
|
||||||
@ -5865,9 +5865,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/browserslist": {
|
"node_modules/browserslist": {
|
||||||
"version": "4.28.1",
|
"version": "4.28.2",
|
||||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
|
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
|
||||||
"integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
|
"integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -5885,11 +5885,11 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"baseline-browser-mapping": "^2.9.0",
|
"baseline-browser-mapping": "^2.10.12",
|
||||||
"caniuse-lite": "^1.0.30001759",
|
"caniuse-lite": "^1.0.30001782",
|
||||||
"electron-to-chromium": "^1.5.263",
|
"electron-to-chromium": "^1.5.328",
|
||||||
"node-releases": "^2.0.27",
|
"node-releases": "^2.0.36",
|
||||||
"update-browserslist-db": "^1.2.0"
|
"update-browserslist-db": "^1.2.3"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"browserslist": "cli.js"
|
"browserslist": "cli.js"
|
||||||
@ -6097,9 +6097,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001777",
|
"version": "1.0.30001788",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz",
|
||||||
"integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==",
|
"integrity": "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -8296,9 +8296,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/dompurify": {
|
"node_modules/dompurify": {
|
||||||
"version": "3.3.3",
|
"version": "3.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.1.tgz",
|
||||||
"integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==",
|
"integrity": "sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==",
|
||||||
"license": "(MPL-2.0 OR Apache-2.0)",
|
"license": "(MPL-2.0 OR Apache-2.0)",
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@types/trusted-types": "^2.0.7"
|
"@types/trusted-types": "^2.0.7"
|
||||||
@ -8417,9 +8417,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.5.307",
|
"version": "1.5.339",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.339.tgz",
|
||||||
"integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==",
|
"integrity": "sha512-Is+0BBHJ4NrdpAYiperrmp53pLywG/yV/6lIMTAnhxvzj/Cmn5Q/ogSHC6AKe7X+8kPLxxFk0cs5oc/3j/fxIg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
@ -9148,6 +9148,16 @@
|
|||||||
"node": ">= 0.8.0"
|
"node": ">= 0.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/exit-x": {
|
||||||
|
"version": "0.2.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz",
|
||||||
|
"integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.8.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/expand-tilde": {
|
"node_modules/expand-tilde": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
|
||||||
@ -9654,9 +9664,9 @@
|
|||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/follow-redirects": {
|
"node_modules/follow-redirects": {
|
||||||
"version": "1.15.11",
|
"version": "1.16.0",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
|
||||||
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
|
"integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -10170,9 +10180,9 @@
|
|||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/grunt": {
|
"node_modules/grunt": {
|
||||||
"version": "1.6.1",
|
"version": "1.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.2.tgz",
|
||||||
"integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==",
|
"integrity": "sha512-bUzh5nA/P5L66ihXTDP6J5BGnMB/8lXJXejYWSbH4Y4TvWM9t2S39sggQDYYQlx06cYcCsmu63HMYHGCIzUVfg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -10181,14 +10191,14 @@
|
|||||||
"exit": "~0.1.2",
|
"exit": "~0.1.2",
|
||||||
"findup-sync": "~5.0.0",
|
"findup-sync": "~5.0.0",
|
||||||
"glob": "~7.1.6",
|
"glob": "~7.1.6",
|
||||||
"grunt-cli": "~1.4.3",
|
"grunt-cli": "^1.4.3",
|
||||||
"grunt-known-options": "~2.0.0",
|
"grunt-known-options": "~2.0.0",
|
||||||
"grunt-legacy-log": "~3.0.0",
|
"grunt-legacy-log": "~3.0.0",
|
||||||
"grunt-legacy-util": "~2.0.1",
|
"grunt-legacy-util": "~2.0.1",
|
||||||
"iconv-lite": "~0.6.3",
|
"iconv-lite": "~0.6.3",
|
||||||
"js-yaml": "~3.14.0",
|
"js-yaml": "~3.14.0",
|
||||||
"minimatch": "~3.0.4",
|
"minimatch": "^3.1.5",
|
||||||
"nopt": "~3.0.6"
|
"nopt": "^5.0.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"grunt": "bin/grunt"
|
"grunt": "bin/grunt"
|
||||||
@ -10430,16 +10440,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/grunt-legacy-log": {
|
"node_modules/grunt-legacy-log": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.1.tgz",
|
||||||
"integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
|
"integrity": "sha512-vytI3IUC8qUK9TcvvpHpGJzDojua/sfJV4TdLB4FtCFzospqduzBuL3+dEfpvO+tGECv7/273+33hjjMXSa92g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"colors": "~1.1.2",
|
"colors": "~1.1.2",
|
||||||
"grunt-legacy-log-utils": "~2.1.0",
|
"grunt-legacy-log-utils": "^2.1.3",
|
||||||
"hooker": "~0.2.3",
|
"hooker": "~0.2.3",
|
||||||
"lodash": "~4.17.19"
|
"lodash": "^4.18.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.10.0"
|
"node": ">= 0.10.0"
|
||||||
@ -10514,25 +10524,18 @@
|
|||||||
"node": ">=0.1.90"
|
"node": ">=0.1.90"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/grunt-legacy-log/node_modules/lodash": {
|
|
||||||
"version": "4.17.23",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
|
|
||||||
"integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/grunt-legacy-util": {
|
"node_modules/grunt-legacy-util": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.2.tgz",
|
||||||
"integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==",
|
"integrity": "sha512-0xoDILyR4BVJel5uJwnhjdWN9evOQ8A0uXbQUIJ0hgVthIA6kloXHSoqATQPj6BRrHrHkcQtCeGVb0ixFoHyEQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "~3.2.0",
|
"async": "~3.2.0",
|
||||||
"exit": "~0.1.2",
|
"exit-x": "~0.2.2",
|
||||||
"getobject": "~1.0.0",
|
"getobject": "~1.0.0",
|
||||||
"hooker": "~0.2.3",
|
"hooker": "~0.2.3",
|
||||||
"lodash": "~4.17.21",
|
"lodash": "^4.18.0",
|
||||||
"underscore.string": "~3.3.5",
|
"underscore.string": "~3.3.5",
|
||||||
"which": "~2.0.2"
|
"which": "~2.0.2"
|
||||||
},
|
},
|
||||||
@ -10540,13 +10543,6 @@
|
|||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/grunt-legacy-util/node_modules/lodash": {
|
|
||||||
"version": "4.17.23",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
|
|
||||||
"integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/grunt-retro": {
|
"node_modules/grunt-retro": {
|
||||||
"version": "0.6.4",
|
"version": "0.6.4",
|
||||||
"resolved": "https://registry.npmjs.org/grunt-retro/-/grunt-retro-0.6.4.tgz",
|
"resolved": "https://registry.npmjs.org/grunt-retro/-/grunt-retro-0.6.4.tgz",
|
||||||
@ -10618,9 +10614,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/grunt/node_modules/minimatch": {
|
"node_modules/grunt/node_modules/minimatch": {
|
||||||
"version": "3.0.8",
|
"version": "3.1.5",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
|
||||||
"integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
|
"integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -10931,9 +10927,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/html-webpack-plugin": {
|
"node_modules/html-webpack-plugin": {
|
||||||
"version": "5.6.6",
|
"version": "5.6.7",
|
||||||
"resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz",
|
"resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz",
|
||||||
"integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==",
|
"integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -12416,13 +12412,10 @@
|
|||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/jsrsasign": {
|
"node_modules/jsrsasign": {
|
||||||
"version": "11.1.1",
|
"version": "11.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-11.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-11.1.3.tgz",
|
||||||
"integrity": "sha512-6w95OOXH8DNeGxakqLndBEqqwQ6A70zGaky1oxfg8WVLWOnghTfJsc5Tknx+Z88MHSb1bGLcqQHImOF8Lk22XA==",
|
"integrity": "sha512-nPnK5D/4lv0Dwr7TlzrKtAd8JlLZwFTqTUUB3NQCbtdobcRcohGFxjbPySDVh74iWUudcCsapYT6OxoyhJLhhA==",
|
||||||
"license": "MIT",
|
"license": "MIT"
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/kjur/jsrsasign#donations"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"node_modules/jszip": {
|
"node_modules/jszip": {
|
||||||
"version": "3.10.1",
|
"version": "3.10.1",
|
||||||
@ -13838,9 +13831,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/nopt": {
|
"node_modules/nopt": {
|
||||||
"version": "3.0.6",
|
"version": "5.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
|
||||||
"integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
|
"integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -13848,6 +13841,9 @@
|
|||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"nopt": "bin/nopt.js"
|
"nopt": "bin/nopt.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/normalize-path": {
|
"node_modules/normalize-path": {
|
||||||
@ -14819,9 +14815,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.5.8",
|
"version": "8.5.10",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz",
|
||||||
"integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
|
"integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -15078,9 +15074,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/protobufjs": {
|
"node_modules/protobufjs": {
|
||||||
"version": "7.5.4",
|
"version": "7.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz",
|
||||||
"integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==",
|
"integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "BSD-3-Clause",
|
"license": "BSD-3-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -17066,9 +17062,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/terser": {
|
"node_modules/terser": {
|
||||||
"version": "5.46.1",
|
"version": "5.46.2",
|
||||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz",
|
"resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz",
|
||||||
"integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==",
|
"integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -17894,9 +17890,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/webpack": {
|
"node_modules/webpack": {
|
||||||
"version": "5.106.0",
|
"version": "5.106.2",
|
||||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.0.tgz",
|
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz",
|
||||||
"integrity": "sha512-Pkx5joZ9RrdgO5LBkyX1L2ZAJeK/Taz3vqZ9CbcP0wS5LEMx5QkKsEwLl29QJfihZ+DKRBFldzy1O30pJ1MDpA==",
|
"integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -17916,9 +17912,8 @@
|
|||||||
"events": "^3.2.0",
|
"events": "^3.2.0",
|
||||||
"glob-to-regexp": "^0.4.1",
|
"glob-to-regexp": "^0.4.1",
|
||||||
"graceful-fs": "^4.2.11",
|
"graceful-fs": "^4.2.11",
|
||||||
"json-parse-even-better-errors": "^2.3.1",
|
|
||||||
"loader-runner": "^4.3.1",
|
"loader-runner": "^4.3.1",
|
||||||
"mime-types": "^2.1.27",
|
"mime-db": "^1.54.0",
|
||||||
"neo-async": "^2.6.2",
|
"neo-async": "^2.6.2",
|
||||||
"schema-utils": "^4.3.3",
|
"schema-utils": "^4.3.3",
|
||||||
"tapable": "^2.3.0",
|
"tapable": "^2.3.0",
|
||||||
@ -18239,6 +18234,16 @@
|
|||||||
"node": ">=10.13.0"
|
"node": ">=10.13.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/webpack/node_modules/mime-db": {
|
||||||
|
"version": "1.54.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
|
||||||
|
"integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/websocket-driver": {
|
"node_modules/websocket-driver": {
|
||||||
"version": "0.7.4",
|
"version": "0.7.4",
|
||||||
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
|
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
|
||||||
|
|||||||
28
package.json
28
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "cyberchef",
|
"name": "cyberchef",
|
||||||
"version": "10.23.0",
|
"version": "10.24.0",
|
||||||
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
|
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
|
||||||
"author": "n1474335 <n1474335@gmail.com>",
|
"author": "n1474335 <n1474335@gmail.com>",
|
||||||
"homepage": "https://gchq.github.io/CyberChef",
|
"homepage": "https://gchq.github.io/CyberChef",
|
||||||
@ -46,10 +46,10 @@
|
|||||||
"@babel/runtime": "^7.29.2",
|
"@babel/runtime": "^7.29.2",
|
||||||
"@codemirror/commands": "^6.10.3",
|
"@codemirror/commands": "^6.10.3",
|
||||||
"@codemirror/language": "^6.12.3",
|
"@codemirror/language": "^6.12.3",
|
||||||
"@codemirror/search": "^6.6.0",
|
"@codemirror/search": "^6.7.0",
|
||||||
"@codemirror/state": "^6.5.4",
|
"@codemirror/state": "^6.5.4",
|
||||||
"@codemirror/view": "^6.41.0",
|
"@codemirror/view": "^6.41.1",
|
||||||
"autoprefixer": "^10.4.27",
|
"autoprefixer": "^10.5.0",
|
||||||
"babel-loader": "^10.1.1",
|
"babel-loader": "^10.1.1",
|
||||||
"base64-loader": "^1.0.0",
|
"base64-loader": "^1.0.0",
|
||||||
"chromedriver": "^146.0.6",
|
"chromedriver": "^146.0.6",
|
||||||
@ -63,7 +63,7 @@
|
|||||||
"eslint": "^9.39.4",
|
"eslint": "^9.39.4",
|
||||||
"eslint-plugin-jsdoc": "^50.8.0",
|
"eslint-plugin-jsdoc": "^50.8.0",
|
||||||
"globals": "^15.15.0",
|
"globals": "^15.15.0",
|
||||||
"grunt": "^1.6.1",
|
"grunt": "^1.6.2",
|
||||||
"grunt-chmod": "~1.1.1",
|
"grunt-chmod": "~1.1.1",
|
||||||
"grunt-concurrent": "^3.0.0",
|
"grunt-concurrent": "^3.0.0",
|
||||||
"grunt-contrib-clean": "~2.0.1",
|
"grunt-contrib-clean": "~2.0.1",
|
||||||
@ -74,19 +74,19 @@
|
|||||||
"grunt-exec": "~3.0.0",
|
"grunt-exec": "~3.0.0",
|
||||||
"grunt-webpack": "^6.0.0",
|
"grunt-webpack": "^6.0.0",
|
||||||
"grunt-zip": "^1.0.0",
|
"grunt-zip": "^1.0.0",
|
||||||
"html-webpack-plugin": "^5.6.6",
|
"html-webpack-plugin": "^5.6.7",
|
||||||
"imports-loader": "^5.0.0",
|
"imports-loader": "^5.0.0",
|
||||||
"mini-css-extract-plugin": "2.10.2",
|
"mini-css-extract-plugin": "2.10.2",
|
||||||
"modify-source-webpack-plugin": "^4.1.0",
|
"modify-source-webpack-plugin": "^4.1.0",
|
||||||
"nightwatch": "^3.15.0",
|
"nightwatch": "^3.15.0",
|
||||||
"postcss": "^8.5.8",
|
"postcss": "^8.5.10",
|
||||||
"postcss-css-variables": "^0.19.0",
|
"postcss-css-variables": "^0.19.0",
|
||||||
"postcss-import": "^16.1.1",
|
"postcss-import": "^16.1.1",
|
||||||
"postcss-loader": "^8.2.1",
|
"postcss-loader": "^8.2.1",
|
||||||
"prompt": "^1.3.0",
|
"prompt": "^1.3.0",
|
||||||
"sitemap": "^8.0.3",
|
"sitemap": "^8.0.3",
|
||||||
"terser": "^5.46.1",
|
"terser": "^5.46.2",
|
||||||
"webpack": "^5.106.0",
|
"webpack": "^5.106.2",
|
||||||
"webpack-bundle-analyzer": "^4.10.2",
|
"webpack-bundle-analyzer": "^4.10.2",
|
||||||
"webpack-dev-server": "5.0.4",
|
"webpack-dev-server": "5.0.4",
|
||||||
"webpack-node-externals": "^3.0.0",
|
"webpack-node-externals": "^3.0.0",
|
||||||
@ -97,7 +97,7 @@
|
|||||||
"@astronautlabs/amf": "^0.0.6",
|
"@astronautlabs/amf": "^0.0.6",
|
||||||
"@blu3r4y/lzma": "^2.3.3",
|
"@blu3r4y/lzma": "^2.3.3",
|
||||||
"@wavesenterprise/crypto-gost-js": "^2.1.0-RC1",
|
"@wavesenterprise/crypto-gost-js": "^2.1.0-RC1",
|
||||||
"@xmldom/xmldom": "^0.8.12",
|
"@xmldom/xmldom": "^0.8.13",
|
||||||
"argon2-browser": "^1.18.0",
|
"argon2-browser": "^1.18.0",
|
||||||
"arrive": "^2.5.3",
|
"arrive": "^2.5.3",
|
||||||
"assert": "^2.1.0",
|
"assert": "^2.1.0",
|
||||||
@ -121,7 +121,7 @@
|
|||||||
"d3": "7.9.0",
|
"d3": "7.9.0",
|
||||||
"d3-hexbin": "^0.2.2",
|
"d3-hexbin": "^0.2.2",
|
||||||
"diff": "^5.2.2",
|
"diff": "^5.2.2",
|
||||||
"dompurify": "^3.3.3",
|
"dompurify": "^3.4.1",
|
||||||
"es6-promisify": "^7.0.0",
|
"es6-promisify": "^7.0.0",
|
||||||
"escodegen": "^2.1.0",
|
"escodegen": "^2.1.0",
|
||||||
"esprima": "^4.0.1",
|
"esprima": "^4.0.1",
|
||||||
@ -135,7 +135,7 @@
|
|||||||
"hash-wasm": "^4.12.0",
|
"hash-wasm": "^4.12.0",
|
||||||
"highlight.js": "^11.11.1",
|
"highlight.js": "^11.11.1",
|
||||||
"ieee754": "^1.2.1",
|
"ieee754": "^1.2.1",
|
||||||
"jimp": "^1.6.0",
|
"jimp": "1.6.0",
|
||||||
"jq-web": "^0.5.1",
|
"jq-web": "^0.5.1",
|
||||||
"jquery": "3.7.1",
|
"jquery": "3.7.1",
|
||||||
"js-sha3": "^0.9.3",
|
"js-sha3": "^0.9.3",
|
||||||
@ -145,7 +145,7 @@
|
|||||||
"jsonpath-plus": "^10.4.0",
|
"jsonpath-plus": "^10.4.0",
|
||||||
"jsonwebtoken": "9.0.3",
|
"jsonwebtoken": "9.0.3",
|
||||||
"jsqr": "^1.4.0",
|
"jsqr": "^1.4.0",
|
||||||
"jsrsasign": "^11.1.1",
|
"jsrsasign": "^11.1.3",
|
||||||
"kbpgp": "^2.1.17",
|
"kbpgp": "^2.1.17",
|
||||||
"libbzip2-wasm": "0.0.4",
|
"libbzip2-wasm": "0.0.4",
|
||||||
"libyara-wasm": "^1.2.1",
|
"libyara-wasm": "^1.2.1",
|
||||||
@ -168,7 +168,7 @@
|
|||||||
"path": "^0.12.7",
|
"path": "^0.12.7",
|
||||||
"popper.js": "^1.16.1",
|
"popper.js": "^1.16.1",
|
||||||
"process": "^0.11.10",
|
"process": "^0.11.10",
|
||||||
"protobufjs": "^7.5.4",
|
"protobufjs": "^7.5.5",
|
||||||
"qr-image": "^3.2.0",
|
"qr-image": "^3.2.0",
|
||||||
"reflect-metadata": "^0.2.2",
|
"reflect-metadata": "^0.2.2",
|
||||||
"rison": "^0.1.1",
|
"rison": "^0.1.1",
|
||||||
|
|||||||
@ -467,7 +467,8 @@
|
|||||||
"Luhn Checksum",
|
"Luhn Checksum",
|
||||||
"CRC Checksum",
|
"CRC Checksum",
|
||||||
"TCP/IP Checksum",
|
"TCP/IP Checksum",
|
||||||
"XOR Checksum"
|
"XOR Checksum",
|
||||||
|
"Parity Bit"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@ -45,6 +45,11 @@ export function search(input, searchRegex, removeRegex=null, sortBy=null, unique
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Email regular expression
|
||||||
|
*/
|
||||||
|
export const EMAIL_REGEX = /(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?\.)+[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\])/ig;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* URL regular expression
|
* URL regular expression
|
||||||
|
|||||||
50
src/core/lib/ParityBit.mjs
Normal file
50
src/core/lib/ParityBit.mjs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/**
|
||||||
|
* Parity Bit functions.
|
||||||
|
*
|
||||||
|
* @author j83305 [awz22@protonmail.com]
|
||||||
|
* @copyright Crown Copyright 2020
|
||||||
|
* @license Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
import OperationError from "../errors/OperationError.mjs";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to take the user input and encode using the given arguments
|
||||||
|
* @param input string of binary
|
||||||
|
* @param args array
|
||||||
|
*/
|
||||||
|
export function calculateParityBit(input, args) {
|
||||||
|
let count1s = 0;
|
||||||
|
for (let i = 0; i < input.length; i++) {
|
||||||
|
const character = input.charAt(i);
|
||||||
|
if (character === "1") {
|
||||||
|
count1s++;
|
||||||
|
} else if (character !== args[3] && character !== "0" && character !== " ") {
|
||||||
|
throw new OperationError("unexpected character encountered: \"" + character + "\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let parityBit = "1";
|
||||||
|
const flipflop = args[0] === "Even Parity" ? 0 : 1;
|
||||||
|
if (count1s % 2 === flipflop) {
|
||||||
|
parityBit = "0";
|
||||||
|
}
|
||||||
|
if (args[1] === "End") {
|
||||||
|
return input + parityBit;
|
||||||
|
} else {
|
||||||
|
return parityBit + input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* just removes the parity bit to return the original data
|
||||||
|
* @param input string of binary, encoded
|
||||||
|
* @param args array
|
||||||
|
*/
|
||||||
|
export function decodeParityBit(input, args) {
|
||||||
|
if (args[1] === "End") {
|
||||||
|
return input.slice(0, -1);
|
||||||
|
} else {
|
||||||
|
return input.slice(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* @author n1474335 [n1474335@gmail.com]
|
* @author n1474335 [n1474335@gmail.com]
|
||||||
|
* @author ko80240 [csk.dev@proton.me]
|
||||||
* @copyright Crown Copyright 2023
|
* @copyright Crown Copyright 2023
|
||||||
* @license Apache-2.0
|
* @license Apache-2.0
|
||||||
*/
|
*/
|
||||||
@ -8,6 +9,7 @@ import * as uuid from "uuid";
|
|||||||
|
|
||||||
import Operation from "../Operation.mjs";
|
import Operation from "../Operation.mjs";
|
||||||
import OperationError from "../errors/OperationError.mjs";
|
import OperationError from "../errors/OperationError.mjs";
|
||||||
|
import { toHex } from "../lib/Hex.mjs";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Analyse UUID operation
|
* Analyse UUID operation
|
||||||
@ -22,27 +24,128 @@ class AnalyseUUID extends Operation {
|
|||||||
|
|
||||||
this.name = "Analyse UUID";
|
this.name = "Analyse UUID";
|
||||||
this.module = "Crypto";
|
this.module = "Crypto";
|
||||||
this.description = "Tries to determine information about a given UUID and suggests which version may have been used to generate it";
|
this.description = "Operation for extracting metadata and detecting the version of a given UUID.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Universally_unique_identifier";
|
this.infoURL = "https://wikipedia.org/wiki/Universally_unique_identifier";
|
||||||
this.inputType = "string";
|
this.inputType = "string";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [];
|
this.args = [
|
||||||
|
{
|
||||||
|
name: "Include Metadata",
|
||||||
|
type: "boolean",
|
||||||
|
value: true
|
||||||
|
}
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} input
|
* @param {string} input - Expects a valid UUID string
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = input.trim();
|
||||||
|
|
||||||
|
let uuidVersion, uuidBytes;
|
||||||
try {
|
try {
|
||||||
const uuidVersion = uuid.version(input);
|
uuidVersion = uuid.version(input); // Re-using the uuid library to extract version
|
||||||
return "UUID version: " + uuidVersion;
|
uuidBytes = uuid.parse(input); // Re-using the uuid library to parse bytes
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new OperationError("Invalid UUID");
|
throw new OperationError("Invalid UUID");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
const [includeMetadata] = args;
|
||||||
|
const dv = new DataView(uuidBytes.buffer, uuidBytes.byteOffset, uuidBytes.byteLength); // Dataview helps handle the multi-byte ints
|
||||||
|
const uuidInteger = (dv.getBigUint64(0) << 64n) | dv.getBigUint64(8);
|
||||||
|
|
||||||
|
const sections = [`Version:\n${uuidVersion}`];
|
||||||
|
|
||||||
|
if (includeMetadata) {
|
||||||
|
const parser = UUID_PARSERS[uuidVersion];
|
||||||
|
const decoded = parser?.(uuidBytes, dv);
|
||||||
|
sections.push(formatDecoded(decoded));
|
||||||
|
}
|
||||||
|
|
||||||
|
sections.push(`UUID Integer:\n${uuidInteger}`);
|
||||||
|
|
||||||
|
return sections.filter(Boolean).join("\n\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default AnalyseUUID;
|
export default AnalyseUUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Metadata can be extracted for versions 1, 6, and 7.
|
||||||
|
* Enum-like frozen mapping of UUID version to parser function.
|
||||||
|
*/
|
||||||
|
const UUID_PARSERS = Object.freeze({
|
||||||
|
1: parsev1v6,
|
||||||
|
6: parsev1v6,
|
||||||
|
7: parsev7,
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Versions 1 and 6. Note 6 is a re-order of 1.
|
||||||
|
* Version 1 == layout: timeLow(32) | timeMid(16) | timeHi(12)
|
||||||
|
* Version 6 == layout: timeHi(32) | timeMid(16) | timeLow(12)
|
||||||
|
*/
|
||||||
|
function parsev1v6(uuidBytes, dv) {
|
||||||
|
const isV1 = (uuidBytes[6] >> 4) === 1;
|
||||||
|
|
||||||
|
const timeStamp =
|
||||||
|
isV1 ? (
|
||||||
|
(BigInt(dv.getUint16(6) & 0x0fff) << 48n) | // mask off version bits
|
||||||
|
(BigInt(dv.getUint16(4)) << 32n) |
|
||||||
|
BigInt(dv.getUint32(0))
|
||||||
|
) : (
|
||||||
|
(BigInt(dv.getUint32(0)) << 28n) |
|
||||||
|
(BigInt(dv.getUint16(4)) << 12n) |
|
||||||
|
(BigInt(dv.getUint16(6) & 0x0fff))
|
||||||
|
);
|
||||||
|
|
||||||
|
// Convert to Unix time
|
||||||
|
const milliseconds =
|
||||||
|
Number(
|
||||||
|
(timeStamp - 122192928000000000n) / 10000n
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
timestamp: milliseconds,
|
||||||
|
isoTimestamp: new Date(milliseconds).toISOString(),
|
||||||
|
clock: ((uuidBytes[8] & 0x3f) << 8) | uuidBytes[9],
|
||||||
|
node: toHex(uuidBytes.slice(10), ":").toUpperCase()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Version 7 */
|
||||||
|
function parsev7(uuidBytes, dv) {
|
||||||
|
const milliseconds = Number((BigInt(dv.getUint32(0)) << 16n) | BigInt(dv.getUint16(4)));
|
||||||
|
|
||||||
|
return {
|
||||||
|
timestamp: milliseconds,
|
||||||
|
isoTimestamp: new Date(milliseconds).toISOString(),
|
||||||
|
randA: ((uuidBytes[6] & 0x0f) << 8) | uuidBytes[7],
|
||||||
|
randB: toHex(uuidBytes.slice(8), "").toUpperCase()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats metadata
|
||||||
|
*
|
||||||
|
* @param {Object|undefined} decoded
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
function formatDecoded(decoded) {
|
||||||
|
if (!decoded) return "No metadata available. Only versions 1, 6, 7 are supported.";
|
||||||
|
|
||||||
|
return Object.entries({
|
||||||
|
"Timestamp": decoded.timestamp,
|
||||||
|
"Timestamp (ISO)": decoded.isoTimestamp,
|
||||||
|
"Node": decoded.node,
|
||||||
|
"Clock": decoded.clock,
|
||||||
|
"Rand A": decoded.randA,
|
||||||
|
"Rand B": decoded.randB
|
||||||
|
})
|
||||||
|
.filter(([, value]) => value !== undefined)
|
||||||
|
.map(([label, value]) => `${label}:\n${value}`)
|
||||||
|
.join("\n\n");
|
||||||
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import Operation from "../Operation.mjs";
|
import Operation from "../Operation.mjs";
|
||||||
import { search } from "../lib/Extract.mjs";
|
import { EMAIL_REGEX, search } from "../lib/Extract.mjs";
|
||||||
import { caseInsensitiveSort } from "../lib/Sort.mjs";
|
import { caseInsensitiveSort } from "../lib/Sort.mjs";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -50,8 +50,7 @@ class ExtractEmailAddresses extends Operation {
|
|||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
const [displayTotal, sort, unique] = args,
|
const [displayTotal, sort, unique] = args,
|
||||||
// email regex from: https://www.regextester.com/98066
|
regex = EMAIL_REGEX;
|
||||||
regex = /(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?\.)+[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\])/ig;
|
|
||||||
|
|
||||||
const results = search(
|
const results = search(
|
||||||
input,
|
input,
|
||||||
|
|||||||
128
src/core/operations/ParityBit.mjs
Normal file
128
src/core/operations/ParityBit.mjs
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
/**
|
||||||
|
* @author j83305 [awz22@protonmail.com]
|
||||||
|
* @copyright Crown Copyright 2020
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Operation from "../Operation.mjs";
|
||||||
|
import { calculateParityBit, decodeParityBit } from "../lib/ParityBit.mjs";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parity Bit operation
|
||||||
|
*/
|
||||||
|
class ParityBit extends Operation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ParityBit constructor
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.name = "Parity Bit";
|
||||||
|
this.module = "Default";
|
||||||
|
this.description = "A parity bit, or check bit, is the simplest form of error detection. It is a bit which is added to a string of bits and represents if the number of 1's in the binary string is an even number or odd number.<br><br>If a delimiter is specified, the parity bit calculation will be performed on each 'block' of the input data, where the blocks are created by slicing the input at each occurence of the delimiter character";
|
||||||
|
this.infoURL = "https://wikipedia.org/wiki/Parity_bit";
|
||||||
|
this.inputType = "string";
|
||||||
|
this.outputType = "string";
|
||||||
|
this.args = [
|
||||||
|
{
|
||||||
|
name: "Mode",
|
||||||
|
type: "option",
|
||||||
|
value: [
|
||||||
|
"Even Parity",
|
||||||
|
"Odd Parity"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Postion",
|
||||||
|
type: "option",
|
||||||
|
value: [
|
||||||
|
"Start",
|
||||||
|
"End"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Encode or Decode",
|
||||||
|
type: "option",
|
||||||
|
value: [
|
||||||
|
"Encode",
|
||||||
|
"Decode"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Delimiter",
|
||||||
|
type: "shortString",
|
||||||
|
value: ""
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} input
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
run(input, args) {
|
||||||
|
if (input.length === 0) {
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* determines weather to use the encode or decode method based off args[2]
|
||||||
|
* @param input input to be encoded or decoded
|
||||||
|
* @param args array
|
||||||
|
*/
|
||||||
|
const method = (input, args) => args[2] === "Encode" ? calculateParityBit(input, args) : decodeParityBit(input, args);
|
||||||
|
if (args[3].length > 0) {
|
||||||
|
const byteStrings = input.split(args[3]);
|
||||||
|
for (let byteStringsArrayIndex = 0; byteStringsArrayIndex < byteStrings.length; byteStringsArrayIndex++) {
|
||||||
|
byteStrings[byteStringsArrayIndex] = method(byteStrings[byteStringsArrayIndex], args);
|
||||||
|
}
|
||||||
|
return byteStrings.join(args[3]);
|
||||||
|
}
|
||||||
|
return method(input, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Highlight Parity Bit
|
||||||
|
*
|
||||||
|
* @param {Object[]} pos
|
||||||
|
* @param {number} pos[].start
|
||||||
|
* @param {number} pos[].end
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {Object[]} pos
|
||||||
|
*/
|
||||||
|
highlight(pos, args) {
|
||||||
|
if (args[3].length === 0) {
|
||||||
|
if (args[1] === "Prepend") {
|
||||||
|
pos[0].start += 1;
|
||||||
|
pos[0].end += 1;
|
||||||
|
}
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
// need to be able to read input to do the highlighting when there is a delimiter
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Highlight Parity Bit in reverse
|
||||||
|
*
|
||||||
|
* @param {Object[]} pos
|
||||||
|
* @param {number} pos[].start
|
||||||
|
* @param {number} pos[].end
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {Object[]} pos
|
||||||
|
*/
|
||||||
|
highlightReverse(pos, args) {
|
||||||
|
if (args[3].length === 0) {
|
||||||
|
if (args[1] === "Prepend") {
|
||||||
|
if (pos[0].start > 0) {
|
||||||
|
pos[0].start -= 1;
|
||||||
|
}
|
||||||
|
pos[0].end -= 1;
|
||||||
|
}
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ParityBit;
|
||||||
@ -7,6 +7,7 @@
|
|||||||
import XRegExp from "xregexp";
|
import XRegExp from "xregexp";
|
||||||
import Operation from "../Operation.mjs";
|
import Operation from "../Operation.mjs";
|
||||||
import Utils from "../Utils.mjs";
|
import Utils from "../Utils.mjs";
|
||||||
|
import { EMAIL_REGEX } from "../lib/Extract.mjs";
|
||||||
import OperationError from "../errors/OperationError.mjs";
|
import OperationError from "../errors/OperationError.mjs";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -45,7 +46,7 @@ class RegularExpression extends Operation {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Email address",
|
name: "Email address",
|
||||||
value: "(?:[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9](?:[\\u00A0-\\uD7FF\\uE000-\\uFFFF-a-z0-9-]*[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9])?\\.)+[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9](?:[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9-]*[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}\\])"
|
value: EMAIL_REGEX.source // We use a different regex library, so just take the source regex string here
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "URL",
|
name: "URL",
|
||||||
|
|||||||
@ -35,6 +35,11 @@ class RenderMarkdown extends Operation {
|
|||||||
name: "Enable syntax highlighting",
|
name: "Enable syntax highlighting",
|
||||||
type: "boolean",
|
type: "boolean",
|
||||||
value: true
|
value: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Open links in new tab.",
|
||||||
|
type: "boolean",
|
||||||
|
value: false
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -45,7 +50,7 @@ class RenderMarkdown extends Operation {
|
|||||||
* @returns {html}
|
* @returns {html}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
const [convertLinks, enableHighlighting] = args,
|
const [convertLinks, enableHighlighting, openLinksBlank] = args,
|
||||||
md = new MarkdownIt({
|
md = new MarkdownIt({
|
||||||
linkify: convertLinks,
|
linkify: convertLinks,
|
||||||
html: false, // Explicitly disable HTML rendering
|
html: false, // Explicitly disable HTML rendering
|
||||||
@ -58,12 +63,38 @@ class RenderMarkdown extends Operation {
|
|||||||
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}),
|
});
|
||||||
rendered = md.render(input);
|
if (openLinksBlank) {
|
||||||
|
this.makeLinksOpenInNewTab(md);
|
||||||
|
}
|
||||||
|
const rendered = md.render(input);
|
||||||
return `<div style="font-family: var(--primary-font-family)">${rendered}</div>`;
|
return `<div style="font-family: var(--primary-font-family)">${rendered}</div>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds target="_blank" to links.
|
||||||
|
* @param {MarkdownIt} md
|
||||||
|
*/
|
||||||
|
makeLinksOpenInNewTab(md) {
|
||||||
|
// Adapted from: https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#renderer
|
||||||
|
// Remember old renderer, if overridden, or proxy to default renderer
|
||||||
|
const defaultRender = md.renderer.rules.link_open || function(tokens, idx, options, env, self) {
|
||||||
|
return self.renderToken(tokens, idx, options);
|
||||||
|
};
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
|
md.renderer.rules.link_open = function (tokens, idx, options, env, self) {
|
||||||
|
const token = tokens[idx];
|
||||||
|
if (token.attrIndex("target") >= 0) {
|
||||||
|
// Target attribute already set, do not replace.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
token.attrPush(["target", "_blank"]); // add new attribute
|
||||||
|
|
||||||
|
// pass token to default renderer.
|
||||||
|
return defaultRender(tokens, idx, options, env, self);
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default RenderMarkdown;
|
export default RenderMarkdown;
|
||||||
|
|||||||
@ -43,17 +43,23 @@ class HTMLOperation {
|
|||||||
/**
|
/**
|
||||||
* Renders the operation in HTML as a stub operation with no ingredients.
|
* Renders the operation in HTML as a stub operation with no ingredients.
|
||||||
*
|
*
|
||||||
|
* @param {boolean} removeIcon - show icon for removing operation
|
||||||
|
* @param {string} elementId - element ID for aria usage
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
toStubHtml(removeIcon) {
|
toStubHtml(removeIcon = false, elementId = null) {
|
||||||
let html = "<li class='operation'";
|
let html = "<li class='operation'";
|
||||||
|
|
||||||
|
if (elementId) {
|
||||||
|
html += ` id='${elementId}'`;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.description) {
|
if (this.description) {
|
||||||
const infoLink = this.infoURL ? `<hr>${titleFromWikiLink(this.infoURL)}` : "";
|
const infoLink = this.infoURL ? `<hr>${titleFromWikiLink(this.infoURL)}` : "";
|
||||||
|
|
||||||
html += ` data-container='body' data-toggle='popover' data-placement='right'
|
html += ` data-container='body' data-toggle='popover' data-placement='right'
|
||||||
data-content="${this.description}${infoLink}" data-html='true' data-trigger='hover'
|
data-content="${this.description}${infoLink}" data-html='true' data-trigger='hover'
|
||||||
data-boundary='viewport'`;
|
data-boundary='viewport' role='button'`;
|
||||||
}
|
}
|
||||||
|
|
||||||
html += ">" + this.name;
|
html += ">" + this.name;
|
||||||
|
|||||||
@ -173,7 +173,7 @@
|
|||||||
Operations
|
Operations
|
||||||
<span class="op-count"></span>
|
<span class="op-count"></span>
|
||||||
</div>
|
</div>
|
||||||
<input id="search" type="search" class="form-control" placeholder="Search..." autocomplete="off" tabindex="0" data-help-title="Searching for operations" data-help="<p>Use the search box to find useful operations.</p><p>Both operation names and descriptions are queried using a fuzzy matching algorithm.</p>">
|
<input id="search" type="search" class="form-control" placeholder="Search..." autocomplete="off" tabindex="0" data-help-title="Searching for operations" data-help="<p>Use the search box to find useful operations.</p><p>Both operation names and descriptions are queried using a fuzzy matching algorithm.</p>" aria-owns="search-results">
|
||||||
<ul id="search-results" class="op-list"></ul>
|
<ul id="search-results" class="op-list"></ul>
|
||||||
<div id="categories" class="panel-group no-select"></div>
|
<div id="categories" class="panel-group no-select"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -28,17 +28,16 @@ class OperationsWaiter {
|
|||||||
this.removeIntent = false;
|
this.removeIntent = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for search events.
|
* Handler for search events.
|
||||||
* Finds operations which match the given search term and displays them under the search box.
|
* Finds operations which match the given search term and displays them under the search box.
|
||||||
*
|
*
|
||||||
* @param {event} e
|
* @param {KeyboardEvent | ClipboardEvent | Event} e
|
||||||
*/
|
*/
|
||||||
searchOperations(e) {
|
searchOperations(e) {
|
||||||
let ops, selected;
|
let ops, selected;
|
||||||
|
|
||||||
if (e.type === "search" || e.keyCode === 13) { // Search or Return
|
if ((e.type === "search" && e.target.value !== "") || e.keyCode === 13) { // Search (non-empty) or Return
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
ops = document.querySelectorAll("#search-results li");
|
ops = document.querySelectorAll("#search-results li");
|
||||||
if (ops.length) {
|
if (ops.length) {
|
||||||
@ -49,27 +48,43 @@ class OperationsWaiter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up the operation element with the correct attributes when selected
|
||||||
|
* @param {HTMLElement} element
|
||||||
|
*/
|
||||||
|
const _selectOperation = (element) => {
|
||||||
|
element.classList.add("selected-op");
|
||||||
|
element.scrollIntoView({block: "nearest"});
|
||||||
|
$(element).popover("show");
|
||||||
|
e.target.setAttribute("aria-activedescendant", element.id);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up the operation element with the correct attributes when deselected
|
||||||
|
* @param {HTMLElement} element
|
||||||
|
*/
|
||||||
|
const _deselectOperation = (element) => {
|
||||||
|
element.classList.remove("selected-op");
|
||||||
|
$(element).popover("hide");
|
||||||
|
};
|
||||||
|
|
||||||
if (e.keyCode === 40) { // Down
|
if (e.keyCode === 40) { // Down
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
ops = document.querySelectorAll("#search-results li");
|
ops = document.querySelectorAll("#search-results li");
|
||||||
if (ops.length) {
|
if (ops.length) {
|
||||||
selected = this.getSelectedOp(ops);
|
selected = this.getSelectedOp(ops);
|
||||||
if (selected > -1) {
|
if (selected > -1) _deselectOperation(ops[selected]);
|
||||||
ops[selected].classList.remove("selected-op");
|
|
||||||
}
|
|
||||||
if (selected === ops.length-1) selected = -1;
|
if (selected === ops.length-1) selected = -1;
|
||||||
ops[selected+1].classList.add("selected-op");
|
_selectOperation(ops[selected+1]);
|
||||||
}
|
}
|
||||||
} else if (e.keyCode === 38) { // Up
|
} else if (e.keyCode === 38) { // Up
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
ops = document.querySelectorAll("#search-results li");
|
ops = document.querySelectorAll("#search-results li");
|
||||||
if (ops.length) {
|
if (ops.length) {
|
||||||
selected = this.getSelectedOp(ops);
|
selected = this.getSelectedOp(ops);
|
||||||
if (selected > -1) {
|
if (selected > -1) _deselectOperation(ops[selected]);
|
||||||
ops[selected].classList.remove("selected-op");
|
|
||||||
}
|
|
||||||
if (selected === 0) selected = ops.length;
|
if (selected === 0) selected = ops.length;
|
||||||
ops[selected-1].classList.add("selected-op");
|
_selectOperation(ops[selected-1]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const searchResultsEl = document.getElementById("search-results");
|
const searchResultsEl = document.getElementById("search-results");
|
||||||
@ -83,11 +98,13 @@ class OperationsWaiter {
|
|||||||
searchResultsEl.removeChild(searchResultsEl.firstChild);
|
searchResultsEl.removeChild(searchResultsEl.firstChild);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
document.querySelector("#search").removeAttribute("aria-activedescendant");
|
||||||
|
|
||||||
$("#categories .show").collapse("hide");
|
$("#categories .show").collapse("hide");
|
||||||
if (str) {
|
if (str) {
|
||||||
const matchedOps = this.filterOperations(str, true);
|
const matchedOps = this.filterOperations(str, true);
|
||||||
const matchedOpsHtml = matchedOps
|
const matchedOpsHtml = matchedOps
|
||||||
.map(v => v.toStubHtml())
|
.map((operation, idx) => operation.toStubHtml(false, `search-result-${idx}`))
|
||||||
.join("");
|
.join("");
|
||||||
|
|
||||||
searchResultsEl.innerHTML = matchedOpsHtml;
|
searchResultsEl.innerHTML = matchedOpsHtml;
|
||||||
@ -103,7 +120,7 @@ class OperationsWaiter {
|
|||||||
* @param {string} searchStr
|
* @param {string} searchStr
|
||||||
* @param {boolean} highlight - Whether or not to highlight the matching string in the operation
|
* @param {boolean} highlight - Whether or not to highlight the matching string in the operation
|
||||||
* name and description
|
* name and description
|
||||||
* @returns {string[]}
|
* @returns {HTMLOperation[]}
|
||||||
*/
|
*/
|
||||||
filterOperations(inStr, highlight) {
|
filterOperations(inStr, highlight) {
|
||||||
const matchedOps = [];
|
const matchedOps = [];
|
||||||
|
|||||||
@ -589,8 +589,7 @@ Password: 282760`;
|
|||||||
...[1, 3, 4, 5, 6, 7].map(version => it(`Analyze UUID v${version}`, () => {
|
...[1, 3, 4, 5, 6, 7].map(version => it(`Analyze UUID v${version}`, () => {
|
||||||
const uuid = chef.generateUUID("", { "version": `v${version}` }).toString();
|
const uuid = chef.generateUUID("", { "version": `v${version}` }).toString();
|
||||||
const result = chef.analyseUUID(uuid).toString();
|
const result = chef.analyseUUID(uuid).toString();
|
||||||
const expected = `UUID version: ${version}`;
|
assert.ok(result.startsWith(`Version:\n${version}\n`), `Expected output to start with "Version:\\n${version}\\n", got: ${result}`);
|
||||||
assert.strictEqual(result, expected);
|
|
||||||
})),
|
})),
|
||||||
|
|
||||||
it("Generate UUID using defaults", () => {
|
it("Generate UUID using defaults", () => {
|
||||||
@ -598,7 +597,7 @@ Password: 282760`;
|
|||||||
assert.ok(uuid);
|
assert.ok(uuid);
|
||||||
|
|
||||||
const analysis = chef.analyseUUID(uuid).toString();
|
const analysis = chef.analyseUUID(uuid).toString();
|
||||||
assert.strictEqual(analysis, "UUID version: 4");
|
assert.ok(analysis.startsWith("Version:\n4\n"), `Expected output to start with "Version:\\n4\\n", got: ${analysis}`);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
it("Gzip, Gunzip", () => {
|
it("Gzip, Gunzip", () => {
|
||||||
|
|||||||
@ -16,6 +16,7 @@ import { setLongTestFailure, logTestReport } from "../lib/utils.mjs";
|
|||||||
import TestRegister from "../lib/TestRegister.mjs";
|
import TestRegister from "../lib/TestRegister.mjs";
|
||||||
import "./tests/A1Z26CipherDecode.mjs";
|
import "./tests/A1Z26CipherDecode.mjs";
|
||||||
import "./tests/AESKeyWrap.mjs";
|
import "./tests/AESKeyWrap.mjs";
|
||||||
|
import "./tests/AnalyseUUID.mjs";
|
||||||
import "./tests/AlternatingCaps.mjs";
|
import "./tests/AlternatingCaps.mjs";
|
||||||
import "./tests/AvroToJSON.mjs";
|
import "./tests/AvroToJSON.mjs";
|
||||||
import "./tests/BaconCipher.mjs";
|
import "./tests/BaconCipher.mjs";
|
||||||
@ -71,6 +72,7 @@ import "./tests/ExtractAudioMetadata.mjs";
|
|||||||
import "./tests/ExtractEmailAddresses.mjs";
|
import "./tests/ExtractEmailAddresses.mjs";
|
||||||
import "./tests/ExtractHashes.mjs";
|
import "./tests/ExtractHashes.mjs";
|
||||||
import "./tests/ExtractIPAddresses.mjs";
|
import "./tests/ExtractIPAddresses.mjs";
|
||||||
|
import "./tests/Fernet.mjs";
|
||||||
import "./tests/Float.mjs";
|
import "./tests/Float.mjs";
|
||||||
import "./tests/FileTree.mjs";
|
import "./tests/FileTree.mjs";
|
||||||
import "./tests/FletcherChecksum.mjs";
|
import "./tests/FletcherChecksum.mjs";
|
||||||
@ -134,6 +136,7 @@ import "./tests/ParseUDP.mjs";
|
|||||||
import "./tests/PEMtoHex.mjs";
|
import "./tests/PEMtoHex.mjs";
|
||||||
import "./tests/PGP.mjs";
|
import "./tests/PGP.mjs";
|
||||||
import "./tests/PHP.mjs";
|
import "./tests/PHP.mjs";
|
||||||
|
import "./tests/ParityBit.mjs";
|
||||||
import "./tests/PHPSerialize.mjs";
|
import "./tests/PHPSerialize.mjs";
|
||||||
import "./tests/PowerSet.mjs";
|
import "./tests/PowerSet.mjs";
|
||||||
import "./tests/Protobuf.mjs";
|
import "./tests/Protobuf.mjs";
|
||||||
@ -143,6 +146,8 @@ import "./tests/Rabbit.mjs";
|
|||||||
import "./tests/RAKE.mjs";
|
import "./tests/RAKE.mjs";
|
||||||
import "./tests/Regex.mjs";
|
import "./tests/Regex.mjs";
|
||||||
import "./tests/Register.mjs";
|
import "./tests/Register.mjs";
|
||||||
|
import "./tests/RegularExpression.mjs";
|
||||||
|
import "./tests/RenderMarkdown.mjs";
|
||||||
import "./tests/RisonEncodeDecode.mjs";
|
import "./tests/RisonEncodeDecode.mjs";
|
||||||
import "./tests/Rotate.mjs";
|
import "./tests/Rotate.mjs";
|
||||||
import "./tests/RSA.mjs";
|
import "./tests/RSA.mjs";
|
||||||
|
|||||||
66
tests/operations/tests/AnalyseUUID.mjs
Normal file
66
tests/operations/tests/AnalyseUUID.mjs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/**
|
||||||
|
* Analyse UUID tests
|
||||||
|
*
|
||||||
|
* @author ko80240 [csk.dev@proton.me]
|
||||||
|
* @copyright Crown Copyright 2023
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
import TestRegister from "../../lib/TestRegister.mjs";
|
||||||
|
|
||||||
|
TestRegister.addTests([
|
||||||
|
{
|
||||||
|
"name": "Analyse UUID: v1 UUID extracts timestamp, clock, and node",
|
||||||
|
"input": "cefa1760-28ee-11f1-9f95-1fb76af3e239",
|
||||||
|
"expectedOutput": "Version:\n1\n\nTimestamp:\n1774514156502\n\nTimestamp (ISO):\n2026-03-26T08:35:56.502Z\n\nNode:\n1F:B7:6A:F3:E2:39\n\nClock:\n8085\n\nUUID Integer:\n275119515460318071558429785403790975545",
|
||||||
|
"recipeConfig": [
|
||||||
|
{
|
||||||
|
"op": "Analyse UUID",
|
||||||
|
"args": [true]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Analyse UUID: v7 UUID extracts timestamp, randA, and randB",
|
||||||
|
"input": "019d294a-af64-7728-9524-26da08f50708",
|
||||||
|
"expectedOutput": "Version:\n7\n\nTimestamp:\n1774514253668\n\nTimestamp (ISO):\n2026-03-26T08:37:33.668Z\n\nRand A:\n1832\n\nRand B:\n952426DA08F50708\n\nUUID Integer:\n2145256098533991595556290452700595976",
|
||||||
|
"recipeConfig": [
|
||||||
|
{
|
||||||
|
"op": "Analyse UUID",
|
||||||
|
"args": [true]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Analyse UUID: v4 UUID should show no metadata - not possible",
|
||||||
|
"input": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
|
||||||
|
"expectedOutput": "Version:\n4\n\nNo metadata available. Only versions 1, 6, 7 are supported.\n\nUUID Integer:\n324969006592305634633390616021200786553",
|
||||||
|
"recipeConfig": [
|
||||||
|
{
|
||||||
|
"op": "Analyse UUID",
|
||||||
|
"args": [true]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Analyse UUID: if the 'Include Metadata' option is false it should return not metadata",
|
||||||
|
"input": "cefa1760-28ee-11f1-9f95-1fb76af3e239",
|
||||||
|
"expectedOutput": "Version:\n1\n\nUUID Integer:\n275119515460318071558429785403790975545",
|
||||||
|
"recipeConfig": [
|
||||||
|
{
|
||||||
|
"op": "Analyse UUID",
|
||||||
|
"args": [false]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Analyse UUID: invalid UUID should return error message",
|
||||||
|
"input": "not-a-uuid",
|
||||||
|
"expectedOutput": "Invalid UUID",
|
||||||
|
"recipeConfig": [
|
||||||
|
{
|
||||||
|
"op": "Analyse UUID",
|
||||||
|
"args": [true]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]);
|
||||||
@ -11,44 +11,70 @@ TestRegister.addTests([
|
|||||||
{
|
{
|
||||||
name: "Extract email address",
|
name: "Extract email address",
|
||||||
input: "email@example.com\nfirstname.lastname@example.com\nemail@subdomain.example.com\nfirstname+lastname@example.com\n1234567890@example.com\nemail@example-one.com\n_______@example.com email@example.name\nemail@example.museum email@example.co.jp firstname-lastname@example.com",
|
input: "email@example.com\nfirstname.lastname@example.com\nemail@subdomain.example.com\nfirstname+lastname@example.com\n1234567890@example.com\nemail@example-one.com\n_______@example.com email@example.name\nemail@example.museum email@example.co.jp firstname-lastname@example.com",
|
||||||
expectedOutput: "email@example.com\nfirstname.lastname@example.com\nemail@subdomain.example.com\nfirstname+lastname@example.com\n1234567890@example.com\nemail@example-one.com\n_______@example.com\nemail@example.name\nemail@example.museum\nemail@example.co.jp\nfirstname-lastname@example.com",
|
expectedOutput:
|
||||||
|
"email@example.com\nfirstname.lastname@example.com\nemail@subdomain.example.com\nfirstname+lastname@example.com\n1234567890@example.com\nemail@example-one.com\n_______@example.com\nemail@example.name\nemail@example.museum\nemail@example.co.jp\nfirstname-lastname@example.com",
|
||||||
recipeConfig: [
|
recipeConfig: [
|
||||||
{
|
{
|
||||||
"op": "Extract email addresses",
|
op: "Extract email addresses",
|
||||||
"args": [false]
|
args: [false],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Extract email address - Display total",
|
name: "Extract email address - Display total",
|
||||||
input: "email@example.com\nfirstname.lastname@example.com\nemail@subdomain.example.com\nfirstname+lastname@example.com\n1234567890@example.com\nemail@example-one.com\n_______@example.com email@example.name\nemail@example.museum email@example.co.jp firstname-lastname@example.com",
|
input: "email@example.com\nfirstname.lastname@example.com\nemail@subdomain.example.com\nfirstname+lastname@example.com\n1234567890@example.com\nemail@example-one.com\n_______@example.com email@example.name\nemail@example.museum email@example.co.jp firstname-lastname@example.com",
|
||||||
expectedOutput: "Total found: 11\n\nemail@example.com\nfirstname.lastname@example.com\nemail@subdomain.example.com\nfirstname+lastname@example.com\n1234567890@example.com\nemail@example-one.com\n_______@example.com\nemail@example.name\nemail@example.museum\nemail@example.co.jp\nfirstname-lastname@example.com",
|
expectedOutput:
|
||||||
|
"Total found: 11\n\nemail@example.com\nfirstname.lastname@example.com\nemail@subdomain.example.com\nfirstname+lastname@example.com\n1234567890@example.com\nemail@example-one.com\n_______@example.com\nemail@example.name\nemail@example.museum\nemail@example.co.jp\nfirstname-lastname@example.com",
|
||||||
recipeConfig: [
|
recipeConfig: [
|
||||||
{
|
{
|
||||||
"op": "Extract email addresses",
|
op: "Extract email addresses",
|
||||||
"args": [true]
|
args: [true],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Extract email address (Internationalized)",
|
name: "Extract email address (Internationalized)",
|
||||||
input: "\u4f0a\u662d\u5091@\u90f5\u4ef6.\u5546\u52d9 \u093e\u092e@\u092e\u094b\u0939\u0928.\u0908\u0928\u094d\u092b\u094b\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c \u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc Jos\u1ec5Silv\u1ec5@googl\u1ec5.com\nJos\u1ec5Silv\u1ec5@google.com and Jos\u1ec5Silva@google.com\nFoO@BaR.CoM, john@192.168.10.100\ng\xf3mez@junk.br and Abc.123@example.com.\nuser+mailbox/department=shipping@example.com\n\u7528\u6237@\u4f8b\u5b50.\u5e7f\u544a\n\u0909\u092a\u092f\u094b\u0917\u0915\u0930\u094d\u0924\u093e@\u0909\u0926\u093e\u0939\u0930\u0923.\u0915\u0949\u092e\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nD\xf6rte@S\xf6rensen.example.com\n\u0430\u0434\u0436\u0430\u0439@\u044d\u043a\u0437\u0430\u043c\u043f\u043b.\u0440\u0443\u0441\ntest@xn--bcher-kva.com",
|
input: "\u4f0a\u662d\u5091@\u90f5\u4ef6.\u5546\u52d9 \u093e\u092e@\u092e\u094b\u0939\u0928.\u0908\u0928\u094d\u092b\u094b\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c \u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc Jos\u1ec5Silv\u1ec5@googl\u1ec5.com\nJos\u1ec5Silv\u1ec5@google.com and Jos\u1ec5Silva@google.com\nFoO@BaR.CoM, john@192.168.10.100\ng\xf3mez@junk.br and Abc.123@example.com.\nuser+mailbox/department=shipping@example.com\n\u7528\u6237@\u4f8b\u5b50.\u5e7f\u544a\n\u0909\u092a\u092f\u094b\u0917\u0915\u0930\u094d\u0924\u093e@\u0909\u0926\u093e\u0939\u0930\u0923.\u0915\u0949\u092e\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nD\xf6rte@S\xf6rensen.example.com\n\u0430\u0434\u0436\u0430\u0439@\u044d\u043a\u0437\u0430\u043c\u043f\u043b.\u0440\u0443\u0441\ntest@xn--bcher-kva.com",
|
||||||
expectedOutput: "\u4f0a\u662d\u5091@\u90f5\u4ef6.\u5546\u52d9\n\u093e\u092e@\u092e\u094b\u0939\u0928.\u0908\u0928\u094d\u092b\u094b\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nJos\u1ec5Silv\u1ec5@googl\u1ec5.com\nJos\u1ec5Silv\u1ec5@google.com\nJos\u1ec5Silva@google.com\nFoO@BaR.CoM\njohn@192.168.10.100\ng\xf3mez@junk.br\nAbc.123@example.com\nuser+mailbox/department=shipping@example.com\n\u7528\u6237@\u4f8b\u5b50.\u5e7f\u544a\n\u0909\u092a\u092f\u094b\u0917\u0915\u0930\u094d\u0924\u093e@\u0909\u0926\u093e\u0939\u0930\u0923.\u0915\u0949\u092e\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nD\xf6rte@S\xf6rensen.example.com\n\u0430\u0434\u0436\u0430\u0439@\u044d\u043a\u0437\u0430\u043c\u043f\u043b.\u0440\u0443\u0441\ntest@xn--bcher-kva.com",
|
expectedOutput:
|
||||||
|
"\u4f0a\u662d\u5091@\u90f5\u4ef6.\u5546\u52d9\n\u093e\u092e@\u092e\u094b\u0939\u0928.\u0908\u0928\u094d\u092b\u094b\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nJos\u1ec5Silv\u1ec5@googl\u1ec5.com\nJos\u1ec5Silv\u1ec5@google.com\nJos\u1ec5Silva@google.com\nFoO@BaR.CoM\njohn@192.168.10.100\ng\xf3mez@junk.br\nAbc.123@example.com\nuser+mailbox/department=shipping@example.com\n\u7528\u6237@\u4f8b\u5b50.\u5e7f\u544a\n\u0909\u092a\u092f\u094b\u0917\u0915\u0930\u094d\u0924\u093e@\u0909\u0926\u093e\u0939\u0930\u0923.\u0915\u0949\u092e\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nD\xf6rte@S\xf6rensen.example.com\n\u0430\u0434\u0436\u0430\u0439@\u044d\u043a\u0437\u0430\u043c\u043f\u043b.\u0440\u0443\u0441\ntest@xn--bcher-kva.com",
|
||||||
recipeConfig: [
|
recipeConfig: [
|
||||||
{
|
{
|
||||||
"op": "Extract email addresses",
|
op: "Extract email addresses",
|
||||||
"args": [false]
|
args: [false],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Extract email address - Display total (Internationalized)",
|
name: "Extract email address - Display total (Internationalized)",
|
||||||
input: "\u4f0a\u662d\u5091@\u90f5\u4ef6.\u5546\u52d9 \u093e\u092e@\u092e\u094b\u0939\u0928.\u0908\u0928\u094d\u092b\u094b\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c \u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc Jos\u1ec5Silv\u1ec5@googl\u1ec5.com\nJos\u1ec5Silv\u1ec5@google.com and Jos\u1ec5Silva@google.com\nFoO@BaR.CoM, john@192.168.10.100\ng\xf3mez@junk.br and Abc.123@example.com.\nuser+mailbox/department=shipping@example.com\n\u7528\u6237@\u4f8b\u5b50.\u5e7f\u544a\n\u0909\u092a\u092f\u094b\u0917\u0915\u0930\u094d\u0924\u093e@\u0909\u0926\u093e\u0939\u0930\u0923.\u0915\u0949\u092e\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nD\xf6rte@S\xf6rensen.example.com\n\u0430\u0434\u0436\u0430\u0439@\u044d\u043a\u0437\u0430\u043c\u043f\u043b.\u0440\u0443\u0441\ntest@xn--bcher-kva.com",
|
input: "\u4f0a\u662d\u5091@\u90f5\u4ef6.\u5546\u52d9 \u093e\u092e@\u092e\u094b\u0939\u0928.\u0908\u0928\u094d\u092b\u094b\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c \u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc Jos\u1ec5Silv\u1ec5@googl\u1ec5.com\nJos\u1ec5Silv\u1ec5@google.com and Jos\u1ec5Silva@google.com\nFoO@BaR.CoM, john@192.168.10.100\ng\xf3mez@junk.br and Abc.123@example.com.\nuser+mailbox/department=shipping@example.com\n\u7528\u6237@\u4f8b\u5b50.\u5e7f\u544a\n\u0909\u092a\u092f\u094b\u0917\u0915\u0930\u094d\u0924\u093e@\u0909\u0926\u093e\u0939\u0930\u0923.\u0915\u0949\u092e\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nD\xf6rte@S\xf6rensen.example.com\n\u0430\u0434\u0436\u0430\u0439@\u044d\u043a\u0437\u0430\u043c\u043f\u043b.\u0440\u0443\u0441\ntest@xn--bcher-kva.com",
|
||||||
expectedOutput: "Total found: 19\n\n\u4f0a\u662d\u5091@\u90f5\u4ef6.\u5546\u52d9\n\u093e\u092e@\u092e\u094b\u0939\u0928.\u0908\u0928\u094d\u092b\u094b\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nJos\u1ec5Silv\u1ec5@googl\u1ec5.com\nJos\u1ec5Silv\u1ec5@google.com\nJos\u1ec5Silva@google.com\nFoO@BaR.CoM\njohn@192.168.10.100\ng\xf3mez@junk.br\nAbc.123@example.com\nuser+mailbox/department=shipping@example.com\n\u7528\u6237@\u4f8b\u5b50.\u5e7f\u544a\n\u0909\u092a\u092f\u094b\u0917\u0915\u0930\u094d\u0924\u093e@\u0909\u0926\u093e\u0939\u0930\u0923.\u0915\u0949\u092e\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nD\xf6rte@S\xf6rensen.example.com\n\u0430\u0434\u0436\u0430\u0439@\u044d\u043a\u0437\u0430\u043c\u043f\u043b.\u0440\u0443\u0441\ntest@xn--bcher-kva.com",
|
expectedOutput:
|
||||||
|
"Total found: 19\n\n\u4f0a\u662d\u5091@\u90f5\u4ef6.\u5546\u52d9\n\u093e\u092e@\u092e\u094b\u0939\u0928.\u0908\u0928\u094d\u092b\u094b\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nJos\u1ec5Silv\u1ec5@googl\u1ec5.com\nJos\u1ec5Silv\u1ec5@google.com\nJos\u1ec5Silva@google.com\nFoO@BaR.CoM\njohn@192.168.10.100\ng\xf3mez@junk.br\nAbc.123@example.com\nuser+mailbox/department=shipping@example.com\n\u7528\u6237@\u4f8b\u5b50.\u5e7f\u544a\n\u0909\u092a\u092f\u094b\u0917\u0915\u0930\u094d\u0924\u093e@\u0909\u0926\u093e\u0939\u0930\u0923.\u0915\u0949\u092e\n\u044e\u0437\u0435\u0440@\u0435\u043a\u0437\u0430\u043c\u043f\u043b.\u043a\u043e\u043c\n\u03b8\u03c3\u03b5\u03c1@\u03b5\u03c7\u03b1\u03bc\u03c0\u03bb\u03b5.\u03c8\u03bf\u03bc\nD\xf6rte@S\xf6rensen.example.com\n\u0430\u0434\u0436\u0430\u0439@\u044d\u043a\u0437\u0430\u043c\u043f\u043b.\u0440\u0443\u0441\ntest@xn--bcher-kva.com",
|
||||||
recipeConfig: [
|
recipeConfig: [
|
||||||
{
|
{
|
||||||
"op": "Extract email addresses",
|
op: "Extract email addresses",
|
||||||
"args": [true]
|
args: [true],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Extract email address - IP address",
|
||||||
|
input: "yaunwfkb\nexample@[127.0.0.1]\n091nvka",
|
||||||
|
expectedOutput: "example@[127.0.0.1]",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Extract email addresses",
|
||||||
|
args: [false],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Extract email address - invalid IP address",
|
||||||
|
input: "yaunwfkb\nfalse_positive@[1.2.3.]\n091nvka",
|
||||||
|
expectedOutput: "",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Extract email addresses",
|
||||||
|
args: [false],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
* @copyright Karsten Silkenbäumer 2019
|
* @copyright Karsten Silkenbäumer 2019
|
||||||
* @license Apache-2.0
|
* @license Apache-2.0
|
||||||
*/
|
*/
|
||||||
import TestRegister from "../TestRegister";
|
import TestRegister from "../../lib/TestRegister.mjs";
|
||||||
|
|
||||||
TestRegister.addTests([
|
TestRegister.addTests([
|
||||||
{
|
{
|
||||||
@ -47,7 +47,7 @@ TestRegister.addTests([
|
|||||||
{
|
{
|
||||||
name: "Fernet Encrypt: no input",
|
name: "Fernet Encrypt: no input",
|
||||||
input: "",
|
input: "",
|
||||||
expectedMatch: /^gAAAAABce-[\w-]+={0,2}$/,
|
expectedMatch: /^gAAA[\w-]+={0,2}$/,
|
||||||
recipeConfig: [
|
recipeConfig: [
|
||||||
{
|
{
|
||||||
op: "Fernet Encrypt",
|
op: "Fernet Encrypt",
|
||||||
@ -69,12 +69,27 @@ TestRegister.addTests([
|
|||||||
{
|
{
|
||||||
name: "Fernet Encrypt: valid arguments",
|
name: "Fernet Encrypt: valid arguments",
|
||||||
input: "This is a secret message.\n",
|
input: "This is a secret message.\n",
|
||||||
expectedMatch: /^gAAAAABce-[\w-]+={0,2}$/,
|
expectedMatch: /^gAAA[\w-]+={0,2}$/,
|
||||||
recipeConfig: [
|
recipeConfig: [
|
||||||
{
|
{
|
||||||
op: "Fernet Encrypt",
|
op: "Fernet Encrypt",
|
||||||
args: ["MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="]
|
args: ["MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Fernet Encrypt/Decrypt: round trip",
|
||||||
|
input: "This is a secret message.\n",
|
||||||
|
expectedOutput: "This is a secret message.\n",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Fernet Encrypt",
|
||||||
|
args: ["MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "Fernet Decrypt",
|
||||||
|
args: ["MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="]
|
||||||
|
},
|
||||||
|
],
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|||||||
147
tests/operations/tests/ParityBit.mjs
Normal file
147
tests/operations/tests/ParityBit.mjs
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
/**
|
||||||
|
* Parity Bit tests
|
||||||
|
*
|
||||||
|
* @author j83305 [awz22@protonmail.com]
|
||||||
|
* @copyright Crown Copyright 2020
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
import TestRegister from "../../lib/TestRegister.mjs";
|
||||||
|
|
||||||
|
TestRegister.addTests([
|
||||||
|
{
|
||||||
|
name: "Parity bit encode in even parity, 1 block of binary of arbitrary length, prepend, even number of 1s",
|
||||||
|
input: "01010101 10101010",
|
||||||
|
expectedOutput: "001010101 10101010",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Parity Bit",
|
||||||
|
"args": [
|
||||||
|
"Even Parity",
|
||||||
|
"Start",
|
||||||
|
"Encode",
|
||||||
|
""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Parity bit encode in even parity, 1 block of binary of arbitrary length, prepend, odd number of 1s",
|
||||||
|
input: "01010101 10101011",
|
||||||
|
expectedOutput: "101010101 10101011",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Parity Bit",
|
||||||
|
"args": [
|
||||||
|
"Even Parity",
|
||||||
|
"Start",
|
||||||
|
"Encode",
|
||||||
|
""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Parity bit encode in even parity, 1 block of binary of arbitrary length, append, odd number of 1s",
|
||||||
|
input: "01010101 10101011",
|
||||||
|
expectedOutput: "01010101 101010111",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Parity Bit",
|
||||||
|
"args": [
|
||||||
|
"Even Parity",
|
||||||
|
"End",
|
||||||
|
"Encode",
|
||||||
|
""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Parity bit encode in odd parity, 1 block of binary of arbitrary length, prepend, even number of 1s",
|
||||||
|
input: "01010101 10101010",
|
||||||
|
expectedOutput: "101010101 10101010",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Parity Bit",
|
||||||
|
"args": [
|
||||||
|
"Odd Parity",
|
||||||
|
"Start",
|
||||||
|
"Encode",
|
||||||
|
""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Parity bit encode in odd parity, 1 block of binary of arbitrary length, prepend, odd number of 1s",
|
||||||
|
input: "01010101 10101011",
|
||||||
|
expectedOutput: "001010101 10101011",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Parity Bit",
|
||||||
|
"args": [
|
||||||
|
"Odd Parity",
|
||||||
|
"Start",
|
||||||
|
"Encode",
|
||||||
|
""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Parity bit encode in odd parity, 1 block of binary of arbitrary length, append, odd number of 1s",
|
||||||
|
input: "01010101 10101011",
|
||||||
|
expectedOutput: "01010101 101010110",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Parity Bit",
|
||||||
|
"args": [
|
||||||
|
"Odd Parity",
|
||||||
|
"End",
|
||||||
|
"Encode",
|
||||||
|
""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Parity bit encode in even parity, binary for 'hello world!', prepend to each byte",
|
||||||
|
input: "hello world!",
|
||||||
|
expectedOutput: "101101000 001100101 001101100 001101100 001101111 100100000 001110111 001101111 001110010 001101100 101100100 000100001",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "To Binary",
|
||||||
|
"args": ["Space"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"op": "Parity Bit",
|
||||||
|
"args": [
|
||||||
|
"Even Parity",
|
||||||
|
"Start",
|
||||||
|
"Encode",
|
||||||
|
" "
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Parity bit encode in odd parity, binary for 'hello world!', append to each byte",
|
||||||
|
input: "hello world!",
|
||||||
|
expectedOutput: "011010000 011001011 011011001 011011001 011011111 001000000 011101111 011011111 011100101 011011001 011001000 001000011",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "To Binary",
|
||||||
|
"args": ["Space"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"op": "Parity Bit",
|
||||||
|
"args": [
|
||||||
|
"Odd Parity",
|
||||||
|
"End",
|
||||||
|
"Encode",
|
||||||
|
" "
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
]);
|
||||||
75
tests/operations/tests/RegularExpression.mjs
Normal file
75
tests/operations/tests/RegularExpression.mjs
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/**
|
||||||
|
* Regular Expression tests.
|
||||||
|
*
|
||||||
|
* @author C85297 [95289555+C85297@users.noreply.github.com]
|
||||||
|
* @copyright Crown Copyright 2017
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
import TestRegister from "../../lib/TestRegister.mjs";
|
||||||
|
import { EMAIL_REGEX } from "../../../src/core/lib/Extract.mjs";
|
||||||
|
|
||||||
|
TestRegister.addTests([
|
||||||
|
{
|
||||||
|
name: "Regular Expression - built in email regex - IP address",
|
||||||
|
input: "yaunwfkb\nexample@[127.0.0.1]\n091nvka",
|
||||||
|
expectedOutput: "example@[127.0.0.1]",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Regular expression",
|
||||||
|
args: [
|
||||||
|
"Email address",
|
||||||
|
EMAIL_REGEX.source,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
"List matches",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Regular Expression - built in email regex - invalid IP address",
|
||||||
|
input: "yaunwfkb\nfalse_positive@[1.2.3.]\n091nvka",
|
||||||
|
expectedOutput: "",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Regular expression",
|
||||||
|
args: [
|
||||||
|
"Email address",
|
||||||
|
EMAIL_REGEX.source,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
"List matches",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Regular Expression - built in email regex - IPv4 from #2318",
|
||||||
|
input: "user@[1.2.3.4]\ntest@[192.168.0.1]\nno-match@[1.2.3.]",
|
||||||
|
expectedOutput: "user@[1.2.3.4]\ntest@[192.168.0.1]",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Regular expression",
|
||||||
|
args: [
|
||||||
|
"Email address",
|
||||||
|
EMAIL_REGEX.source,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
"List matches",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]);
|
||||||
110
tests/operations/tests/RenderMarkdown.mjs
Normal file
110
tests/operations/tests/RenderMarkdown.mjs
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/**
|
||||||
|
* RenderMarkdown tests.
|
||||||
|
*
|
||||||
|
* @copyright Crown Copyright 2026
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import TestRegister from "../../lib/TestRegister.mjs";
|
||||||
|
|
||||||
|
TestRegister.addTests([
|
||||||
|
{
|
||||||
|
name: "Render Markdown: Nothing",
|
||||||
|
input: "",
|
||||||
|
expectedOutput: '<div style="font-family: var(--primary-font-family)"></div>',
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Render Markdown",
|
||||||
|
"args": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Render Markdown: Basic Text",
|
||||||
|
input: "Hello World!",
|
||||||
|
expectedOutput: '<div style="font-family: var(--primary-font-family)"><p>Hello World!</p>\n</div>',
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Render Markdown",
|
||||||
|
"args": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Render Markdown: Simple Markdown",
|
||||||
|
input: "# Hello World!",
|
||||||
|
expectedOutput: '<div style="font-family: var(--primary-font-family)"><h1>Hello World!</h1>\n</div>',
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Render Markdown",
|
||||||
|
"args": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Render Markdown: URL (not expanded)",
|
||||||
|
input: "https://gchq.github.io/CyberChef/",
|
||||||
|
expectedOutput: '<div style="font-family: var(--primary-font-family)"><p>https://gchq.github.io/CyberChef/</p>\n</div>',
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Render Markdown",
|
||||||
|
"args": [false, false, false]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Render Markdown: URL (expanded)",
|
||||||
|
input: "https://gchq.github.io/CyberChef/",
|
||||||
|
expectedOutput: '<div style="font-family: var(--primary-font-family)"><p><a href="https://gchq.github.io/CyberChef/">https://gchq.github.io/CyberChef/</a></p>\n</div>',
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Render Markdown",
|
||||||
|
"args": [true, false, false]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Render Markdown: Link (not expanded)",
|
||||||
|
input: "[CyberChef](https://gchq.github.io/CyberChef/)",
|
||||||
|
expectedOutput: '<div style="font-family: var(--primary-font-family)"><p><a href="https://gchq.github.io/CyberChef/">CyberChef</a></p>\n</div>',
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Render Markdown",
|
||||||
|
"args": [false, false, false]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Render Markdown: Link (expanded)",
|
||||||
|
input: "[CyberChef](https://gchq.github.io/CyberChef/)",
|
||||||
|
expectedOutput: '<div style="font-family: var(--primary-font-family)"><p><a href="https://gchq.github.io/CyberChef/">CyberChef</a></p>\n</div>',
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Render Markdown",
|
||||||
|
"args": [true, false, false]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Render Markdown: Link (open in new window)",
|
||||||
|
input: "[CyberChef](https://gchq.github.io/CyberChef/)",
|
||||||
|
expectedOutput: '<div style="font-family: var(--primary-font-family)"><p><a href="https://gchq.github.io/CyberChef/" target="_blank">CyberChef</a></p>\n</div>',
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Render Markdown",
|
||||||
|
"args": [true, false, true]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Render Markdown: URL (open in new window)",
|
||||||
|
input: "https://gchq.github.io/CyberChef/",
|
||||||
|
expectedOutput: '<div style="font-family: var(--primary-font-family)"><p><a href="https://gchq.github.io/CyberChef/" target="_blank">https://gchq.github.io/CyberChef/</a></p>\n</div>',
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "Render Markdown",
|
||||||
|
"args": [true, false, true]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
]);
|
||||||
Loading…
x
Reference in New Issue
Block a user