feat: add full Zonemaster stack with Docker and Spanish UI
- Clone all 5 Zonemaster component repos (LDNS, Engine, CLI, Backend, GUI) - Dockerfile.backend: 8-stage multi-stage build LDNS→Engine→CLI→Backend - Dockerfile.gui: Astro static build served via nginx - docker-compose.yml: backend (internal) + frontend (port 5353) - nginx.conf: root redirects to /es/, /api/ proxied to backend - zonemaster-gui/config.ts: defaultLanguage set to 'es' (Spanish) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
12
zonemaster-gui/.browserslistrc
Normal file
@@ -0,0 +1,12 @@
|
||||
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
|
||||
# For additional information regarding the format and rule options, please see:
|
||||
# https://github.com/browserslist/browserslist#queries
|
||||
|
||||
# You can see what browsers were selected by your queries by running:
|
||||
# npx browserslist
|
||||
|
||||
> 0.5%
|
||||
last 2 versions
|
||||
Firefox ESR
|
||||
not dead
|
||||
not IE 9-11 # For IE 9-11 support, remove 'not'.
|
||||
13
zonemaster-gui/.editorconfig
Normal file
@@ -0,0 +1,13 @@
|
||||
# Editor configuration, see http://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
max_line_length = off
|
||||
trim_trailing_whitespace = false
|
||||
3
zonemaster-gui/.env.example
Normal file
@@ -0,0 +1,3 @@
|
||||
PUBLIC_BASE_URL="/"
|
||||
PUBLIC_API_URL="/api"
|
||||
PUBLIC_POLLING_INTERVAL=5000
|
||||
15
zonemaster-gui/.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
## Purpose
|
||||
|
||||
This PR...
|
||||
|
||||
## Context
|
||||
|
||||
(e.g. Fixes #9999, Follow-up to #9999, etc.)
|
||||
|
||||
## Changes
|
||||
|
||||
...
|
||||
|
||||
## How to test this PR
|
||||
|
||||
...
|
||||
36
zonemaster-gui/.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- develop
|
||||
- master
|
||||
- 'releases/**'
|
||||
pull_request:
|
||||
branches:
|
||||
- develop
|
||||
- master
|
||||
- 'releases/**'
|
||||
jobs:
|
||||
tests_e2e:
|
||||
name: Run end-to-end tests
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 24.x
|
||||
cache: npm
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
|
||||
- name: Install e2e dependencies
|
||||
run: npm run e2e:install-deps
|
||||
|
||||
- name: Run e2e browsers
|
||||
run: npm run e2e:install
|
||||
|
||||
- name: Run e2e tests
|
||||
run: npm run e2e
|
||||
58
zonemaster-gui/.gitignore
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
||||
|
||||
# build output
|
||||
dist/
|
||||
public/
|
||||
|
||||
# generated types
|
||||
.astro/
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
|
||||
# logs
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# environment variables
|
||||
.env
|
||||
.env.production
|
||||
|
||||
# IDEs and editors
|
||||
/.idea
|
||||
.project
|
||||
.classpath
|
||||
.c9/
|
||||
*.launch
|
||||
.settings/
|
||||
*.sublime-workspace
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
|
||||
# e2e
|
||||
/e2e/*.js
|
||||
/e2e/*.map
|
||||
.tmp
|
||||
.e2e-chrome-profile/
|
||||
|
||||
# Emacs backup files
|
||||
*~
|
||||
|
||||
# Playwright
|
||||
node_modules/
|
||||
/test-results/
|
||||
/playwright-report/
|
||||
/blob-report/
|
||||
/playwright/.cache/
|
||||
vendor/
|
||||
|
||||
# OS
|
||||
.DS_store
|
||||
|
||||
*storybook.log
|
||||
*.zip
|
||||
2
zonemaster-gui/.prettierignore
Normal file
@@ -0,0 +1,2 @@
|
||||
/*
|
||||
!/src
|
||||
6
zonemaster-gui/.prettierrc
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"plugins": ["prettier-plugin-astro", "prettier-plugin-svelte"],
|
||||
"singleQuote": true,
|
||||
"tabWidth": 4,
|
||||
"useTabs": false
|
||||
}
|
||||
2
zonemaster-gui/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
{
|
||||
}
|
||||
66
zonemaster-gui/CONTRIBUTE.md
Normal file
@@ -0,0 +1,66 @@
|
||||
# Contribute
|
||||
|
||||
Thank you for considering contributing to Zonemaster GUI! This document provides guidelines for contributing to the project.
|
||||
|
||||
## Project Overview
|
||||
|
||||
Zonemaster GUI is built with:
|
||||
- [Astro](https://astro.build/) as the main framework
|
||||
- [Svelte](https://svelte.dev/) for UI components
|
||||
- [TypeScript](https://www.typescriptlang.org/) for type safety
|
||||
|
||||
## Development Setup
|
||||
|
||||
1. Clone the repository
|
||||
2. Install dependencies:
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
3. Start the development server:
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## Code Style
|
||||
|
||||
We use [Prettier](https://prettier.io/) for code formatting with the following configuration:
|
||||
- Single quotes
|
||||
- 4 spaces for indentation
|
||||
- No tabs
|
||||
|
||||
To format your code:
|
||||
```bash
|
||||
npx prettier --write .
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
We use [Playwright](https://playwright.dev/) for end-to-end testing. Tests are located in the `e2e` directory.
|
||||
|
||||
To run tests:
|
||||
```bash
|
||||
npm run e2e
|
||||
```
|
||||
|
||||
## GUI Modifications
|
||||
|
||||
Zonemaster GUI is designed to be cloned and customized for theming purposes. When making changes to the GUI, please be mindful of the following:
|
||||
|
||||
- **Be careful when renaming CSS class names** - Many themes may depend on these class names
|
||||
- **Avoid deleting, renaming, or moving template files** without proper deprecation notices
|
||||
- **Consider backward compatibility** when modifying component structures
|
||||
- **Document any breaking changes** that might affect custom themes
|
||||
|
||||
While it's ultimately up to theme creators to handle conflicts when syncing with the main repository, we should minimize disruption where possible. For more information on theming, see the [THEMING.md](docs/THEMING.md) document.
|
||||
|
||||
## Pull Request Process
|
||||
|
||||
1. Fork the repository
|
||||
2. Create a feature branch
|
||||
3. Make your changes
|
||||
4. Ensure tests pass
|
||||
5. Submit a pull request
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
Please be respectful and considerate of others when contributing to this project.
|
||||
378
zonemaster-gui/Changes
Normal file
@@ -0,0 +1,378 @@
|
||||
Release history for Zonemaster component Zonemaster-GUI
|
||||
|
||||
v5.0.1 2026-03-04 (part of Zonemaster v2025.2.1 release)
|
||||
|
||||
[Fixes]
|
||||
- Fixes various GUI issues - e.g language switcher, FAQ layout,
|
||||
and DS algorithm list. See PR for a full list (#534)
|
||||
|
||||
|
||||
v5.0.0 2025-12-17 (part of Zonemaster v2025.2 release)
|
||||
|
||||
[Release information]
|
||||
- The GUI in this release has been completely rewritten. The changes
|
||||
primarily focused on the underlying technologies, while the look and
|
||||
feel remains only slightly altered due to various accessibility improvements.
|
||||
From this version on, Zonemaster-GUI supports complete customization of the
|
||||
GUI. You can find more information and a how-to in the documentation.
|
||||
|
||||
[Breaking changes]
|
||||
- The GUI API has changed. It has no longer support for starting a
|
||||
test directly from the URL. You will find more information in the
|
||||
documentation on using the GUI.
|
||||
- Configuration done in "app.config.json" for Zonemaster-GUI, which was
|
||||
run-time configuration, needs to be migrated. Most of that configuration
|
||||
has now become build-time configuration. See documents related to
|
||||
configuring the GUI.
|
||||
|
||||
[Features]
|
||||
- Rewritten GUI (#511, #514, #516, #517, #519, #520, #521, #523, #526)
|
||||
|
||||
[Fixes]
|
||||
- Ported and updated translation of messages and FAQ for the new GUI
|
||||
(#502, #503, #505, #506, #507, #508, #518)
|
||||
|
||||
|
||||
v4.4.0 2025-03-04 (part of Zonemaster v2024.2.1 release)
|
||||
|
||||
[Release information]
|
||||
- Translations have not been fully updated in this release. They will
|
||||
be updated in an upcoming release.
|
||||
|
||||
[Features]
|
||||
- Adds translation to Slovenian language. The translation is not
|
||||
complete (#482)
|
||||
|
||||
|
||||
v4.3.1 2024-12-09 (part of Zonemaster v2024.2 release)
|
||||
|
||||
[Release information]
|
||||
- Translations have not been fully updated in this release. They will
|
||||
be updated in an upcoming release.
|
||||
- This version has no changes to Zonemaster-GUI but the installation
|
||||
zip file has been built with updated dependencies to resolve
|
||||
potential security issues.
|
||||
|
||||
[Features]
|
||||
- Updates the link in the footer to the Zonemaster documentation to point to
|
||||
document site at doc.zonemaster.net instead of Github (#484)
|
||||
|
||||
v4.3.0 2024-07-01 (part of Zonemaster v2024.1 release)
|
||||
|
||||
[Release information]
|
||||
- Translations have not been fully updated in this release. They will
|
||||
be updated in an upcoming release.
|
||||
|
||||
[Features]
|
||||
- Improves run test form (#461)
|
||||
- Makes IDN names being displayed as both A-label and U-label (#464)
|
||||
- Makes severity levels and module names in result page
|
||||
optionally being translated (#463)
|
||||
|
||||
[Fixes]
|
||||
- Cleans up old FAQ architecture files (#466)
|
||||
- Updates translation documentation (#462)
|
||||
- Makes history modal close (#465)
|
||||
- Avoid bundling the mock interceptor in prod environment (#448)
|
||||
|
||||
|
||||
v4.2.0 2024-03-18 (public release version)
|
||||
|
||||
[Release information]
|
||||
- Translations have not been fully updated in this release. They will
|
||||
be updated in an upcoming fix release.
|
||||
|
||||
[Features]
|
||||
- Improves GUI design (#434)
|
||||
|
||||
[Fixes]
|
||||
- Updates FAQ (#443, #456, #457)
|
||||
- Fixe handling of unspecified test module (#444)
|
||||
- Updates French translation (#450)
|
||||
- Updates README file (#455)
|
||||
|
||||
|
||||
v4.1.1 2023-09-08 (public fix version)
|
||||
|
||||
[Fixes]
|
||||
- Corrects documentation links in FAQ for all languages
|
||||
(#433)
|
||||
|
||||
|
||||
v4.1.0 2023-06-21 (public release version)
|
||||
|
||||
[Features]
|
||||
- Gives small improvement of the run test page (#416)
|
||||
- Makes room for optional footer logo (#408)
|
||||
|
||||
[Fixes]
|
||||
- Updates translations (#418, #419, #423, #422, #420, #406,
|
||||
#405)
|
||||
- Removes documentation moved to the zonemaster/zonemaster
|
||||
repository (#424)
|
||||
- Moves HTML anchor into header and creates valid HTML
|
||||
for FAQs (#407)
|
||||
- Fixes and improves result page on a small screen (#413)
|
||||
- Removes the github logo (#411)
|
||||
- Adds missing strings to translation files (#414)
|
||||
- Removes randomization of attributes in Angular (#400)
|
||||
- Improves page footer (#403)
|
||||
- Improves accessibility of the result page (#401)
|
||||
|
||||
|
||||
v4.0.2 2023-03-01 (public fix version)
|
||||
|
||||
[Fixes]
|
||||
- Updates translations to Spanish and Norwegian (#396, #395)
|
||||
|
||||
|
||||
v4.0.1 2023-01-31 (public fix version)
|
||||
|
||||
[Fixes]
|
||||
- Updates translations (#386, #385)
|
||||
|
||||
|
||||
v4.0.0 2022-12-19 (public release version)
|
||||
|
||||
[Status]
|
||||
- This version of Zonemaster-GUI requires Zonemaster-Backend
|
||||
version v10.0.0 or higher.
|
||||
|
||||
[Features]
|
||||
- Improves domain test form (#364)
|
||||
- Provides a better look and feel while browsing the results
|
||||
of a test (#341)
|
||||
- Forces footer to the viewport's bottom (#365)
|
||||
- Uses a drop down menu to select between languages (#337)
|
||||
- Updates the English FAQ (#347)
|
||||
- Makes it possible to perform a test through the URL
|
||||
directly (#334, #339, #335, #376)
|
||||
- Upgrades to new version of angular and bootstrap with new
|
||||
handling of language setting and translation (#349, #375)
|
||||
|
||||
[Fixes]
|
||||
- Updates translations (#373, #370, #360, #354, #359, #361, #363)
|
||||
- Fixes notifications behaviour (#369)
|
||||
- Updates the license wording to unify with the other
|
||||
repositories (#367)
|
||||
- Adds license file to distribution zip file (#368, #366)
|
||||
- Updates Zonemaster and DNS descriptive texts (#346)
|
||||
- Gives better keyboard navigation (#342)
|
||||
- Updates all FAQs (#336)
|
||||
- Fixes FAQ links when serving from custom base (#331)
|
||||
- Fixes the logo customization key name in documentation (#332)
|
||||
|
||||
|
||||
v3.6.1 2022-07-08 (public fix version)
|
||||
|
||||
[Status]
|
||||
- This fix version does not change anything in the installed GUI besides
|
||||
the version. There is no reason to update to this version from
|
||||
previous version (v3.6.0).
|
||||
|
||||
[Fixes]
|
||||
- Adds missing installation instructions for CentOS Linux 7 (#325)
|
||||
|
||||
|
||||
v3.6.0 2022-06-10 (public release version)
|
||||
|
||||
[Status]
|
||||
- This version of Zonemaster-GUI only works with Zonemaster-Backend
|
||||
v9.0.0 or newer due to the change in #319 and #316.
|
||||
|
||||
[Features]
|
||||
- Makes pollinginterval configurable (#320, #307)
|
||||
- Sorts messages by severity when presented (#297, #118)
|
||||
|
||||
[Fixes]
|
||||
- Uses created_at instead of deprecated creation_time in result from
|
||||
RPCAPI (#319, #316)
|
||||
- Fixes translation (#318, #314)
|
||||
- Makes it possible to have translated FAQ title (#313)
|
||||
- Make pages title consistent (#310)
|
||||
- Avoids using bootstrap for html export (#308)
|
||||
- Prevent translation caching when the translation are updated (#285)
|
||||
- Code clean-up (#303, #299, #275)
|
||||
- Cleans domain names and nameserver names from trailing dots, trailing
|
||||
spaces and leading spaces (#305, #249)
|
||||
- Make navigation more consistent (#300, #284)
|
||||
|
||||
|
||||
v3.5.0 2021-12-20 (public fix release)
|
||||
|
||||
[Features]
|
||||
- Adds translation to Spanish language and support for Spanish (#272)
|
||||
|
||||
[Fixes]
|
||||
- Updates Danish translation (#293, #287)
|
||||
- Updates Norwegian translation (#294, #289)
|
||||
|
||||
|
||||
v3.4.0 2021-12-03 (public release version)
|
||||
|
||||
[Features]
|
||||
- Replaces CentOS with Rocky Linux (#280)
|
||||
- Provides translation to error messages from RPC API (#269, #239)
|
||||
- Adds support from information banner (#266)
|
||||
- Adds filter for test history (#253, #251)
|
||||
- Adds run time configuration (#267, #260, #219, #170)
|
||||
- Adds flexible URL (#252, #250)
|
||||
- Adds support for translated tooltips (#243, #241)
|
||||
|
||||
[Fixes]
|
||||
- Updates Finnish translation (#290, #288)
|
||||
- Updates Swedish translation (#286)
|
||||
- Updates Danish translation (#248, #244)
|
||||
- Improves translation handling (#265, #267, #234, #235, #229, #278)
|
||||
- Updates version of Node.js used (#274)
|
||||
- Fixes colors on buttons (#270)
|
||||
- Improves on narrow device (#259)
|
||||
- Improves user interface (#263, #115, #247, #238, #257, #236, #150, #153)
|
||||
#237, #222, #212, #213, #227, #226, #224, #176, #216)
|
||||
- Improves error messages (#230, #175, #177, #178)
|
||||
- Fixes default protocol setting (#218, #217)
|
||||
- Fixes critical count (#233)
|
||||
|
||||
v3.3.0 2021-05-28 (public release version)
|
||||
|
||||
[Features]
|
||||
- Adds Norwegian translation and language support (#174, #185)
|
||||
- Adds Finnish translation and language support (#184)
|
||||
|
||||
[Fixes]
|
||||
- Updates installation instructions (#202)
|
||||
- Updates e2e tests (#195, #174)
|
||||
- Cleans-up (#196)
|
||||
- Fixes translation file (#186)
|
||||
- Corrects GUI (#192, #149)
|
||||
- Makes date consistent (#191, #189)
|
||||
- Resolves logo issue in Chrome (#187, #181)
|
||||
|
||||
|
||||
v3.2.2 2021-02-10 (public release version)
|
||||
|
||||
[Features]
|
||||
- New logotype for Zonemaster (#167)
|
||||
|
||||
[Fixes]
|
||||
- Improves the TranslationGuide (#173)
|
||||
- Updates installation instructions (#172)
|
||||
- Corrects the GUI so that default language is selected
|
||||
when the browser language is not supported (#169, #168)
|
||||
- Removes unused style sheet (#166, #151)
|
||||
- Makes i18n/*.json consistent (#161, #162)
|
||||
- Updates French FAQ (#164, #89)
|
||||
|
||||
|
||||
v3.2.1 2020-11-06 (public release version)
|
||||
|
||||
[Fixes]
|
||||
- Correct fragment in links to FAQ (#148, #147)
|
||||
- Updated/improved installation instruction (#154, #152)
|
||||
- Improved internationalization (i18n) (#121, #139)
|
||||
- Corrected language value (#140, #138)
|
||||
|
||||
|
||||
v3.2.0 2020-04-30
|
||||
|
||||
[Features]
|
||||
- New logotype for Zonemaster (#120)
|
||||
- Improved testing (#84, #83)
|
||||
- Improved translations (#81, #44, #61)
|
||||
|
||||
[Fixes]
|
||||
- Language switch goes to Github instead (#114, #124)
|
||||
- Translated untranslated phrases (#116)
|
||||
- Added space after string (#117)
|
||||
- update tsconfig for ivy engine (#112)
|
||||
- Update dependencies (#111, #108, #109)
|
||||
- Create empty dir for faqs generation (#110)
|
||||
- Removed temporary files that should not be in git (#103, 92)
|
||||
- Updated DNSSEC algorithms in drop-down list (#102, #95)
|
||||
- Update of Swedish FAQ (#101)
|
||||
- Adding numbers of algorithm and digest (#100, #94)
|
||||
- Updated to correct brand name (#91)
|
||||
- Updated installation instruction (#87, #126, #128, #129)
|
||||
- Updated English FAQ (#88)
|
||||
- Fixed domain test cannot be reset (#58, #79)
|
||||
- Fixed pre-populated cannot be emtied (#59, #80)
|
||||
- Fixed warnings when creating zip file (#56, #64)
|
||||
- Fixed redirect all history call from test to result (#73, #71)
|
||||
- Added how to disable default site in apache on debian. (#69, #74)
|
||||
- Change "Digest" to "Delegation Signers (DS records)" (#75, #60)
|
||||
- Update dependencies (Angular and co) (#76, #56)
|
||||
- Translation into Danish (#72, #70)
|
||||
- Add handler for scroll event to alert message (#49, #39, #40)
|
||||
- Explain CORS in Readme (#63, #52)
|
||||
|
||||
|
||||
v3.1.0 2019-05-22 (public release version)
|
||||
|
||||
[Status]
|
||||
- This a public release fully tested before release. This version
|
||||
will be available on CPAN.
|
||||
|
||||
[Fixes]
|
||||
- Updated installation instructions (#62, #53, #54, #45, #31)
|
||||
- Fixed sending empty ns when the advanced options are not open (#47)
|
||||
- Add Warning message for domain that not exist (#40, #42)
|
||||
- Add a tests before fetching information about parent zone (#41)
|
||||
- Fixed broken undelegated test (#38, #43)
|
||||
- Fix french typos in translations (#30, #17)
|
||||
- Fix history call (#18)
|
||||
- Add no-cache for index.html (#22, #23)
|
||||
|
||||
[Features]
|
||||
- Added documentation for contributers (#32)
|
||||
- Add some e2e test with selenium (only works on local) (#37, #26)
|
||||
- Expand the collapsed action buttons of the result page (#34, #33)
|
||||
- Improve zonemaster description in FAQ (#35, #28)
|
||||
- Remove predelegated test page and merge all form options (#36, #6)
|
||||
|
||||
|
||||
v3.0.1 2019-01-31 (pre-release version)
|
||||
|
||||
- Status
|
||||
- This is a pre-release version not fully tested on all supported
|
||||
environments.
|
||||
- Fixes
|
||||
- Corrected link in installation document to point at correct
|
||||
git tag (correct release).
|
||||
|
||||
|
||||
v3.0.0 2019-01-27 (pre-release version)
|
||||
|
||||
- Status
|
||||
- This is a pre-release version not fully tested on all supported
|
||||
environments.
|
||||
- API change
|
||||
- As of version 3.0.0 of Zonemaster-Backend its API has changed and
|
||||
this version of Zonemaster-GUI does not work with earlier versions
|
||||
of Zonemaster-Backend.
|
||||
- Features
|
||||
- Adaption new profile model and API changes in Zonemaster-Backend
|
||||
- Dynamically get avaiable profiles from the backend #10
|
||||
- Changed HTML DS types from String to Int as expected in the API #12
|
||||
- Removed validate_syntax and rename getNSips to getHostByName. #13
|
||||
- Changed two api call #16
|
||||
- Fixes
|
||||
- Updated result CSS: set a cursor pointer on expandable results #7
|
||||
- Various fixes #3
|
||||
- All link references on Github now to zonemaster/zonemaster instead
|
||||
of old dotse/zonemaster #4
|
||||
- Updated of installation document #5
|
||||
- Removed debug log for routing #11
|
||||
- Fixed display profile name (async problem) #16
|
||||
|
||||
|
||||
v2.0.0 2018-06-25
|
||||
|
||||
- This is the first release version of this code.
|
||||
- Old Zonemaster-GUI has been replaced by a entirely new code with
|
||||
new architecture.
|
||||
- New Zonemaster-GUI is in Javascript only with no Perl, and it talks
|
||||
directly with the Zonemaster-Backend API, in the default installation
|
||||
through a web server proxy, e.g. Apache http server.
|
||||
- The old Zonemaster-GUI is deprecated, and can, for the time being,
|
||||
still be found in the old repository,
|
||||
https://github.com/dotse/zonemaster-gui
|
||||
42
zonemaster-gui/LICENSE
Normal file
@@ -0,0 +1,42 @@
|
||||
### Code license
|
||||
|
||||
Copyright (c) The Swedish Internet Foundation (<https://internetstiftelsen.se/en/>)
|
||||
Copyright (c) AFNIC (<https://www.afnic.fr/en/>)
|
||||
All rights reserved.
|
||||
|
||||
Copyright belongs to external contributor where applicable.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
Redistributions in binary form must reproduce the above copyright notice, this
|
||||
list of conditions and the following disclaimer in the documentation and/or
|
||||
other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
### Documentation license
|
||||
|
||||
Copyright (c) The Swedish Internet Foundation (<https://internetstiftelsen.se/en/>)
|
||||
Copyright (c) AFNIC (<https://www.afnic.fr/en/>)
|
||||
All rights reserved.
|
||||
|
||||
Copyright belongs to external contributor where applicable.
|
||||
|
||||
Creative Commons Attribution 4.0 International License
|
||||
|
||||
You should have received a copy of the license along with this
|
||||
work. If not, see <https://creativecommons.org/licenses/by/4.0/>.
|
||||
58
zonemaster-gui/README.md
Normal file
@@ -0,0 +1,58 @@
|
||||
# Zonemaster Web GUI [](https://github.com/zonemaster/zonemaster-gui/actions/workflows/ci.yml)
|
||||
|
||||
## Overview
|
||||
|
||||
Zonemaster GUI is the web interface component of the Zonemaster project, a tool designed for DNS validation and testing. For a comprehensive overview of the Zonemaster software, please see the [Zonemaster repository].
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before installing the Zonemaster GUI, ensure you have the Zonemaster Engine and Zonemaster-Backend setup. Refer to the [Zonemaster-Engine installation] and [Zonemaster-Backend installation] documents.
|
||||
|
||||
## Installation
|
||||
|
||||
There are two ways to install the Zonemaster GUI:
|
||||
|
||||
### Quick Install (1 minute)
|
||||
Download the release zip file, upload to your web server, and configure.
|
||||
|
||||
### Full Customization (5 minutes)
|
||||
Clone the repository, build, and deploy.
|
||||
|
||||
For detailed instructions, see [INSTALL.md](docs/INSTALL.md).
|
||||
|
||||
## Development
|
||||
|
||||
To set up your development environment:
|
||||
|
||||
1. Clone the repository
|
||||
2. Run `npm install`
|
||||
3. Run `cp .env.example .env`
|
||||
4. Set the URL to your Zonemaster backend in the `.env` file
|
||||
5. Run `npm run dev`
|
||||
|
||||
## Documentation
|
||||
|
||||
Refer to the [docs](/docs) directory for detailed information on:
|
||||
- Installation and configuration
|
||||
- Theming and customization
|
||||
- Translation guide
|
||||
- Testing
|
||||
- UI documentation
|
||||
|
||||
For contribution guidelines, see [CONTRIBUTE.md](CONTRIBUTE.md).
|
||||
|
||||
## License
|
||||
|
||||
This is free software under a 2-clause BSD license. The full text of the license can be found in the [LICENSE](LICENSE) file included in this repository.
|
||||
|
||||
Images `src/assets/images/person_looking_at_computer.svg` and `src/assets/images/world_connected.svg` are taken from <https://undraw.co>, [full license](https://undraw.co/license).
|
||||
|
||||
Images `src/assets/images/person_looking_at_computer.svg` and `src/assets/images/world_connected.svg` are taken from <https://undraw.co>, [full license](https://undraw.co/license).
|
||||
|
||||
[Backend Configuration]: https://github.com/zonemaster/zonemaster/blob/master/docs/public/configuration/backend.md
|
||||
[GUI Configuration]: https://github.com/zonemaster/zonemaster/blob/master/docs/public/configuration/gui.md
|
||||
[Installation instructions]: https://github.com/zonemaster/zonemaster/blob/master/docs/public/installation/zonemaster-gui.md
|
||||
[Public documentation]: https://github.com/zonemaster/zonemaster/blob/master/docs/public/README.md
|
||||
[Zonemaster-Engine installation]: https://github.com/zonemaster/zonemaster/blob/master/docs/public/installation/zonemaster-engine.md
|
||||
[Zonemaster-Backend installation]: https://github.com/zonemaster/zonemaster/blob/master/docs/public/installation/zonemaster-backend.md
|
||||
[Zonemaster repository]: https://github.com/zonemaster/zonemaster
|
||||
54
zonemaster-gui/astro.config.mjs
Normal file
@@ -0,0 +1,54 @@
|
||||
// @ts-check
|
||||
import { defineConfig } from 'astro/config';
|
||||
import remarkGfm from 'remark-gfm';
|
||||
import {
|
||||
remarkDefinitionList,
|
||||
defListHastHandlers,
|
||||
} from "remark-definition-list";
|
||||
import svelte from '@astrojs/svelte';
|
||||
import node from '@astrojs/node';
|
||||
import config from './src/config.js';
|
||||
import messagesPlugin, { messagesIntegration } from './scripts/messages-plugin.ts';
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
base: config.baseUrl,
|
||||
trailingSlash: "always",
|
||||
output: process.env.NODE_ENV === 'production' ? 'static' : 'server',
|
||||
|
||||
outDir: './public/dist',
|
||||
publicDir: './static',
|
||||
|
||||
i18n: {
|
||||
locales: config.enabledLanguages,
|
||||
defaultLocale: config.defaultLanguage,
|
||||
routing: {
|
||||
prefixDefaultLocale: true
|
||||
},
|
||||
},
|
||||
|
||||
markdown: {
|
||||
remarkPlugins: [remarkGfm, remarkDefinitionList],
|
||||
remarkRehype: { handlers: defListHastHandlers },
|
||||
},
|
||||
|
||||
integrations: [
|
||||
svelte({
|
||||
compilerOptions: {
|
||||
customElement: true
|
||||
}
|
||||
}),
|
||||
messagesIntegration()
|
||||
],
|
||||
|
||||
vite: {
|
||||
plugins: [messagesPlugin({
|
||||
defaultLanguage: config.defaultLanguage,
|
||||
enabledLanguages: config.enabledLanguages,
|
||||
})],
|
||||
},
|
||||
|
||||
adapter: process.env.NODE_ENV === 'production' ? undefined : node({
|
||||
mode: 'standalone'
|
||||
}),
|
||||
});
|
||||
23
zonemaster-gui/config.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import type { Config } from '@/types.ts';
|
||||
import packageJson from './package.json';
|
||||
|
||||
const config: Config = {
|
||||
defaultLanguage: 'es',
|
||||
enabledLanguages: ['da', 'en', 'es', 'fi', 'fr', 'nb', 'sv', 'sl'],
|
||||
baseUrl: import.meta.env.PUBLIC_BASE_URL || '/',
|
||||
apiBaseUrl: import.meta.env.PUBLIC_API_URL || '/api',
|
||||
pollingInterval: import.meta.env.PUBLIC_POLLING_INTERVAL || 5000,
|
||||
clientInfo: {
|
||||
version: packageJson.version,
|
||||
id: 'Zonemaster-GUI',
|
||||
},
|
||||
siteInfo: {
|
||||
email: 'contact@zonemaster.net',
|
||||
siteName: '',
|
||||
},
|
||||
setTitle(title: string) {
|
||||
return `${title} – Zonemaster`;
|
||||
}
|
||||
};
|
||||
|
||||
export default config;
|
||||
24
zonemaster-gui/demo/demo.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import '../src/themes/default/styles/theme.css';
|
||||
import '../src/themes/default/styles/foundation.css';
|
||||
import '../src/assets/fonts/bootstrap-icons.min.css';
|
||||
import '../src/lib/styles/style.css';
|
||||
import { createTestAgent } from '../src/lib/main.ts';
|
||||
|
||||
const agent = createTestAgent();
|
||||
const button = document.getElementById('headless') as HTMLButtonElement;
|
||||
|
||||
agent.subscribe((state, context) => {
|
||||
if (state === 'testing') {
|
||||
button.disabled = true;
|
||||
button.innerText = `Testing...${context.progress}%`;
|
||||
} else {
|
||||
button.disabled = false;
|
||||
button.innerText = 'Start test';
|
||||
}
|
||||
});
|
||||
|
||||
button?.addEventListener('click', () => {
|
||||
agent.transition('START', {
|
||||
domain: 'zonemaster.net',
|
||||
});
|
||||
});
|
||||
17
zonemaster-gui/demo/index.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Zonemaster Lib Demo</title>
|
||||
<script>
|
||||
window.zonemaster = {
|
||||
apiEndpoint: 'http://127.0.0.1:8080/api',
|
||||
pollingInterval: 1000,
|
||||
};
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<button id="headless">Start test</button>
|
||||
<zm-domain-test></zm-domain-test>
|
||||
<script type="module" src="./demo.ts"></script>
|
||||
</body>
|
||||
</html>
|
||||
14
zonemaster-gui/docs/README.md
Normal file
@@ -0,0 +1,14 @@
|
||||
Zonemaster-GUI documents
|
||||
|
||||
* An overview of the Zonemaster GUI is found in [Zonemaster UI]
|
||||
* Information related to code testing is found in [Unit testing Zonemaster-GUI]
|
||||
* [Installation instructions]
|
||||
* [Configuration instructions]
|
||||
* [Translation instructions]
|
||||
|
||||
|
||||
[Configuration instructions]: https://github.com/zonemaster/zonemaster/blob/master/docs/public/configuration/gui/README.md
|
||||
[Installation instructions]: https://doc.zonemaster.net/latest/installation/zonemaster-gui.html
|
||||
[Unit testing Zonemaster-GUI]: Testing.md
|
||||
[Translation instructions]: https://github.com/zonemaster/zonemaster/blob/master/docs/public/translation/Translating-GUI.md
|
||||
[Zonemaster UI]: UI.md
|
||||
46
zonemaster-gui/docs/Testing.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# Unit testing of Zonemaster-GUI
|
||||
|
||||
## Setup
|
||||
|
||||
This part assumed that you have a working NodeJS environment on Ubuntu. See
|
||||
the [build environment] document for further instructions.
|
||||
|
||||
The tests for Zonemaster GUI are implemented using [playwright], to install the
|
||||
tests dependencies run the following.
|
||||
|
||||
```sh
|
||||
npm run e2e:install-deps
|
||||
npm run e2e:install
|
||||
```
|
||||
|
||||
This will install system dependencies as well as the browsers used to tests the
|
||||
GUI.
|
||||
|
||||
## Running the tests
|
||||
|
||||
To run the tests run the following command.
|
||||
|
||||
```sh
|
||||
npm run e2e
|
||||
```
|
||||
|
||||
If the appearance of the GUI changes some tests might fail as the baseline for
|
||||
visual comparison is no longer up to date. In this case it is required to update
|
||||
the snapshots. The following commands updates the snapshots while ensuring a
|
||||
similar environment than the one the CI runs in is used (Ubuntu 22.04 and UTC
|
||||
time).
|
||||
|
||||
```sh
|
||||
docker run --rm --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.57.0-jammy /bin/bash
|
||||
npm run e2e:install
|
||||
npm run e2e:update
|
||||
exit
|
||||
```
|
||||
|
||||
Note that this method may not always work: it could happen that the generated
|
||||
snapshots are incorrect and have slight differences (e.g. appears zoomed in/out,
|
||||
etc). In that case, repeat the above steps but outside of the Docker environment,
|
||||
and preferably on a machine that uses a similar OS/environment as the CI.
|
||||
|
||||
[build environment]: https://github.com/zonemaster/zonemaster/blob/master/docs/internal/distrib-testing/Ubuntu-Node.js-build-environment.md
|
||||
[playwright]: https://playwright.dev/docs/intro
|
||||
1
zonemaster-gui/docs/TranslationGuide.md
Normal file
@@ -0,0 +1 @@
|
||||
Moved to [translation documents](https://github.com/zonemaster/zonemaster/blob/develop/docs/public/translation/README.md).
|
||||
54
zonemaster-gui/docs/UI.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# Zonemaster UI
|
||||
|
||||
Zonemaster UI (Zonemaster-GUI) is a static website built with [Astro], using
|
||||
[Svelte] for interactive components and [Vite] for internationalization/translation
|
||||
(i18n).
|
||||
|
||||
## Standalone Components
|
||||
|
||||
Zonemaster UI also provides a set of standalone web components that can be
|
||||
reused in other projects. Currently, there are two available:
|
||||
|
||||
- `<zm-domain-test>` – for initiating domain tests
|
||||
- `<zm-program-versions>` – displays the current versions of Zonemaster
|
||||
components
|
||||
|
||||
These components are framework-agnostic and can be embedded in other websites or
|
||||
apps as needed.
|
||||
|
||||
```html
|
||||
<zm-domain-test></zm-domain-test>
|
||||
<zm-program-versions></zm-program-versions>
|
||||
|
||||
<script type="module">
|
||||
import '@zonemaster/ui';
|
||||
</script>
|
||||
```
|
||||
|
||||
## Headless Mode
|
||||
|
||||
Zonemaster UI can also be used in **headless mode**, where it acts as a
|
||||
JavaScript API layer between the Zonemaster backend and your own frontend.
|
||||
|
||||
This is useful if you want to:
|
||||
|
||||
- Build your own custom UI
|
||||
- Integrate Zonemaster functionality into another application or CLI tool
|
||||
|
||||
In headless mode, the UI logic is decoupled from the visual components, allowing
|
||||
you to access core functionality programmatically through JavaScript.
|
||||
|
||||
```ts
|
||||
import { TestAgent } from '@zonemaster/ui';
|
||||
|
||||
TestAgent.subscribe((state, context) => {
|
||||
console.log(state, context);
|
||||
});
|
||||
|
||||
TestAgent.transition('START', { domain: 'example.com' });
|
||||
```
|
||||
|
||||
|
||||
[Astro]: https://astro.build/
|
||||
[Svelte]: https://svelte.dev/
|
||||
[Vite]: https://vite.dev/
|
||||
14
zonemaster-gui/e2e/FR01.e2e-spec.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { test, expect } from './global-setup';
|
||||
|
||||
import { goToHome, setLang } from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR01 - [A Home button that sends the user to the default simple view]', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
});
|
||||
|
||||
test('should have a link to go to home page', async ({ page }) => {
|
||||
await expect(page.locator('a.zm-logo')).toHaveAttribute('href', '/en/');
|
||||
});
|
||||
});
|
||||
20
zonemaster-gui/e2e/FR02.e2e-spec.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import { test, expect } from './global-setup';
|
||||
|
||||
import { goToHome, setLang } from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR02 - [All menus should be clickable in latest version of different browsers]', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
});
|
||||
|
||||
test('should go to faq page', async ({ page, baseURL }) => {
|
||||
await page.locator('a.zm-menu__item[href="/en/faq/"]').click();
|
||||
await expect(page).toHaveURL(baseURL + '/en/faq/');
|
||||
});
|
||||
|
||||
test('should go to domain page', async ({ page, baseURL }) => {
|
||||
await page.locator('a.zm-menu__item[href="/en/"]').click();
|
||||
await expect(page).toHaveURL(baseURL + '/en/');
|
||||
});
|
||||
});
|
||||
36
zonemaster-gui/e2e/FR03.e2e-spec.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import { test, expect } from './global-setup';
|
||||
|
||||
import { goToHome, setLang, showOptions } from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR03 - [All appropriate fields should be writable]', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
|
||||
test('should be able to write in the main input', async ({ page }) => {
|
||||
const testString = 'afnic.fr';
|
||||
|
||||
const domainInput = page.locator('#zmDomainTestForm input[name="domain"]').first();
|
||||
|
||||
await domainInput.focus();
|
||||
await page.keyboard.type(testString);
|
||||
await expect(domainInput).toHaveValue(testString);
|
||||
|
||||
await showOptions(page);
|
||||
await page.waitForTimeout(400);
|
||||
|
||||
const nsInput = page.locator('input[name="nameservers[0][ns]"]').first();
|
||||
|
||||
await nsInput.focus();
|
||||
await page.keyboard.type(testString);
|
||||
await expect(nsInput).toHaveValue(testString);
|
||||
|
||||
const keytagInput = page.locator('input[name="ds_info[0][keytag]"]').first();
|
||||
|
||||
await keytagInput.focus();
|
||||
await page.keyboard.type(testString);
|
||||
await expect(keytagInput).toHaveValue(testString);
|
||||
});
|
||||
});
|
||||
14
zonemaster-gui/e2e/FR04.e2e-spec.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { test, expect } from './global-setup';
|
||||
|
||||
import { goToHome, setLang } from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR04 - Valid title for the Web interface', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
});
|
||||
|
||||
test('should have right title - Zonemaster', async ({ page }) => {
|
||||
await expect(page).toHaveTitle('Zonemaster');
|
||||
});
|
||||
});
|
||||
33
zonemaster-gui/e2e/FR05.e2e-spec.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import { test, expect } from './global-setup';
|
||||
|
||||
import { goToHome, setLang } from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR05 - [Supports internationalization]', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await goToHome(page);
|
||||
});
|
||||
|
||||
const testSuite = [
|
||||
{ language: 'Danish', code: 'da', expected: 'Domænenavn' },
|
||||
{ language: 'English', code: 'en', expected: 'Domain name' },
|
||||
{ language: 'Spanish', code: 'es', expected: 'Nombre de dominio' },
|
||||
{ language: 'Finnish', code: 'fi', expected: 'Verkkotunnuksen nimi' },
|
||||
{ language: 'French', code: 'fr', expected: 'Nom de domaine' },
|
||||
{ language: 'Norwegian', code: 'nb', expected: 'Domenenavn' },
|
||||
{ language: 'Swedish', code: 'sv', expected: 'Domänamn' },
|
||||
{ language: 'Slovenian', code: 'sl', expected: 'Ime domene' },
|
||||
];
|
||||
|
||||
for (const { language, code, expected } of testSuite) {
|
||||
test(`should have ${language} language option`, async ({ page }) => {
|
||||
const langNavLink = page.locator(`select#languageSwitcher > option[lang="${code}"]`);
|
||||
await expect(langNavLink).toHaveCount(1);
|
||||
await expect(langNavLink).toHaveAttribute('lang', code);
|
||||
})
|
||||
|
||||
test(`should switch to ${language}`, async ({ page }) => {
|
||||
await setLang(page, code);
|
||||
await expect(page.locator('input[name="domain"]')).toHaveAttribute('placeholder', expected);
|
||||
})
|
||||
}
|
||||
});
|
||||
14
zonemaster-gui/e2e/FR08.e2e-spec.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { test, expect } from './global-setup';
|
||||
|
||||
import { goToHome, clearBrowserCache } from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR08 - [Presence of a default fallback language - English]', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await goToHome(page);
|
||||
await clearBrowserCache(page);
|
||||
});
|
||||
|
||||
test('should have a fallback language - English', async ({ page }) => {
|
||||
await expect(page.locator('input[name="domain"]')).toHaveAttribute('placeholder', 'Domain name');
|
||||
});
|
||||
});
|
||||
17
zonemaster-gui/e2e/FR09.e2e-spec.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import {test, expect} from './global-setup';
|
||||
|
||||
import {goToHome, setLang} from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR09 - [Once a language is chosen, all other links should open in that respective language]', () => {
|
||||
test.beforeEach(async ({page}) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'fr');
|
||||
});
|
||||
|
||||
test('should keep french when opening faq page', async ({page}) => {
|
||||
await expect(page.locator('input[name="domain"]')).toHaveAttribute('placeholder', 'Nom de domaine');
|
||||
await page.goto('/fr/faq/');
|
||||
await expect(page.locator('main h1')).toHaveText('Questions fréquentes');
|
||||
await expect(page.locator('a.zm-menu__item[href$="/fr/"]')).toHaveText("Démarrer un test");
|
||||
});
|
||||
});
|
||||
24
zonemaster-gui/e2e/FR10.e2e-spec.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import { test, expect } from './global-setup';
|
||||
|
||||
import { goToHome, clearBrowserCache } from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR10 - [On launching the URL opens with a default simple view]', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await goToHome(page);
|
||||
await clearBrowserCache(page);
|
||||
});
|
||||
|
||||
test('should have [Run domain test] label visible', async ({ page }) => {
|
||||
await expect(page.locator('h1', { hasText: 'Check how your domain is doing'})).toBeVisible();
|
||||
});
|
||||
|
||||
test('should have [Options] label visible and NOT selected', async ({ page }) => {
|
||||
await expect(page.locator('#advanced-toggle-label', { hasText: 'Show options' })).toBeVisible();
|
||||
await expect(page.locator('#advanced-toggle')).toHaveAttribute('aria-expanded', 'false');
|
||||
});
|
||||
|
||||
|
||||
test('should have options NOT visible', async ({ page }) => {
|
||||
await expect(page.locator('#advanced-options')).toHaveAttribute('hidden');
|
||||
});
|
||||
});
|
||||
22
zonemaster-gui/e2e/FR11.e2e-spec.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import { test, expect } from './global-setup';
|
||||
import { closeOptions, goToHome, setLang, showOptions } from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR11 - [The simple view should look the same in latest version of different browsers]', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
|
||||
test('should match the domain page', async ({ page }) => {
|
||||
await closeOptions(page);
|
||||
await page.waitForTimeout(400);
|
||||
expect(await page.screenshot()).toMatchSnapshot('domain.png');
|
||||
});
|
||||
|
||||
test('should not match the domain page', async ({ page }) => {
|
||||
await showOptions(page);
|
||||
await page.waitForTimeout(400);
|
||||
expect(await page.screenshot()).toMatchSnapshot('domain-options.png');
|
||||
});
|
||||
});
|
||||
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 87 KiB |
BIN
zonemaster-gui/e2e/FR11.e2e-spec.ts-snapshots/domain-options.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
zonemaster-gui/e2e/FR11.e2e-spec.ts-snapshots/domain.png
Normal file
|
After Width: | Height: | Size: 148 KiB |
22
zonemaster-gui/e2e/FR12.e2e-spec.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import {test, expect} from './global-setup';
|
||||
|
||||
import {goToHome, setLang, showOptions} from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR12 - [The simple view should support an advanced view expanding when the checkbox is enabled]', () => {
|
||||
test.beforeEach(async ({page}) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
|
||||
test('should have [Disable IPv4 checkbox] && [Disable IPv6 checkbox] NOT visible', async ({page}) => {
|
||||
await expect(page.locator('#advanced-options')).toHaveAttribute('hidden');
|
||||
});
|
||||
|
||||
test('should have [IPv4 and IPv6 radio] & [IPv4 only radio] & [IPv6 only radio] visible', async ({page}) => {
|
||||
await showOptions(page);
|
||||
await expect(page.locator('input[name="iptype"][value="both"]')).toBeVisible();
|
||||
await expect(page.locator('input[name="iptype"][value="ipv4"]')).toBeVisible();
|
||||
await expect(page.locator('input[name="iptype"][value="ipv6"]')).toBeVisible();
|
||||
});
|
||||
});
|
||||
36
zonemaster-gui/e2e/FR13.e2e-spec.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import {test, expect} from './global-setup';
|
||||
|
||||
import {goToHome, setLang, showOptions} from './utils/app.utils';
|
||||
|
||||
test.describe.serial('Zonemaster test FR13 - [The advanced view should support the possibility of enabling or disabling IPv4 or IPv6]', () => {
|
||||
test.beforeEach(async ({page}) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
await page.waitForLoadState('networkidle');
|
||||
await showOptions(page);
|
||||
await page.waitForTimeout(400);
|
||||
});
|
||||
|
||||
test('should have [IPv4 and IPv6 radio] & [IPv4 only radio] & [IPv6 only radio] visible and disabled', async ({page}) => {
|
||||
await showOptions(page);
|
||||
await page.waitForTimeout(400);
|
||||
await expect(page.locator('input[name="iptype"][value="both"]')).toBeVisible();
|
||||
await expect(page.locator('input[name="iptype"][value="ipv4"]')).not.toBeChecked();
|
||||
await expect(page.locator('input[name="iptype"][value="ipv6"]')).not.toBeChecked();
|
||||
});
|
||||
|
||||
test('should be possible to enable [IPv4 only radio]', async ({page}) => {
|
||||
await page.locator('input[name="iptype"][value="ipv4"]').click();
|
||||
await expect(page.locator('input[name="iptype"][value="ipv4"]')).toBeChecked();
|
||||
});
|
||||
|
||||
test('should have [IPv6 only radio] visible and disabled', async ({ page }) => {
|
||||
await expect(page.locator('input[name="iptype"][value="ipv6"]')).toBeVisible();
|
||||
await expect(page.locator('input[name="iptype"][value="ipv6"]')).not.toBeChecked();
|
||||
});
|
||||
|
||||
test('should be possible to enable [IPv6 only]', async ({ page }) => {
|
||||
await page.locator('input[name="iptype"][value="ipv6"]').click();
|
||||
await expect(page.locator('input[name="iptype"][value="ipv6"]')).toBeChecked();
|
||||
});
|
||||
});
|
||||
38
zonemaster-gui/e2e/FR16.e2e-spec.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import {test, expect} from './global-setup';
|
||||
|
||||
import {goToHome, mounted, setLang, showOptions} from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR16 - [The advanced view should have a text describing what undelegated means]', () => {
|
||||
test.beforeEach(async ({page}) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
await mounted(page);
|
||||
await showOptions(page);
|
||||
});
|
||||
|
||||
test('should have a link to the proper faq answer', async ({page}) => {
|
||||
await page.waitForTimeout(400);
|
||||
const alert = page.locator('#advanced-options div[role="alert"]');
|
||||
await expect(alert).toBeVisible();
|
||||
await expect(alert.locator('a')).toHaveAttribute('href', '/en/faq/#undelegated');
|
||||
});
|
||||
|
||||
test('should have a description text in multi languages', async ({page}) => {
|
||||
const testSuite = [
|
||||
{lang: 'en', text: 'undelegated'},
|
||||
{lang: 'fr', text: 'non délégué'},
|
||||
{lang: 'sv', text: 'odelegerat'},
|
||||
];
|
||||
|
||||
for (const {lang, text} of testSuite) {
|
||||
await setLang(page, lang);
|
||||
await mounted(page);
|
||||
await showOptions(page);
|
||||
await page.waitForTimeout(400);
|
||||
|
||||
const alert = page.locator('#advanced-options div[role="alert"]');
|
||||
|
||||
await expect(alert.locator('a')).toContainText(text);
|
||||
}
|
||||
});
|
||||
});
|
||||
49
zonemaster-gui/e2e/FR17.e2e-spec.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import {test, expect} from './global-setup';
|
||||
|
||||
import {goToHome, setLang, showOptions} from './utils/app.utils';
|
||||
|
||||
test.describe.serial('Zonemaster test FR17 - [Able to specify delegation parameters]', () => {
|
||||
test.beforeEach(async ({page}) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
await page.waitForLoadState('networkidle');
|
||||
await showOptions(page);
|
||||
await page.waitForTimeout(400);
|
||||
});
|
||||
|
||||
test('should have one ns and digest form', async ({ page }) => {
|
||||
await expect(page.locator('fieldset.zm-domain-test__nameservers')).toHaveCount(1);
|
||||
await expect(page.locator('fieldset.zm-domain-test__records')).toHaveCount(1);
|
||||
await expect(page.locator('input[name="nameservers[0][ns]"]')).toHaveCount(1);
|
||||
await expect(page.locator('input[name="ds_info[0][keytag]"]')).toHaveCount(1);
|
||||
});
|
||||
|
||||
test('should be possible to add new ns form', async ({ page }) => {
|
||||
await page.locator('input[name="nameservers[0][ns]"]').first().focus();
|
||||
|
||||
await page.keyboard.type('ns2.nic.fr');
|
||||
|
||||
await expect(page.locator('input[name="nameservers[1][ns]"]')).toHaveCount(1);
|
||||
await expect(page.locator('input[name="ds_info[1][keytag]"]')).toHaveCount(0);
|
||||
});
|
||||
|
||||
test('should be possible to add new digest form', async ({ page }) => {
|
||||
await page.locator('input[name="ds_info[0][keytag]"]').first().focus();
|
||||
|
||||
await page.keyboard.type('12345');
|
||||
|
||||
await expect(page.locator('input[name="nameservers[1][ns]"]')).toHaveCount(0);
|
||||
await expect(page.locator('input[name="ds_info[1][keytag]"]')).toHaveCount(1);
|
||||
});
|
||||
|
||||
test('should be possible to delete ns forms', async ({ page }) => {
|
||||
await page.locator('input[name="nameservers[0][ns]"]').first().focus();
|
||||
|
||||
await page.keyboard.type('ns2.nic.fr');
|
||||
|
||||
await expect(page.locator('input[name="nameservers[1][ns]"]')).toHaveCount(1);
|
||||
|
||||
await page.locator('fieldset.zm-domain-test__nameserver > div > div > button').first().click();
|
||||
await expect(page.locator('input[name="nameservers[1][ns]"]')).toHaveCount(0);
|
||||
});
|
||||
});
|
||||
22
zonemaster-gui/e2e/FR18.e2e-spec.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import {test, expect} from './global-setup';
|
||||
|
||||
import {goToHome, setLang} from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR18 - [The GUI should be able to run tests by just providing the domain name]', () => {
|
||||
test.beforeEach(async ({page}) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
});
|
||||
|
||||
test('should display progress bar', async ({page}) => {
|
||||
await page.waitForLoadState('networkidle');
|
||||
|
||||
await expect(page.locator('.zm-domain-test__progress-bar')).toHaveCount(0);
|
||||
await page.locator('input[name="domain"]').first().focus();
|
||||
|
||||
await page.keyboard.type('progress.afNiC.Fr');
|
||||
await page.keyboard.press('Enter');
|
||||
|
||||
await expect(page.locator('.zm-domain-test__progress-bar')).toHaveCount(1);
|
||||
});
|
||||
});
|
||||
41
zonemaster-gui/e2e/FR19.e2e-spec.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import {test, expect} from './global-setup';
|
||||
|
||||
import {goToHome, setLang, showOptions} from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR19 - [The GUI should be able to run the test with at least one name server as input]', () => {
|
||||
test.beforeEach(async ({page}) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
await page.waitForLoadState('networkidle');
|
||||
await showOptions(page);
|
||||
});
|
||||
|
||||
test('should NOT display progress bar when we add a NS ip', async ({page}) => {
|
||||
await expect(page.locator('.zm-domain-test__progress-bar')).toHaveCount(0);
|
||||
|
||||
await page.locator('input[name="domain"]').first().focus();
|
||||
await page.keyboard.type('progress.afNiC.Fr');
|
||||
|
||||
await page.locator('input[name="nameservers[0][ip]"]').first().focus();
|
||||
await page.keyboard.type('192.134.4.1');
|
||||
|
||||
await page.keyboard.press('Enter');
|
||||
|
||||
await expect(page.locator('input[name="nameservers[0][ns]"]:invalid')).toHaveCount(1);
|
||||
await expect(page.locator('.zm-domain-test__progress-bar')).toHaveCount(0);
|
||||
});
|
||||
|
||||
test('should display progress bar when we add a NS name', async ({page}) => {
|
||||
await expect(page.locator('.zm-domain-test__progress-bar')).toHaveCount(0);
|
||||
|
||||
await page.locator('input[name="domain"]').first().focus();
|
||||
await page.keyboard.type('progress.afNiC.Fr');
|
||||
|
||||
await page.locator('input[name="nameservers[0][ns]"]').first().focus();
|
||||
await page.keyboard.type('ns1.nic.fr');
|
||||
|
||||
await page.keyboard.press('Enter');
|
||||
|
||||
await expect(page.locator('.zm-domain-test__progress-bar')).toHaveCount(1);
|
||||
});
|
||||
});
|
||||
32
zonemaster-gui/e2e/FR20.e2e-spec.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import {test, expect} from './global-setup';
|
||||
|
||||
import {goToHome, setLang, showOptions} from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR20 - [The user must be able to submit one or more DS record(s) for use with DNSSEC]', () => {
|
||||
test.beforeEach(async ({page}) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
await page.waitForLoadState('networkidle');
|
||||
await showOptions(page);
|
||||
});
|
||||
|
||||
test('should display progress bar when we add a DS entry and launch a test', async ({page}) => {
|
||||
await expect(page.locator('.zm-domain-test__progress-bar')).toHaveCount(0);
|
||||
|
||||
await page.locator('input[name="domain"]').first().focus();
|
||||
|
||||
await page.keyboard.type('progress.afNiC.Fr');
|
||||
|
||||
await page.locator('input[name="ds_info[0][keytag]"]').first().focus();
|
||||
await page.keyboard.type('37610');
|
||||
|
||||
await page.locator('input[name="ds_info[0][digest]"]').first().focus();
|
||||
await page.keyboard.type('d2681e301f632bd76544e6d5b6631a12d97b5479ff07cd24efecd19203c77db3');
|
||||
|
||||
await page.locator('select[name="ds_info[0][algorithm]"]').first().selectOption({ label: '8 - RSASHA256' });
|
||||
await page.locator('select[name="ds_info[0][digtype]"]').first().selectOption({ label: '2 - SHA-256' });
|
||||
|
||||
await page.keyboard.press('Enter');
|
||||
await expect(page.locator('.zm-domain-test__progress-bar')).toHaveCount(1);
|
||||
});
|
||||
});
|
||||
55
zonemaster-gui/e2e/FR21.e2e-spec.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
import { test, expect } from './global-setup';
|
||||
import { goToHome, setLang, setupApiMocks } from './utils/app.utils';
|
||||
import type { Page } from '@playwright/test';
|
||||
|
||||
test.describe.serial('Zonemaster test FR21 - [Able to provide a summarized result of the test being run ' +
|
||||
'(possibility in different colours for error, warning, success etc.)]', () => {
|
||||
|
||||
let page: Page;
|
||||
|
||||
// Keep the same page between tests
|
||||
test.beforeAll(async ({ browser }) => {
|
||||
page = await browser.newPage();
|
||||
await setupApiMocks(page);
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
|
||||
test('should display summary', async () => {
|
||||
await expect(page.locator('.zm-domain-test__progress-bar')).toHaveCount(0);
|
||||
await page.locator('input[name="domain"]').first().focus();
|
||||
|
||||
await page.keyboard.type('results.afNiC.Fr');
|
||||
await page.keyboard.press('Enter');
|
||||
|
||||
await expect(page.locator('.zm-result')).toBeVisible({ timeout: 10000 });
|
||||
|
||||
const messageCountBadges = page.locator('.zm-filter-toggle');
|
||||
const expectedLabels = ['All', 'Info', 'Notice', 'Warning', 'Error', 'Critical'];
|
||||
|
||||
await expect(messageCountBadges).toHaveCount(expectedLabels.length);
|
||||
|
||||
for (const [idx, label] of expectedLabels.entries()) {
|
||||
await expect(messageCountBadges.nth(idx)).toContainText(label);
|
||||
}
|
||||
});
|
||||
|
||||
test('should display number of each level', async () => {
|
||||
await expect(page.locator('.zm-filter-toggle__badge:not(:empty)')).toHaveCount(6);
|
||||
});
|
||||
|
||||
test('should display summary with good colors', async () => {
|
||||
const filterButtons = page.locator('.zm-filter-toggle input[type="checkbox"]');
|
||||
|
||||
for (const idx of [1, 2, 3, 4, 5]) {
|
||||
await filterButtons.nth(idx).click();
|
||||
}
|
||||
|
||||
// wait for .2 second (color transition)
|
||||
await page.waitForTimeout(200);
|
||||
|
||||
|
||||
expect(await page.screenshot()).toMatchSnapshot('results.png');
|
||||
});
|
||||
});
|
||||
|
After Width: | Height: | Size: 102 KiB |
BIN
zonemaster-gui/e2e/FR21.e2e-spec.ts-snapshots/results.png
Normal file
|
After Width: | Height: | Size: 107 KiB |
37
zonemaster-gui/e2e/FR22.e2e-spec.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import { test, expect } from './global-setup';
|
||||
|
||||
import { goToHome, setLang } from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR22 - [Provide the possibility to see more information about encountered errors ' +
|
||||
'within the simple view]', () => {
|
||||
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await goToHome(page);
|
||||
await setLang(page, 'en');
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
|
||||
test('can toggle modules', async ({ page }) => {
|
||||
await expect(page.locator('.zm-domain-test__progress-bar')).toHaveCount(0);
|
||||
await page.locator('input[name="domain"]').first().focus();
|
||||
|
||||
await page.keyboard.type('results.afNiC.Fr');
|
||||
await page.keyboard.press('Enter');
|
||||
|
||||
const basicHeader = page.locator('#zmModule-Basic .zm-result__module__title');
|
||||
const basicHeaderButton = page.locator('#zmModule-Basic .zm-result__module__title button');
|
||||
const basicContent = page.locator('#zmModule-Basic-content');
|
||||
|
||||
await expect(basicHeader).toBeVisible({ timeout: 10000 });
|
||||
await expect(basicHeader).toHaveText(/Basic/i);
|
||||
await expect(basicContent).toHaveCount(0);
|
||||
|
||||
await basicHeaderButton.click();
|
||||
|
||||
await expect(basicContent).toHaveCount(1);
|
||||
|
||||
await basicHeaderButton.click();
|
||||
|
||||
await expect(basicContent).toHaveCount(0);
|
||||
});
|
||||
});
|
||||
29
zonemaster-gui/e2e/FR23.e2e-spec.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { test, expect } from './global-setup';
|
||||
|
||||
import { setLang } from './utils/app.utils';
|
||||
|
||||
|
||||
test.describe('Zonemaster test FR23 - [Provide a list of previous runs for the domain and should be paginated]', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.goto('/');
|
||||
await setLang(page, 'en');
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
|
||||
test('should display previous tests', async ({ page }) => {
|
||||
await page.locator('input[name="domain"]').first().focus();
|
||||
|
||||
await page.keyboard.type('results.afNiC.Fr');
|
||||
await page.keyboard.press('Enter');
|
||||
|
||||
const historyButton = page.locator('#zmHistoryButton');
|
||||
|
||||
await expect(historyButton).toBeVisible({ timeout: 10000 });
|
||||
await expect(historyButton).toHaveText('History');
|
||||
await historyButton.click();
|
||||
await expect(page.locator('#historyDialog')).toBeVisible({ timeout: 10000 });
|
||||
|
||||
await expect(page.locator('#historyDialog li:first-child')).toHaveCount(1);
|
||||
await expect(page.locator('#historyDialog footer')).toHaveCount(1);
|
||||
});
|
||||
});
|
||||
32
zonemaster-gui/e2e/FR25.e2e-spec.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import { test, expect } from './global-setup';
|
||||
|
||||
import { setLang } from './utils/app.utils';
|
||||
|
||||
test.describe('Zonemaster test FR25 - [Should be able to export the result in multiple formats (HTML, CSV, JSON, TEXT)]', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.goto('/');
|
||||
await setLang(page, 'en');
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
|
||||
test('should have an export button', async ({ page }) => {
|
||||
await page.locator('input[name="domain"]').first().focus();
|
||||
|
||||
await page.keyboard.type('results.afNiC.Fr');
|
||||
await page.keyboard.press('Enter');
|
||||
|
||||
const exportButton = page.locator('#zmExportButton');
|
||||
const exportContent = page.locator('#zmExportDialog');
|
||||
|
||||
await expect(exportButton).toBeVisible({ timeout: 10000 });
|
||||
await expect(exportButton).toHaveText('Export');
|
||||
await expect(exportContent).toBeHidden();
|
||||
await exportButton.click();
|
||||
await expect(exportContent).toBeVisible({ timeout: 1000 });
|
||||
|
||||
await expect(page.locator('#zmExportDialog button:nth-child(1)')).toHaveText('JSON');
|
||||
await expect(page.locator('#zmExportDialog button:nth-child(2)')).toHaveText('HTML');
|
||||
await expect(page.locator('#zmExportDialog button:nth-child(3)')).toHaveText('CSV');
|
||||
await expect(page.locator('#zmExportDialog button:nth-child(4)')).toHaveText('Text');
|
||||
});
|
||||
});
|
||||
18
zonemaster-gui/e2e/example.spec.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
test('has title', async ({ page }) => {
|
||||
await page.goto('https://playwright.dev/');
|
||||
|
||||
// Expect a title "to contain" a substring.
|
||||
await expect(page).toHaveTitle(/Playwright/);
|
||||
});
|
||||
|
||||
test('get started link', async ({ page }) => {
|
||||
await page.goto('https://playwright.dev/');
|
||||
|
||||
// Click the get started link.
|
||||
await page.getByRole('link', { name: 'Get started' }).click();
|
||||
|
||||
// Expects page to have a heading with the name of Installation.
|
||||
await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
|
||||
});
|
||||
19
zonemaster-gui/e2e/global-setup.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import { test as base } from '@playwright/test';
|
||||
import { setupApiMocks } from './utils/app.utils';
|
||||
|
||||
/**
|
||||
* Global test setup that runs before each test
|
||||
* - Sets up API mocking to avoid needing a real backend
|
||||
* - Waits for network to be idle before proceeding
|
||||
*/
|
||||
export const test = base.extend({
|
||||
page: async ({ page }, use) => {
|
||||
// Setup API mocks for all tests
|
||||
await setupApiMocks(page);
|
||||
|
||||
// Use the page in the test
|
||||
await use(page);
|
||||
},
|
||||
});
|
||||
|
||||
export { expect } from '@playwright/test';
|
||||
959
zonemaster-gui/e2e/interceptors/mock.interceptor.ts
Normal file
@@ -0,0 +1,959 @@
|
||||
/**
|
||||
* Mock API interceptor for Playwright E2E tests
|
||||
*
|
||||
* This module provides mock responses for API calls to avoid needing a real backend during tests.
|
||||
* Migrated from Angular HttpInterceptor to work with Playwright's route interception.
|
||||
*
|
||||
* Usage in tests:
|
||||
* ```typescript
|
||||
* import { setupApiMocks } from './utils/app.utils';
|
||||
*
|
||||
* test.beforeEach(async ({ page }) => {
|
||||
* await setupApiMocks(page);
|
||||
* await page.goto('/');
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
|
||||
export interface MockEndpoint {
|
||||
url: string;
|
||||
body: any;
|
||||
method: string;
|
||||
json: any;
|
||||
}
|
||||
|
||||
const urls: MockEndpoint[] = [
|
||||
// Version info
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {jsonrpc: '2.0', id: 1643203570632, method:'version_info', params: {}},
|
||||
method: 'POST',
|
||||
json: {jsonrpc: '2.0', id: 1643203570632, result: {zonemaster_engine: 'e2e-test', zonemaster_backend: 'e2e-test', zonemaster_ldns: 'e2e-test'}}
|
||||
},
|
||||
|
||||
// Profile list in option
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {jsonrpc: '2.0', id:1643203351479, method: 'profile_names', params: {}},
|
||||
method: 'POST',
|
||||
json: {jsonrpc: '2.0', id: 1643203351479, result: ["default", "test_profile"]}
|
||||
},
|
||||
|
||||
// FR18 - Should display progress bar
|
||||
// FR26 - Should display progress bar
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {'jsonrpc': '2.0', 'id': 1572254767685, 'method': 'start_domain_test', 'params':
|
||||
{
|
||||
'language':'en', 'domain': 'progress.afNiC.Fr', 'profile': 'default',
|
||||
'nameservers': [], 'ds_info': []
|
||||
}
|
||||
},
|
||||
method: 'POST',
|
||||
json: {'jsonrpc': '2.0', 'id': 1572254767685, 'result': '2005cf23e9fb24b6'}
|
||||
},
|
||||
|
||||
// FR19 - Should display progress bar when we add a NS name
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {'jsonrpc': '2.0', 'id': 1572254767685, 'method': 'start_domain_test', 'params':
|
||||
{
|
||||
'language':'en', 'domain': 'progress.afNiC.Fr', 'profile': 'default',
|
||||
'nameservers': [{"ns": "ns1.nic.fr"}], 'ds_info': []
|
||||
}
|
||||
},
|
||||
method: 'POST',
|
||||
json: {'jsonrpc': '2.0', 'id': 1572254767685, 'result': '2005cf23e9fb24b6'}
|
||||
},
|
||||
|
||||
// FR19 - should NOT display progress bar when we add a NS ip
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {'jsonrpc': '2.0', 'id': 1572254767685, 'method': 'start_domain_test', 'params':
|
||||
{
|
||||
'language':'en', 'domain': 'progress.afNiC.Fr', 'profile': 'default',
|
||||
'nameservers': [{"ns":"", "ip": "192.134.4.1"}], 'ds_info': []
|
||||
}
|
||||
},
|
||||
method: 'POST',
|
||||
json: {
|
||||
"jsonrpc": "2.0",
|
||||
"error": {
|
||||
"message": "Invalid method parameter(s).",
|
||||
"code": "-32602",
|
||||
"data": [
|
||||
{
|
||||
"path": "/nameservers/0/ns",
|
||||
"message": "The domain name character(s) are not supported"
|
||||
}
|
||||
]
|
||||
},
|
||||
"id": 1572254767685
|
||||
}
|
||||
},
|
||||
|
||||
// FR20 - should display progress bar when we add a DS entry and launch a test
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body:{'jsonrpc': '2.0', 'id': 1572277567967, 'method': 'start_domain_test', 'params':
|
||||
{
|
||||
'language':'en', 'domain': 'progress.afNiC.Fr', 'profile': 'default',
|
||||
'nameservers': [], 'ds_info': [{
|
||||
"keytag": 37610,
|
||||
"algorithm":8,
|
||||
"digtype":2,
|
||||
"digest":"d2681e301f632bd76544e6d5b6631a12d97b5479ff07cd24efecd19203c77db3"
|
||||
}]
|
||||
}
|
||||
},
|
||||
method: 'POST',
|
||||
json: {'jsonrpc': '2.0', 'id': 1572277567967, 'result': '2005cf23e9fb24b6'}
|
||||
},
|
||||
|
||||
// FR18 - Should display progress bar
|
||||
// FR19 - Should display progress bar when we add a NS name
|
||||
// FR20 - should display progress bar when we add a DS entry and launch a test
|
||||
// FR26 - Should display progress bar
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {'jsonrpc': '2.0', 'id': 1572254972236, 'method': 'test_progress', 'params': {'test_id': '2005cf23e9fb24b6'}},
|
||||
method: 'POST',
|
||||
json: {'jsonrpc': '2.0', 'id': 1572254972236, 'result': 50}
|
||||
},
|
||||
|
||||
|
||||
// FR21 - Should display summary
|
||||
// FR22 - Should display full messages
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {'jsonrpc': '2.0', 'id': 1572254767685, 'method': 'start_domain_test', 'params':
|
||||
{
|
||||
'language':'en', 'domain': 'results.afNiC.Fr', 'profile': 'default',
|
||||
'nameservers': [], 'ds_info': []
|
||||
}
|
||||
},
|
||||
method: 'POST',
|
||||
json: {'jsonrpc': '2.0', 'id': 1572254767685, 'result': '226f6d4f44ae3f80'}
|
||||
},
|
||||
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {'jsonrpc': '2.0', 'id': 1572254767685, 'method': 'start_domain_test', 'params':
|
||||
{
|
||||
'language':'en', 'domain': 'empty-results.afNiC.Fr', 'profile': 'default',
|
||||
'nameservers': [], 'ds_info': []
|
||||
}
|
||||
},
|
||||
method: 'POST',
|
||||
json: {'jsonrpc': '2.0', 'id': 1572254767685, 'result': 'a0fbcbf6c5ff5842'}
|
||||
},
|
||||
|
||||
// FR21 - Should display summary
|
||||
// FR22 - Should display full messages
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {'jsonrpc': '2.0', 'id': 1572254972236, 'method': 'test_progress', 'params': {'test_id': '226f6d4f44ae3f80'}},
|
||||
method: 'POST',
|
||||
json: {'jsonrpc': '2.0', 'id': 1572254972236, 'result': 100}
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {'jsonrpc': '2.0', 'id': 1572254972236, 'method': 'test_progress', 'params': {'test_id': 'a0fbcbf6c5ff5842'}},
|
||||
method: 'POST',
|
||||
json: {'jsonrpc': '2.0', 'id': 1572254972236, 'result': 100}
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {'jsonrpc': '2.0', 'id': 1572254972327, 'method': 'get_test_results', 'params': {'id': 'a0fbcbf6c5ff5842', 'language': 'en'}},
|
||||
method: 'POST',
|
||||
json: {'jsonrpc': '2.0', 'id': 1572254972327, 'result': {
|
||||
'params': {'profile' : 'default', 'priority': 10, 'ipv6': true, 'ipv4': true, 'client_id': 'Zonemaster GUI',
|
||||
'nameservers': [], 'ds_info': [], 'domain': 'empty-results.afNiC.Fr', 'queue': 0, 'client_version': '3.1.0'
|
||||
}, 'hash_id': 'a0fbcbf6c5ff5842', 'created_at': '2019-10-28T09:29:26Z', 'creation_time': '2019-10-28 09:29:26.288692', 'id': 49640, 'results':[]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
// FR21 - Should display summary
|
||||
// FR22 - Should display full messages
|
||||
|
||||
// FR23 - Should display previous tests
|
||||
// FR24 - Should display previous run link
|
||||
// FR25 - Should have an export button
|
||||
// FR25 - Should open a modal that contains four export possibilities
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {'jsonrpc': '2.0', 'id': 1572254972327, 'method': 'get_test_results', 'params': {'id': '226f6d4f44ae3f80', 'language': 'en'}},
|
||||
method: 'POST',
|
||||
json: {'jsonrpc': '2.0', 'id': 1572254972327, 'result': {
|
||||
'params': {
|
||||
'profile' : 'default',
|
||||
'priority': 10,
|
||||
'ipv6': true,
|
||||
'ipv4': true,
|
||||
'client_id': 'Zonemaster GUI',
|
||||
'nameservers': [],
|
||||
'ds_info': [],
|
||||
'domain': 'results.afNiC.Fr',
|
||||
'queue': 0,
|
||||
'client_version': '3.6.1'
|
||||
},
|
||||
'hash_id': 'efd1dedc98d456bf',
|
||||
'created_at': '2022-11-23T16:38:17Z',
|
||||
'creation_time': '2022-11-23 16:38:17',
|
||||
'id': 49640,
|
||||
"testcase_descriptions": {
|
||||
"CONSISTENCY04": "Name server NS consistency",
|
||||
"ZONE08": "MX is not an alias",
|
||||
"DNSSEC10": "Zone contains NSEC or NSEC3 records",
|
||||
"NAMESERVER07": "To check whether authoritative name servers return an upward referral",
|
||||
"UNSPECIFIED": "UNSPECIFIED",
|
||||
"CONSISTENCY06": "SOA MNAME consistency",
|
||||
"NAMESERVER04": "Same source address",
|
||||
"ZONE10": "No multiple SOA records",
|
||||
"SYNTAX08": "MX name must have a valid hostname",
|
||||
"SYNTAX05": "Misuse of '@' character in the SOA RNAME field",
|
||||
"ZONE05": "SOA 'expire' minimum value",
|
||||
"NAMESERVER08": "Testing QNAME case insensitivity",
|
||||
"CONNECTIVITY03": "AS Diversity",
|
||||
"NAMESERVER02": "Test of EDNS0 support",
|
||||
"NAMESERVER05": "Behaviour against AAAA query",
|
||||
"BASIC01": "The domain must have a parent domain",
|
||||
"SYNTAX01": "No illegal characters in the domain name",
|
||||
"CONSISTENCY01": "SOA serial number consistency",
|
||||
"DELEGATION06": "Existence of SOA",
|
||||
"SYNTAX02": "No hyphen ('-') at the start or end of the domain name",
|
||||
"SYNTAX04": "The NS name must have a valid domain/hostname",
|
||||
"DELEGATION01": "Minimum number of name servers",
|
||||
"ZONE04": "SOA 'retry' at least 1 hour",
|
||||
"CONSISTENCY02": "SOA RNAME consistency",
|
||||
"NAMESERVER03": "Test availability of zone transfer (AXFR)",
|
||||
"ADDRESS01": "Name server address must be globally routable",
|
||||
"CONSISTENCY03": "SOA timers consistency",
|
||||
"DNSSEC15": "Existence of CDS and CDNSKEY",
|
||||
"ADDRESS03": "Reverse DNS entry matches name server name",
|
||||
"NAMESERVER09": "Testing QNAME case sensitivity",
|
||||
"DNSSEC04": "Check for too short or too long RRSIG lifetimes",
|
||||
"DELEGATION02": "Name servers must have distinct IP addresses",
|
||||
"ADDRESS02": "Reverse DNS entry exists for name server IP address",
|
||||
"DELEGATION05": "Name server must not point at CNAME alias",
|
||||
"CONSISTENCY05": "Consistency between glue and authoritative data",
|
||||
"SYNTAX03": "There must be no double hyphen ('--') in position 3 and 4 of the domain name",
|
||||
"ZONE01": "Fully qualified master nameserver in SOA",
|
||||
"ZONE03": "SOA 'retry' lower than 'refresh'",
|
||||
"ZONE09": "MX record present",
|
||||
"ZONE07": "SOA master is not an alias",
|
||||
"DELEGATION07": "Parent glue name records present in child",
|
||||
"SYNTAX07": "No illegal characters in the SOA MNAME field",
|
||||
"DELEGATION04": "Name server is authoritative",
|
||||
"SYNTAX06": "No illegal characters in the SOA RNAME field",
|
||||
"NAMESERVER01": "A name server should not be a recursor",
|
||||
"DELEGATION03": "No truncation of referrals",
|
||||
"DNSSEC05": "Check for invalid DNSKEY algorithms",
|
||||
"ZONE06": "SOA 'minimum' maximum value",
|
||||
"ZONE02": "SOA 'refresh' minimum value",
|
||||
"BASIC02": "The domain must have at least one working name server",
|
||||
"NAMESERVER06": "NS can be resolved"
|
||||
},
|
||||
'results': [
|
||||
{
|
||||
"message": "Using version v4.5.1 of the Zonemaster engine.\n",
|
||||
"module": "SYSTEM",
|
||||
"testcase": "UNSPECIFIED",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"testcase": "BASIC01",
|
||||
"level": "INFO",
|
||||
"module": "Basic",
|
||||
"message": "Parent domain 'fr' was found for the tested domain.\n"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "BASIC02",
|
||||
"message": "Nameserver ns1.nic.fr/192.134.4.1 listed these servers as glue: ns1.nic.fr., ns2.nic.fr., ns3.nic.fr..\n",
|
||||
"module": "BASIC"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "BASIC02",
|
||||
"module": "Basic",
|
||||
"message": "Nameserver ns1.nic.fr/2001:67c:2218:2::4:1 listed these servers as glue: ns1.nic.fr., ns2.nic.fr., ns3.nic.fr..\n"
|
||||
},
|
||||
{
|
||||
"module": "Basic",
|
||||
"message": "Nameserver ns2.nic.fr/192.93.0.4 listed these servers as glue: ns1.nic.fr., ns2.nic.fr., ns3.nic.fr..\n",
|
||||
"testcase": "BASIC02",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "BASIC02",
|
||||
"message": "Nameserver ns2.nic.fr/2001:660:3005:1::1:2 listed these servers as glue: ns1.nic.fr., ns2.nic.fr., ns3.nic.fr..\n",
|
||||
"module": "BASIC"
|
||||
},
|
||||
{
|
||||
"message": "Nameserver ns3.nic.fr/192.134.0.49 listed these servers as glue: ns1.nic.fr., ns2.nic.fr., ns3.nic.fr..\n",
|
||||
"module": "Basic",
|
||||
"testcase": "BASIC02",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"module": "Basic",
|
||||
"message": "Nameserver ns3.nic.fr/2001:660:3006:1::1:1 listed these servers as glue: ns1.nic.fr., ns2.nic.fr., ns3.nic.fr..\n",
|
||||
"level": "INFO",
|
||||
"testcase": "BASIC02"
|
||||
},
|
||||
{
|
||||
"module": "Basic",
|
||||
"message": "Functional nameserver found. \"A\" query for www.afnic.fr test skipped.\n",
|
||||
"testcase": "UNSPECIFIED",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"module": "ADDRESS",
|
||||
"message": "All Nameserver addresses are in the routable public addressing space.\n",
|
||||
"level": "INFO",
|
||||
"testcase": "ADDRESS01"
|
||||
},
|
||||
{
|
||||
"module": "ADDRESS",
|
||||
"message": "Reverse DNS entry exists for each Nameserver IP address.\n",
|
||||
"testcase": "ADDRESS02",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"message": "Every reverse DNS entry matches name server name.\n",
|
||||
"module": "ADDRESS",
|
||||
"testcase": "ADDRESS03",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"module": "CONNECTIVITY",
|
||||
"message": "At least two IPv4 addresses of the authoritative nameservers are announce by different AS sets. A merged list of all AS: (\"2485, \"2486).\n",
|
||||
"testcase": "CONNECTIVITY03",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"module": "CONNECTIVITY",
|
||||
"message": "At least two IPv6 addresses of the authoritative nameservers are announce by different AS sets. A merged list of all AS: (\"2486, \"2485).\n",
|
||||
"level": "INFO",
|
||||
"testcase": "CONNECTIVITY03"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "CONSISTENCY01",
|
||||
"module": "CONSISTENCY",
|
||||
"message": "Saw SOA serial number 2022112200 on following nameserver set : ns1.nic.fr/192.134.4.1; ns1.nic.fr/2001:67c:2218:2::4:1; ns2.nic.fr/192.93.0.4; ns2.nic.fr/2001:660:3005:1::1:2; ns3.nic.fr/192.134.0.49; ns3.nic.fr/2001:660:3006:1::1:1.\n"
|
||||
},
|
||||
{
|
||||
"message": "A single SOA serial number was found (2022112200).\n",
|
||||
"module": "CONSISTENCY",
|
||||
"testcase": "CONSISTENCY01",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"testcase": "CONSISTENCY02",
|
||||
"level": "INFO",
|
||||
"message": "A single SOA rname value was found (hostmaster.nic.fr.).\n",
|
||||
"module": "CONSISTENCY"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "CONSISTENCY03",
|
||||
"module": "CONSISTENCY",
|
||||
"message": "A single SOA time parameter set was seen (REFRESH=7200, RETRY=1800, EXPIRE=2419200, MINIMUM=5400).\n"
|
||||
},
|
||||
{
|
||||
"testcase": "CONSISTENCY04",
|
||||
"level": "INFO",
|
||||
"message": "A single NS set was found (ns1.nic.fr.; ns2.nic.fr.; ns3.nic.fr.).\n",
|
||||
"module": "CONSISTENCY"
|
||||
},
|
||||
{
|
||||
"message": "Glue records are consistent between glue and authoritative data.\n",
|
||||
"module": "CONSISTENCY",
|
||||
"level": "INFO",
|
||||
"testcase": "CONSISTENCY05"
|
||||
},
|
||||
{
|
||||
"message": "A single SOA mname value was seen (dnsmaster.nic.fr.).\n",
|
||||
"module": "CONSISTENCY",
|
||||
"level": "INFO",
|
||||
"testcase": "CONSISTENCY06"
|
||||
},
|
||||
{
|
||||
"module": "DELEGATION",
|
||||
"message": "Parent lists enough (3) nameservers (ns1.nic.fr; ns2.nic.fr; ns3.nic.fr). Lower limit set to 2.\n",
|
||||
"level": "INFO",
|
||||
"testcase": "DELEGATION01"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "DELEGATION01",
|
||||
"message": "Child lists enough (3) nameservers (ns1.nic.fr; ns2.nic.fr; ns3.nic.fr). Lower limit set to 2.\n",
|
||||
"module": "DELEGATION"
|
||||
},
|
||||
{
|
||||
"module": "DELEGATION",
|
||||
"message": "Child lists enough (3) nameservers (ns1.nic.fr; ns2.nic.fr; ns3.nic.fr) that resolve to IPv4 addresses (192.134.0.49; 192.134.4.1; 192.93.0.4). Lower limit set to 2.\n",
|
||||
"testcase": "DELEGATION01",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "DELEGATION01",
|
||||
"module": "DELEGATION",
|
||||
"message": "Child lists enough (3) nameservers (ns1.nic.fr; ns2.nic.fr; ns3.nic.fr) that resolve to IPv6 addresses (2001:660:3005:1::1:2; 2001:660:3006:1::1:1; 2001:67c:2218:2::4:1). Lower limit set to 2.\n"
|
||||
},
|
||||
{
|
||||
"testcase": "DELEGATION01",
|
||||
"level": "INFO",
|
||||
"message": "Delegation lists enough (3) nameservers (ns1.nic.fr; ns2.nic.fr; ns3.nic.fr) that resolve to IPv4 addresses (192.134.0.49; 192.134.4.1; 192.93.0.4). Lower limit set to 2.\n",
|
||||
"module": "DELEGATION"
|
||||
},
|
||||
{
|
||||
"message": "Delegation lists enough (3) nameservers (ns1.nic.fr; ns2.nic.fr; ns3.nic.fr) that resolve to IPv6 addresses (2001:660:3005:1::1:2; 2001:660:3006:1::1:1; 2001:67c:2218:2::4:1). Lower limit set to 2.\n",
|
||||
"module": "DELEGATION",
|
||||
"level": "INFO",
|
||||
"testcase": "DELEGATION01"
|
||||
},
|
||||
{
|
||||
"message": "All the IP addresses used by the nameservers in parent are unique.\n",
|
||||
"module": "DELEGATION",
|
||||
"level": "INFO",
|
||||
"testcase": "DELEGATION02"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "DELEGATION02",
|
||||
"message": "All the IP addresses used by the nameservers in child are unique.\n",
|
||||
"module": "DELEGATION"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "DELEGATION02",
|
||||
"module": "DELEGATION",
|
||||
"message": "All the IP addresses used by the nameservers are unique.\n"
|
||||
},
|
||||
{
|
||||
"testcase": "DELEGATION03",
|
||||
"level": "INFO",
|
||||
"module": "DELEGATION",
|
||||
"message": "The smallest possible legal referral packet is smaller than 513 octets (it is 373).\n"
|
||||
},
|
||||
{
|
||||
"module": "DELEGATION",
|
||||
"message": "All these nameservers are confirmed to be authoritative : ns1.nic.fr; ns2.nic.fr; ns3.nic.fr.\n",
|
||||
"testcase": "DELEGATION04",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"testcase": "DELEGATION05",
|
||||
"level": "INFO",
|
||||
"module": "DELEGATION",
|
||||
"message": "No nameserver points to CNAME alias.\n"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "DELEGATION06",
|
||||
"message": "All the nameservers have SOA record.\n",
|
||||
"module": "DELEGATION"
|
||||
},
|
||||
{
|
||||
"module": "DELEGATION",
|
||||
"message": "All of the nameserver names are listed both at parent and child.\n",
|
||||
"testcase": "DELEGATION07",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"message": "RRSIG with keytag 53080 and covering type(s) DNSKEY expires at : Wed Dec 21 20:36:15 2022.\n",
|
||||
"module": "DNSSEC",
|
||||
"level": "INFO",
|
||||
"testcase": "DNSSEC04"
|
||||
},
|
||||
{
|
||||
"message": "RRSIG with keytag 15756 and covering type(s) SOA expires at : Wed Dec 21 12:48:04 2022.\n",
|
||||
"module": "DNSSEC",
|
||||
"testcase": "DNSSEC04",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"module": "DNSSEC",
|
||||
"message": "The DNSKEY with tag 53080 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n",
|
||||
"testcase": "DNSSEC05",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"testcase": "DNSSEC05",
|
||||
"level": "INFO",
|
||||
"module": "DNSSEC",
|
||||
"message": "The DNSKEY with tag 15756 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n"
|
||||
},
|
||||
{
|
||||
"testcase": "DNSSEC05",
|
||||
"level": "INFO",
|
||||
"module": "DNSSEC",
|
||||
"message": "The DNSKEY with tag 53080 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n"
|
||||
},
|
||||
{
|
||||
"message": "The DNSKEY with tag 15756 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n",
|
||||
"module": "DNSSEC",
|
||||
"testcase": "DNSSEC05",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"message": "The DNSKEY with tag 53080 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n",
|
||||
"module": "DNSSEC",
|
||||
"level": "INFO",
|
||||
"testcase": "DNSSEC05"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "DNSSEC05",
|
||||
"module": "DNSSEC",
|
||||
"message": "The DNSKEY with tag 15756 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "DNSSEC05",
|
||||
"module": "DNSSEC",
|
||||
"message": "The DNSKEY with tag 15756 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n"
|
||||
},
|
||||
{
|
||||
"testcase": "DNSSEC05",
|
||||
"level": "INFO",
|
||||
"message": "The DNSKEY with tag 53080 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n",
|
||||
"module": "DNSSEC"
|
||||
},
|
||||
{
|
||||
"module": "DNSSEC",
|
||||
"message": "The DNSKEY with tag 53080 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n",
|
||||
"testcase": "DNSSEC05",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"testcase": "DNSSEC05",
|
||||
"level": "INFO",
|
||||
"message": "The DNSKEY with tag 15756 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n",
|
||||
"module": "DNSSEC"
|
||||
},
|
||||
{
|
||||
"module": "DNSSEC",
|
||||
"message": "The DNSKEY with tag 53080 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n",
|
||||
"level": "INFO",
|
||||
"testcase": "DNSSEC05"
|
||||
},
|
||||
{
|
||||
"module": "DNSSEC",
|
||||
"message": "The DNSKEY with tag 15756 uses algorithm number 13 (ECDSA Curve P-256 with SHA-256), which is OK.\n",
|
||||
"level": "INFO",
|
||||
"testcase": "DNSSEC05"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "DNSSEC10",
|
||||
"message": "The zone has NSEC3 records. Fetched from the nameservers with IP addresses \"192.134.0.49; 192.134.4.1; 192.93.0.4; 2001:660:3005:1::1:2; 2001:660:3006:1::1:1; 2001:67c:2218:2::4:1\".\n",
|
||||
"module": "DNSSEC"
|
||||
},
|
||||
{
|
||||
"module": "DNSSEC",
|
||||
"message": "No CDS or CDNSKEY RRsets are found on any name server.\n",
|
||||
"testcase": "DNSSEC15",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"message": "Nameserver ns1.nic.fr/192.134.4.1 is not a recursor.\n",
|
||||
"module": "NAMESERVER",
|
||||
"ns": "ns1.nic.fr/192.134.4.1",
|
||||
"testcase": "NAMESERVER01",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"testcase": "NAMESERVER01",
|
||||
"level": "INFO",
|
||||
"ns": "ns1.nic.fr/2001:67c:2218:2::4:1",
|
||||
"module": "NAMESERVER",
|
||||
"message": "Nameserver ns1.nic.fr/2001:67c:2218:2::4:1 is not a recursor.\n"
|
||||
},
|
||||
{
|
||||
"message": "Nameserver ns2.nic.fr/192.93.0.4 is not a recursor.\n",
|
||||
"module": "NAMESERVER",
|
||||
"testcase": "NAMESERVER01",
|
||||
"ns": "ns2.nic.fr/192.93.0.4",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"ns": "ns2.nic.fr/2001:660:3005:1::1:2",
|
||||
"testcase": "NAMESERVER01",
|
||||
"level": "INFO",
|
||||
"module": "NAMESERVER",
|
||||
"message": "Nameserver ns2.nic.fr/2001:660:3005:1::1:2 is not a recursor.\n"
|
||||
},
|
||||
{
|
||||
"module": "NAMESERVER",
|
||||
"message": "Nameserver ns3.nic.fr/192.134.0.49 is not a recursor.\n",
|
||||
"testcase": "NAMESERVER01",
|
||||
"level": "INFO",
|
||||
"ns": "ns3.nic.fr/192.134.0.49"
|
||||
},
|
||||
{
|
||||
"message": "Nameserver ns3.nic.fr/2001:660:3006:1::1:1 is not a recursor.\n",
|
||||
"module": "NAMESERVER",
|
||||
"testcase": "NAMESERVER01",
|
||||
"level": "INFO",
|
||||
"ns": "ns3.nic.fr/2001:660:3006:1::1:1"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "NAMESERVER02",
|
||||
"ns": "All",
|
||||
"message": "The following nameservers support EDNS0 : ns1.nic.fr/2001:67c:2218:2::4:1; ns3.nic.fr/192.134.0.49; ns1.nic.fr/192.134.4.1; ns3.nic.fr/2001:660:3006:1::1:1; ns2.nic.fr/192.93.0.4; ns2.nic.fr/2001:660:3005:1::1:2.\n",
|
||||
"module": "NAMESERVER"
|
||||
},
|
||||
{
|
||||
"module": "NAMESERVER",
|
||||
"message": "AXFR not available on nameserver ns1.nic.fr/192.134.4.1.\n",
|
||||
"testcase": "NAMESERVER03",
|
||||
"level": "INFO",
|
||||
"ns": "ns1.nic.fr/192.134.4.1"
|
||||
},
|
||||
{
|
||||
"ns": "ns1.nic.fr/2001:67c:2218:2::4:1",
|
||||
"testcase": "NAMESERVER03",
|
||||
"level": "INFO",
|
||||
"module": "NAMESERVER",
|
||||
"message": "AXFR not available on nameserver ns1.nic.fr/2001:67c:2218:2::4:1.\n"
|
||||
},
|
||||
{
|
||||
"message": "AXFR not available on nameserver ns2.nic.fr/192.93.0.4.\n",
|
||||
"module": "NAMESERVER",
|
||||
"level": "INFO",
|
||||
"testcase": "NAMESERVER03",
|
||||
"ns": "ns2.nic.fr/192.93.0.4"
|
||||
},
|
||||
{
|
||||
"testcase": "NAMESERVER03",
|
||||
"ns": "ns2.nic.fr/2001:660:3005:1::1:2",
|
||||
"level": "INFO",
|
||||
"message": "AXFR not available on nameserver ns2.nic.fr/2001:660:3005:1::1:2.\n",
|
||||
"module": "NAMESERVER"
|
||||
},
|
||||
{
|
||||
"testcase": "NAMESERVER03",
|
||||
"ns": "ns3.nic.fr/192.134.0.49",
|
||||
"level": "INFO",
|
||||
"module": "NAMESERVER",
|
||||
"message": "AXFR not available on nameserver ns3.nic.fr/192.134.0.49.\n"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "NAMESERVER03",
|
||||
"ns": "ns3.nic.fr/2001:660:3006:1::1:1",
|
||||
"message": "AXFR not available on nameserver ns3.nic.fr/2001:660:3006:1::1:1.\n",
|
||||
"module": "NAMESERVER"
|
||||
},
|
||||
{
|
||||
"testcase": "NAMESERVER04",
|
||||
"ns": "All",
|
||||
"level": "INFO",
|
||||
"message": "All nameservers reply with same IP used to query them.\n",
|
||||
"module": "NAMESERVER"
|
||||
},
|
||||
{
|
||||
"message": "The following nameservers answer AAAA queries without problems : ns3.nic.fr/2001:660:3006:1::1:1; ns1.nic.fr/192.134.4.1; ns3.nic.fr/192.134.0.49; ns1.nic.fr/2001:67c:2218:2::4:1; ns2.nic.fr/192.93.0.4; ns2.nic.fr/2001:660:3005:1::1:2.\n",
|
||||
"module": "NAMESERVER",
|
||||
"level": "INFO",
|
||||
"testcase": "NAMESERVER05",
|
||||
"ns": "All"
|
||||
},
|
||||
{
|
||||
"ns": "All",
|
||||
"testcase": "NAMESERVER06",
|
||||
"level": "INFO",
|
||||
"message": "All nameservers succeeded to resolve to an IP address.\n",
|
||||
"module": "NAMESERVER"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "NAMESERVER07",
|
||||
"ns": "All",
|
||||
"module": "NAMESERVER",
|
||||
"message": "None of the following nameservers returns an upward referral : ns1.nic.fr; ns2.nic.fr; ns3.nic.fr.\n"
|
||||
},
|
||||
{
|
||||
"testcase": "NAMESERVER08",
|
||||
"level": "INFO",
|
||||
"ns": "ns1.nic.fr/192.134.4.1",
|
||||
"message": "Nameserver ns1.nic.fr/192.134.4.1 preserves original case of queried names (WwW.afNiC.fr).\n",
|
||||
"module": "NAMESERVER"
|
||||
},
|
||||
{
|
||||
"testcase": "NAMESERVER08",
|
||||
"ns": "ns1.nic.fr/2001:67c:2218:2::4:1",
|
||||
"level": "INFO",
|
||||
"message": "Nameserver ns1.nic.fr/2001:67c:2218:2::4:1 preserves original case of queried names (WwW.afNiC.fr).\n",
|
||||
"module": "NAMESERVER"
|
||||
},
|
||||
{
|
||||
"module": "NAMESERVER",
|
||||
"message": "Nameserver ns2.nic.fr/192.93.0.4 preserves original case of queried names (WwW.afNiC.fr).\n",
|
||||
"level": "INFO",
|
||||
"testcase": "NAMESERVER08",
|
||||
"ns": "ns2.nic.fr/192.93.0.4"
|
||||
},
|
||||
{
|
||||
"message": "Nameserver ns2.nic.fr/2001:660:3005:1::1:2 preserves original case of queried names (WwW.afNiC.fr).\n",
|
||||
"module": "NAMESERVER",
|
||||
"level": "INFO",
|
||||
"testcase": "NAMESERVER08",
|
||||
"ns": "ns2.nic.fr/2001:660:3005:1::1:2"
|
||||
},
|
||||
{
|
||||
"testcase": "NAMESERVER08",
|
||||
"ns": "ns3.nic.fr/192.134.0.49",
|
||||
"level": "INFO",
|
||||
"module": "NAMESERVER",
|
||||
"message": "Nameserver ns3.nic.fr/192.134.0.49 preserves original case of queried names (WwW.afNiC.fr).\n"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "NAMESERVER08",
|
||||
"ns": "ns3.nic.fr/2001:660:3006:1::1:1",
|
||||
"message": "Nameserver ns3.nic.fr/2001:660:3006:1::1:1 preserves original case of queried names (WwW.afNiC.fr).\n",
|
||||
"module": "NAMESERVER"
|
||||
},
|
||||
{
|
||||
"ns": "All",
|
||||
"testcase": "NAMESERVER09",
|
||||
"level": "INFO",
|
||||
"message": "When asked for SOA records on \"www.afnic.fr\" with different cases, all servers reply consistently.\n",
|
||||
"module": "NAMESERVER"
|
||||
},
|
||||
{
|
||||
"module": "SYNTAX",
|
||||
"message": "No illegal characters in the domain name (afnic.fr).\n",
|
||||
"level": "INFO",
|
||||
"testcase": "SYNTAX01"
|
||||
},
|
||||
{
|
||||
"message": "Neither end of any label in the domain name (afnic.fr) has a hyphen.\n",
|
||||
"module": "SYNTAX",
|
||||
"level": "INFO",
|
||||
"testcase": "SYNTAX02"
|
||||
},
|
||||
{
|
||||
"message": "Domain name (afnic.fr) has no label with a double hyphen ('--') in position 3 and 4 (with a prefix which is not 'xn--').\n",
|
||||
"module": "SYNTAX",
|
||||
"testcase": "SYNTAX03",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"testcase": "SYNTAX04",
|
||||
"level": "INFO",
|
||||
"module": "SYNTAX",
|
||||
"message": "Nameserver (ns1.nic.fr) syntax is valid.\n"
|
||||
},
|
||||
{
|
||||
"testcase": "SYNTAX04",
|
||||
"level": "INFO",
|
||||
"message": "Nameserver (ns2.nic.fr) syntax is valid.\n",
|
||||
"module": "SYNTAX"
|
||||
},
|
||||
{
|
||||
"module": "SYNTAX",
|
||||
"message": "Nameserver (ns3.nic.fr) syntax is valid.\n",
|
||||
"testcase": "SYNTAX04",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"module": "SYNTAX",
|
||||
"message": "There is no misused '@' character in the SOA RNAME field (hostmaster.nic.fr.).\n",
|
||||
"level": "INFO",
|
||||
"testcase": "SYNTAX05"
|
||||
},
|
||||
{
|
||||
"message": "The SOA RNAME field (hostmaster@nic.fr) is compliant with RFC2822.\n",
|
||||
"module": "SYNTAX",
|
||||
"level": "INFO",
|
||||
"testcase": "SYNTAX06"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "SYNTAX07",
|
||||
"message": "SOA MNAME (dnsmaster.nic.fr) syntax is valid.\n",
|
||||
"module": "SYNTAX"
|
||||
},
|
||||
{
|
||||
"testcase": "SYNTAX08",
|
||||
"level": "INFO",
|
||||
"module": "SYNTAX",
|
||||
"message": "Domain name MX (mx4.nic.fr) syntax is valid.\n"
|
||||
},
|
||||
{
|
||||
"testcase": "SYNTAX08",
|
||||
"level": "INFO",
|
||||
"message": "Domain name MX (mx5.nic.fr) syntax is valid.\n",
|
||||
"module": "SYNTAX"
|
||||
},
|
||||
{
|
||||
"message": "SOA 'mname' nameserver dnsmaster.nic.fr/192.134.4.2 does not respond.\n",
|
||||
"module": "ZONE",
|
||||
"level": "NOTICE",
|
||||
"testcase": "ZONE01"
|
||||
},
|
||||
{
|
||||
"testcase": "ZONE01",
|
||||
"level": "NOTICE",
|
||||
"message": "SOA 'mname' nameserver (dnsmaster.nic.fr) is not listed in \"parent\" NS records for tested zone (ns1.nic.fr; ns2.nic.fr; ns3.nic.fr).\n",
|
||||
"module": "ZONE"
|
||||
},
|
||||
{
|
||||
"module": "ZONE",
|
||||
"message": "SOA 'refresh' value (7200) is less than the recommended one (14400).\n",
|
||||
"level": "NOTICE",
|
||||
"testcase": "ZONE02"
|
||||
},
|
||||
{
|
||||
"testcase": "ZONE03",
|
||||
"level": "INFO",
|
||||
"message": "SOA 'refresh' value (7200) is higher than the SOA 'retry' value (1800).\n",
|
||||
"module": "ZONE"
|
||||
},
|
||||
{
|
||||
"testcase": "ZONE04",
|
||||
"level": "NOTICE",
|
||||
"module": "ZONE",
|
||||
"message": "SOA 'retry' value (1800) is less than the recommended one (3600).\n"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "ZONE05",
|
||||
"message": "SOA 'expire' value (2419200) is higher than the minimum recommended value (604800) and not lower than the 'refresh' value (7200).\n",
|
||||
"module": "ZONE"
|
||||
},
|
||||
{
|
||||
"module": "ZONE",
|
||||
"message": "SOA 'minimum' value (5400) is between the recommended ones (300/86400).\n",
|
||||
"testcase": "ZONE06",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"testcase": "ZONE07",
|
||||
"level": "INFO",
|
||||
"module": "ZONE",
|
||||
"message": "SOA 'mname' value (dnsmaster.nic.fr) refers to a NS which is not an alias (CNAME).\n"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "ZONE07",
|
||||
"module": "ZONE",
|
||||
"message": "SOA 'mname' value (dnsmaster.nic.fr) refers to a NS which is not an alias (CNAME).\n"
|
||||
},
|
||||
{
|
||||
"level": "INFO",
|
||||
"testcase": "ZONE08",
|
||||
"module": "ZONE",
|
||||
"message": "MX record for the domain is not pointing to a CNAME.\n"
|
||||
},
|
||||
{
|
||||
"testcase": "ZONE08",
|
||||
"level": "INFO",
|
||||
"message": "MX record for the domain is not pointing to a CNAME.\n",
|
||||
"module": "ZONE"
|
||||
},
|
||||
{
|
||||
"module": "ZONE",
|
||||
"message": "Mail targets in the MX RRset \"mx5.nic.fr.; mx4.nic.fr.\" returned from name servers \"2001:660:3006:1::1:1; 2001:67c:2218:2::4:1; 192.134.4.1; 2001:660:3005:1::1:2; 192.93.0.4; 192.134.0.49\".\n",
|
||||
"testcase": "ZONE09",
|
||||
"level": "INFO"
|
||||
},
|
||||
{
|
||||
"module": "ZONE",
|
||||
"message": "A unique SOA record is returned by all nameservers of the zone.\n",
|
||||
"level": "INFO",
|
||||
"testcase": "ZONE10"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// FR23 - Should display previous tests
|
||||
// FR24 - Should display previous run link
|
||||
// FR25 - Should have an export button
|
||||
// FR25 - Should open a modal that contains four export possibilities
|
||||
{
|
||||
url: 'http://localhost:4321/api',
|
||||
body: {'jsonrpc': '2.0', 'id': 1572271917712, 'method': 'get_test_history', 'params': {'offset': 0, 'limit': 100, 'filter': 'all', 'frontend_params': {'domain': 'results.afNiC.Fr'}}},
|
||||
method: 'POST',
|
||||
json: {'jsonrpc': '2.0', 'id': 1572271917712, 'result': [
|
||||
{'overall_result': 'error', 'created_at': '2019-10-28T09:24:57Z', 'creation_time': '2019-10-28 09:42:42.432378', 'id': '293f626579274f18'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-28T09:24:57Z', 'creation_time': '2019-10-28 09:24:57.395431', 'id': '84bfac6ae74d0e62'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-24T07:49:48Z', 'creation_time': '2019-10-24 07:49:48.079617', 'id': 'efe0931716b0068c'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-24T07:49:16Z', 'creation_time': '2019-10-24 07:49:16.271481', 'id': '46acbdcbc456db1d'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-24T07:35:52Z', 'creation_time': '2019-10-24 07:35:52.819536', 'id': 'fd5b10ae1a46ce5e'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-24T07:35:21Z', 'creation_time': '2019-10-24 07:35:21.309154', 'id': '1b29b0582a99d7ab'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-24T06:51:22Z', 'creation_time': '2019-10-24 06:51:22.373411', 'id': '8c4829b7f60edc25'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-24T06:50:50Z', 'creation_time': '2019-10-24 06:50:50.801272', 'id': '9b89a0988dbccfdb'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-24T06:39:37Z', 'creation_time': '2019-10-24 06:39:37.48699', 'id': '89c662ddd43a8b03'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-24T06:39:05Z', 'creation_time': '2019-10-24 06:39:05.851497', 'id': '2add42a68594b37a'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T20:59:41Z', 'creation_time': '2019-10-23 20:59:41.594768', 'id': 'c334d7eb96af1d19'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T20:55:13Z', 'creation_time': '2019-10-23 20:55:13.205118', 'id': 'b4146c79de8b3638'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T20:46:06Z', 'creation_time': '2019-10-23 20:46:06.989113', 'id': '226f6d4f44ae3f80'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T20:40:46Z', 'creation_time': '2019-10-23 20:40:46.272244', 'id': 'a509e33a41f28322'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T20:34:21Z', 'creation_time': '2019-10-23 20:34:21.681947', 'id': '5d41c57fa24c76f5'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T20:28:25Z', 'creation_time': '2019-10-23 20:28:25.518303', 'id': '298b4c53d5024f44'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T20:16:39Z', 'creation_time': '2019-10-23 20:16:39.466781', 'id': 'f9c587426b885036'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T19:41:31Z', 'creation_time': '2019-10-23 19:41:31.048622', 'id': 'bb2109eb54d9ef58'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T16:20:56Z', 'creation_time': '2019-10-23 16:20:56.180064', 'id': '3ff7e65752a431e8'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T15:37:05Z', 'creation_time': '2019-10-23 15:37:05.935049', 'id': 'e8a3507cce49392d'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T15:25:35Z', 'creation_time': '2019-10-23 15:25:35.162808', 'id': '19f7773777cdad1a'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T15:09:54Z', 'creation_time': '2019-10-23 15:09:54.801371', 'id': '61907eb87c8bb1d9'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T14:52:56Z', 'creation_time': '2019-10-23 14:52:56.823486', 'id': '497ce5549e80d6d1'},
|
||||
{'overall_result': 'ok', 'created_at': '2019-10-23T14:39:25Z', 'creation_time': '2019-10-23 14:39:25.259204', 'id': '470e62da84dcbd16'},
|
||||
{'overall_result': 'error', 'created_at': '2019-10-23T14:26:35Z', 'creation_time': '2019-10-23 14:26:35.853106', 'id': '9b8e25c35dc365ac'}
|
||||
]}
|
||||
},
|
||||
];
|
||||
|
||||
/**
|
||||
* Find a matching mock response for the given request
|
||||
*/
|
||||
export function findMockResponse(url: string, method: string, body: any): any | null {
|
||||
for (const element of urls) {
|
||||
// Don't compare client info
|
||||
const requestParams = { ...body?.params };
|
||||
delete requestParams['client_version'];
|
||||
delete requestParams['client_id'];
|
||||
|
||||
// Match URL by checking if both end with /api (ignore hostname and port differences)
|
||||
const urlMatch = url.endsWith('/api') && element.url.endsWith('/api');
|
||||
const methodMatch = method === element.method;
|
||||
const bodyMethodMatch = body?.method === element.body.method;
|
||||
|
||||
// For params matching, check if request params contain all mock params' required fields
|
||||
let paramsMatch = false;
|
||||
if (bodyMethodMatch && element.body.params) {
|
||||
// Check if key fields match (domain, language, etc.)
|
||||
// For start_domain_test, we primarily care about domain matching
|
||||
if (element.body.method === 'start_domain_test') {
|
||||
paramsMatch = requestParams.domain === element.body.params.domain &&
|
||||
requestParams.language === element.body.params.language;
|
||||
} else {
|
||||
// For other methods, do exact match
|
||||
paramsMatch = JSON.stringify(requestParams) === JSON.stringify(element.body.params);
|
||||
}
|
||||
}
|
||||
|
||||
if (urlMatch && methodMatch && bodyMethodMatch && paramsMatch) {
|
||||
return element.json;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
92
zonemaster-gui/e2e/utils/app.utils.ts
Normal file
@@ -0,0 +1,92 @@
|
||||
import { expect, type Page } from "@playwright/test";
|
||||
import { findMockResponse } from "../interceptors/mock.interceptor";
|
||||
|
||||
export function goToHome(page: Page) {
|
||||
return page.goto('/');
|
||||
}
|
||||
|
||||
export async function mounted(page: Page) {
|
||||
await expect(page.locator('body')).toHaveAttribute('data-domain-test-hydrated', 'true');
|
||||
}
|
||||
|
||||
export async function setupApiMocks(page: Page) {
|
||||
// Match any URL ending with /api
|
||||
await page.route(/\/api$/, async (route) => {
|
||||
const request = route.request();
|
||||
const method = request.method();
|
||||
const url = request.url();
|
||||
|
||||
let body;
|
||||
try {
|
||||
body = request.postDataJSON();
|
||||
} catch (e) {
|
||||
body = null;
|
||||
}
|
||||
|
||||
const mockResponse = findMockResponse(url, method, body);
|
||||
|
||||
if (mockResponse) {
|
||||
await route.fulfill({
|
||||
status: 200,
|
||||
contentType: 'application/json',
|
||||
body: JSON.stringify(mockResponse),
|
||||
});
|
||||
} else {
|
||||
console.log('⚠️ No mock found for request:', { method: body?.method, params: body?.params });
|
||||
// If no mock is found, continue with the actual request
|
||||
await route.continue();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function setLang(page: Page, lang: string) {
|
||||
return Promise.all([
|
||||
page.waitForSelector('select#languageSwitcher'),
|
||||
page.locator('select#languageSwitcher').selectOption(lang),
|
||||
]);
|
||||
}
|
||||
|
||||
export async function closeOptions(page: Page) {
|
||||
const toggle = page.locator('#advanced-toggle');
|
||||
const panel = page.locator('#advanced-options');
|
||||
|
||||
// Ensure the toggle is visible/ready
|
||||
await expect(toggle).toBeVisible();
|
||||
|
||||
// If it's currently open, close it
|
||||
if (await toggle.getAttribute('aria-expanded') === 'true') {
|
||||
await toggle.click();
|
||||
}
|
||||
|
||||
// Confirm it's actually closed
|
||||
await expect(toggle).toHaveAttribute('aria-expanded', 'false');
|
||||
|
||||
// Wait for the panel to be hidden / detached
|
||||
await panel.waitFor({ state: 'hidden' });
|
||||
}
|
||||
|
||||
export async function showOptions(page: Page) {
|
||||
const toggle = page.locator('#advanced-toggle');
|
||||
|
||||
// Wait for toggle to be ready
|
||||
await expect(toggle).toBeVisible();
|
||||
|
||||
// Click if not already open
|
||||
if (await toggle.getAttribute('aria-expanded') !== 'true') {
|
||||
await toggle.click();
|
||||
}
|
||||
|
||||
// Ensure it's REALLY open
|
||||
await expect(toggle).toHaveAttribute('aria-expanded', 'true');
|
||||
|
||||
// Wait for the content you're about to use
|
||||
await page.locator('#advanced-options').waitFor({ state: 'visible' });
|
||||
}
|
||||
|
||||
export function clearBrowserCache(page: Page) {
|
||||
return Promise.all([
|
||||
page.evaluate(() => window.localStorage.clear()),
|
||||
page.evaluate(() => window.sessionStorage.clear()),
|
||||
page.context().clearCookies(),
|
||||
])
|
||||
}
|
||||
86
zonemaster-gui/messages/da.json
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"startTestNav": "Kør test",
|
||||
"faqNav": "FAQ",
|
||||
"welcome": "Velkommen til Zonemaster",
|
||||
"startTestTitle": "Tjek, hvordan dit domæne klarer sig",
|
||||
"runTestTitle": "Test dit domæne",
|
||||
"faqTitle": "Ofte stillede spørgsmål",
|
||||
"resultTitle": "Testresultat",
|
||||
"langLabel": "Skift sprog",
|
||||
"startTestBtn": "Kør test",
|
||||
"runningTest": "Kører test...",
|
||||
"menu": "Menu",
|
||||
"close": "Luk",
|
||||
"domain": "Domæne",
|
||||
"domainName": "Domænenavn",
|
||||
"showOptions": "Vis indstillinger",
|
||||
"hideOptions": "Skjul indstillinger",
|
||||
"noticeHeading": "Bemærk! Mere info om ikke-delegeret test",
|
||||
"noticeLink": "/da/faq/#undelegated",
|
||||
"noticeText": "Hvad er en ikke-delegeret domænetest?",
|
||||
"nameServers": "Navneservere",
|
||||
"nameserver": "Navneserver {index}",
|
||||
"deleteNameserver": "Slet navneserver {index}",
|
||||
"name": "Navn",
|
||||
"addressOptional": "Adresse (valgfrit)",
|
||||
"fetchNameservers": "Hent navneservere fra forældrezone",
|
||||
"noNameservers": "Ingen navneservere fundet i forældrezone",
|
||||
"fetching": "Henter...",
|
||||
"DSRecords": "DS-poster",
|
||||
"dsRecord": "DS-post {index}",
|
||||
"deleteDSRecord": "Slet DS-post {index}",
|
||||
"fetchDSRecords": "Hent DS fra forældrezone",
|
||||
"noDSRecords": "Ingen DS-poster fundet i forældrezone",
|
||||
"keytag": "Keytag",
|
||||
"algorithm": "Algoritme",
|
||||
"digestType": "Digesttype",
|
||||
"digest": "Digest",
|
||||
"deleteRow": "Slet række",
|
||||
"general": "Generelt",
|
||||
"disable": "Deaktiver",
|
||||
"only": "kun",
|
||||
"ipv4AndIpv6": "IPv4 og IPv6",
|
||||
"resetForm": "Nulstil formularen",
|
||||
"programVersions": "Programversioner",
|
||||
"sourceCode": "Kildekode",
|
||||
"documentation": "Dokumentation",
|
||||
"copyright": "Ophavsret © AFNIC og The Swedish Internet Foundation. Alle rettigheder forbeholdes",
|
||||
"infoHeading1": "Hvad er Zonemaster?",
|
||||
"infoPreamble": "Giv dit domænenavn en fuldstændig undersøgelse! Zonemaster hjælper dig med at vurdere, hvordan dit domænenavn klarer sig.",
|
||||
"infoTextParagraph1": "Når et domænenavn sendes til Zonemaster til test, undersøger Zonemaster tilstanden af domænenavnet fra toppen til bunden af DNS-træet. Dette gøres normalt ved at undersøge DNS-data fra roden, '.', til Top-Level Domain (TLD) for det pågældende domænenavn, som f.eks. '.net', og derefter endelig gennem DNS-servere, der indeholder autoritative oplysninger om det angivne domænenavn.",
|
||||
"infoTextStrong": "Zonemaster udfører mange tests,",
|
||||
"infoTextParagraph2": "som f.eks. at kontrollere DNSSEC-signaturer, eller at forskellige værter kan få adgang, og at IP-adresser er gyldige. Alt dette for at sikre, at dit domænenavn fungerer så glat som muligt.",
|
||||
"infoHeading2": "Et ord om DNS",
|
||||
"infoTextParagraph3": "Domain Name System (DNS) er en database, der forbinder domænenavne til Internet Protocol (IP)-adresser, på samme måde som en telefonbog forbinder navne til telefonnumre. En IP-adresse er en unik række tal, der identificerer hver computer, der er forbundet til internettet. Det er ligesom måden, hvorpå hvert telefon har sit eget nummer i telefonnettet. Sådanne lange rækker af tal fungerer fint for computere, men for mennesker er det meget sværere at huske. Derfor er DNS blevet udviklet som et ekstra lag til at kortlægge mellem navne, som vi kan huske bedre, og IP-adresser, som computere bruger hver gang, vi vil nå en bestemt hjemmeside eller bruge andre tjenester på internettet, som f.eks. e-mail.",
|
||||
"img1Alt": "Person, der ser på en computer",
|
||||
"img2Alt": "Verden forbundet af et netværk",
|
||||
"faqPreamble": "Find svar på almindelige spørgsmål om Zonemaster her.",
|
||||
"faqTextParagraph1": "Du finder stadig ikke de oplysninger, du leder efter? Du kan kontakte Zonemaster-projektteamet ved hjælp af",
|
||||
"faqParagraph1Link": "brugermailinglisten, problemsporet eller kontakt-e-mailadressen.",
|
||||
"history": "Historie",
|
||||
"testHistory": "Testhistorie",
|
||||
"undelegated": "Ikke-delegeret",
|
||||
"delegated": "Delegeret",
|
||||
"historyAll": "Alle",
|
||||
"all": "Alle",
|
||||
"info": "Info",
|
||||
"notice": "Bemærk",
|
||||
"warning": "Advarsel",
|
||||
"error": "Fejl",
|
||||
"critical": "Kritisk",
|
||||
"expandAll": "Udvid alle moduler",
|
||||
"collapseAll": "Fold alle moduler sammen",
|
||||
"search": "Søg",
|
||||
"searchInText": "Søg tekst i beskeder",
|
||||
"testResultFor": "Testresultat for",
|
||||
"createdOn": "Oprettet den",
|
||||
"filterSeverityLevels": "Filtrer sværhedsgrader",
|
||||
"profile": "Profil",
|
||||
"tldURL": "TLD-URL",
|
||||
"exportResult": "Eksportér",
|
||||
"exportJson": "JSON",
|
||||
"exportHtml": "HTML",
|
||||
"exportCsv": "CSV",
|
||||
"exportText": "Tekst",
|
||||
"share": "Del"
|
||||
}
|
||||
86
zonemaster-gui/messages/en.json
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"startTestNav": "Start test",
|
||||
"faqNav": "FAQ",
|
||||
"welcome": "Welcome to Zonemaster",
|
||||
"startTestTitle": "Check how your domain is doing",
|
||||
"runTestTitle": "Test your domain",
|
||||
"faqTitle": "Frequently Asked Questions",
|
||||
"resultTitle": "Test result",
|
||||
"langLabel": "Change language",
|
||||
"startTestBtn": "Run test",
|
||||
"runningTest": "Running test...",
|
||||
"menu": "Menu",
|
||||
"close": "Close",
|
||||
"domain": "Domain",
|
||||
"domainName": "Domain name",
|
||||
"showOptions": "Show options",
|
||||
"hideOptions": "Hide options",
|
||||
"noticeHeading": "Notice! More info on undelegated test",
|
||||
"noticeLink": "/en/faq/#undelegated",
|
||||
"noticeText": "What is an undelegated domain test?",
|
||||
"nameServers": "Nameservers",
|
||||
"nameserver": "Nameserver {index}",
|
||||
"deleteNameserver": "Delete nameserver {index}",
|
||||
"name": "Name",
|
||||
"addressOptional": "Address (optional)",
|
||||
"fetchNameservers": "Fetch nameservers from parent zone",
|
||||
"noNameservers": "No nameservers found in parent zone",
|
||||
"fetching": "Fetching...",
|
||||
"DSRecords": "DS records",
|
||||
"dsRecord": "DS record {index}",
|
||||
"deleteDSRecord": "Delete DS record {index}",
|
||||
"fetchDSRecords": "Fetch DS from parent zone",
|
||||
"noDSRecords": "No DS records found in parent zone",
|
||||
"keytag": "Keytag",
|
||||
"algorithm": "Algorithm",
|
||||
"digestType": "Digest type",
|
||||
"digest": "Digest",
|
||||
"deleteRow": "Delete row",
|
||||
"general": "General",
|
||||
"disable": "Disable",
|
||||
"only": "only",
|
||||
"ipv4AndIpv6": "IPv4 and IPv6",
|
||||
"resetForm": "Reset the form",
|
||||
"programVersions": "Program versions",
|
||||
"sourceCode": "Source code",
|
||||
"documentation": "Documentation",
|
||||
"copyright": "Copyright © AFNIC and The Swedish Internet Foundation. All Rights Reserved",
|
||||
"infoHeading1": "What is Zonemaster?",
|
||||
"infoPreamble": "Give your domain name a complete checkup! Zonemaster helps you assess how your domain name is doing.",
|
||||
"infoTextParagraph1": "When a domain name is sent to Zonemaster for testing, Zonemaster investigates the state of the domain name from the top to the bottom of the DNS tree. This is usually done by examining DNS data from the root, '.', to the Top-Level Domain (TLD) for that domain name, like '.net', and then finally through the DNS servers that contain authoritative information about the specified domain name.",
|
||||
"infoTextStrong": "Zonemaster performs many tests,",
|
||||
"infoTextParagraph2": "such as checking DNSSEC signatures, or that different hosts can be accessed and that IP addresses are valid. This is all to make sure that your domain name runs as smoothly as possible.",
|
||||
"infoHeading2": "A word about the DNS",
|
||||
"infoTextParagraph3": "The Domain Name System (DNS) is a database that associates domain names to Internet Protocol (IP) addresses, the same way a phone book associates names to phone numbers. An IP address is a unique series of numbers that identifies every computer that is connected to the Internet. It is similar to the way every telephone has its own number in the telephone network. Such long series of numbers work fine for computers, but for people it is way more difficult to memorize. Thus, the DNS has been developed as an extra layer to map between names that we can remember better and IP addresses used by computers whenever we want to reach a specific website or use other services on the Internet, like e-mail.",
|
||||
"img1Alt": "Person looking at computer",
|
||||
"img2Alt": "The world connected by a network",
|
||||
"faqPreamble": "Find answers to common questions about Zonemaster here.",
|
||||
"faqTextParagraph1": "You still don't find the information you are looking for? You can contact the Zonemaster project team using the",
|
||||
"faqParagraph1Link": "user mailing list, the issue tracker or the contact e-mail address.",
|
||||
"history": "History",
|
||||
"testHistory": "Test history",
|
||||
"undelegated": "Undelegated",
|
||||
"delegated": "Delegated",
|
||||
"historyAll": "All",
|
||||
"all": "All",
|
||||
"info": "Info",
|
||||
"notice": "Notice",
|
||||
"warning": "Warning",
|
||||
"error": "Error",
|
||||
"critical": "Critical",
|
||||
"expandAll": "Expand all modules",
|
||||
"collapseAll": "Collapse all modules",
|
||||
"search": "Search",
|
||||
"searchInText": "Search text in messages",
|
||||
"testResultFor": "Test result for",
|
||||
"createdOn": "Created on",
|
||||
"filterSeverityLevels": "Filter severity levels",
|
||||
"profile": "Profile",
|
||||
"tldURL": "TLD URL",
|
||||
"exportResult": "Export",
|
||||
"exportJson": "JSON",
|
||||
"exportHtml": "HTML",
|
||||
"exportCsv": "CSV",
|
||||
"exportText": "Text",
|
||||
"share": "Share"
|
||||
}
|
||||
86
zonemaster-gui/messages/es.json
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"startTestNav": "Iniciar prueba",
|
||||
"faqNav": "Preguntas frecuentes",
|
||||
"welcome": "Bienvenido a Zonemaster",
|
||||
"startTestTitle": "Comprueba cómo está tu dominio",
|
||||
"runTestTitle": "Prueba tu dominio",
|
||||
"faqTitle": "Preguntas Frecuentes",
|
||||
"resultTitle": "Resultado de la prueba",
|
||||
"langLabel": "Cambiar idioma",
|
||||
"startTestBtn": "Ejecutar prueba",
|
||||
"runningTest": "Ejecutando prueba...",
|
||||
"menu": "Menú",
|
||||
"close": "Cerrar",
|
||||
"domain": "Dominio",
|
||||
"domainName": "Nombre de dominio",
|
||||
"showOptions": "Mostrar opciones",
|
||||
"hideOptions": "Ocultar opciones",
|
||||
"noticeHeading": "¡Atención! Más información sobre la prueba no delegada",
|
||||
"noticeLink": "/es/faq/#undelegated",
|
||||
"noticeText": "¿Qué es una prueba de dominio no delegado?",
|
||||
"nameServers": "Servidores de nombres",
|
||||
"nameserver": "Servidor de nombres {index}",
|
||||
"deleteNameserver": "Eliminar servidor de nombres {index}",
|
||||
"name": "Nombre",
|
||||
"addressOptional": "Dirección (opcional)",
|
||||
"fetchNameservers": "Obtener servidores de nombres del dominio padre",
|
||||
"noNameservers": "No se encontraron servidores de nombres en el dominio padre",
|
||||
"fetching": "Obteniendo...",
|
||||
"DSRecords": "Registros DS",
|
||||
"dsRecord": "Registro DS {index}",
|
||||
"deleteDSRecord": "Eliminar registro DS {index}",
|
||||
"fetchDSRecords": "Obtener DS del dominio padre",
|
||||
"noDSRecords": "No se encontraron registros DS en el dominio padre",
|
||||
"keytag": "Etiqueta de clave",
|
||||
"algorithm": "Algoritmo",
|
||||
"digestType": "Tipo de resumen",
|
||||
"digest": "Resumen",
|
||||
"deleteRow": "Eliminar fila",
|
||||
"general": "General",
|
||||
"disable": "Deshabilitar",
|
||||
"only": "solo",
|
||||
"ipv4AndIpv6": "IPv4 e IPv6",
|
||||
"resetForm": "Restablecer el formulario",
|
||||
"programVersions": "Versiones del programa",
|
||||
"sourceCode": "Código fuente",
|
||||
"documentation": "Documentación",
|
||||
"copyright": "Derechos de autor © AFNIC y The Swedish Internet Foundation. Todos los derechos reservados",
|
||||
"infoHeading1": "¿Qué es Zonemaster?",
|
||||
"infoPreamble": "¡Da a tu nombre de dominio un chequeo completo! Zonemaster te ayuda a evaluar cómo está tu nombre de dominio.",
|
||||
"infoTextParagraph1": "Cuando un nombre de dominio se envía a Zonemaster para su prueba, Zonemaster investiga el estado del nombre de dominio desde la parte superior hasta la parte inferior del árbol DNS. Esto generalmente se hace examinando los datos DNS desde la raíz, '.', hasta el Dominio de Nivel Superior (TLD) para ese nombre de dominio, como '.net', y luego finalmente a través de los servidores DNS que contienen información autoritativa sobre el nombre de dominio especificado.",
|
||||
"infoTextStrong": "Zonemaster realiza muchas pruebas,",
|
||||
"infoTextParagraph2": "como verificar las firmas DNSSEC, o que diferentes hosts puedan ser accedidos y que las direcciones IP sean válidas. Todo esto es para asegurarse de que tu nombre de dominio funcione lo más suavemente posible.",
|
||||
"infoHeading2": "Una palabra sobre el DNS",
|
||||
"infoTextParagraph3": "El Sistema de Nombres de Dominio (DNS) es una base de datos que asocia nombres de dominio con direcciones de Protocolo de Internet (IP), de la misma manera que un directorio telefónico asocia nombres con números de teléfono. Una dirección IP es una serie única de números que identifica cada computadora que está conectada a Internet. Es similar a la forma en que cada teléfono tiene su propio número en la red telefónica. Tales series largas de números funcionan bien para las computadoras, pero para las personas es mucho más difícil memorizarlas. Por lo tanto, el DNS se ha desarrollado como una capa adicional para mapear entre nombres que podemos recordar mejor y direcciones IP utilizadas por las computadoras cada vez que queremos alcanzar un sitio web específico o usar otros servicios en Internet, como el correo electrónico.",
|
||||
"img1Alt": "Persona mirando una computadora",
|
||||
"img2Alt": "El mundo conectado por una red",
|
||||
"faqPreamble": "Encuentra respuestas a preguntas comunes sobre Zonemaster aquí.",
|
||||
"faqTextParagraph1": "¿Todavía no encuentras la información que estás buscando? Puedes contactar al equipo del proyecto Zonemaster usando la",
|
||||
"faqParagraph1Link": "lista de correo de usuarios, el rastreador de problemas o la dirección de correo electrónico de contacto.",
|
||||
"history": "Historial",
|
||||
"testHistory": "Historial de pruebas",
|
||||
"undelegated": "No delegado",
|
||||
"delegated": "Delegado",
|
||||
"historyAll": "Todo",
|
||||
"all": "Todo",
|
||||
"info": "Información",
|
||||
"notice": "Aviso",
|
||||
"warning": "Advertencia",
|
||||
"error": "Error",
|
||||
"critical": "Crítico",
|
||||
"expandAll": "Expandir todos los módulos",
|
||||
"collapseAll": "Colapsar todos los módulos",
|
||||
"search": "Buscar",
|
||||
"searchInText": "Buscar texto en mensajes",
|
||||
"testResultFor": "Resultado de la prueba para",
|
||||
"createdOn": "Creado el",
|
||||
"filterSeverityLevels": "Filtrar niveles de gravedad",
|
||||
"profile": "Perfil",
|
||||
"tldURL": "URL del TLD",
|
||||
"exportResult": "Exportar",
|
||||
"exportJson": "JSON",
|
||||
"exportHtml": "HTML",
|
||||
"exportCsv": "CSV",
|
||||
"exportText": "Texto",
|
||||
"share": "Compartir"
|
||||
}
|
||||
86
zonemaster-gui/messages/fi.json
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"startTestNav": "Aloita testi",
|
||||
"faqNav": "UKK",
|
||||
"welcome": "Tervetuloa Zonemasteriin",
|
||||
"startTestTitle": "Tarkista, kuinka verkkotunnuksesi toimii",
|
||||
"runTestTitle": "Testaa verkkotunnuksesi",
|
||||
"faqTitle": "Usein kysytyt kysymykset",
|
||||
"resultTitle": "Testitulokset",
|
||||
"langLabel": "Vaihda kieli",
|
||||
"startTestBtn": "Suorita testi",
|
||||
"runningTest": "Suoritetaan testi...",
|
||||
"menu": "Valikko",
|
||||
"close": "Sulje",
|
||||
"domain": "Verkkotunnus",
|
||||
"domainName": "Verkkotunnuksen nimi",
|
||||
"showOptions": "Näytä vaihtoehdot",
|
||||
"hideOptions": "Piilota vaihtoehdot",
|
||||
"noticeHeading": "Huomio! Lisätietoja ei-delegoidusta testistä",
|
||||
"noticeLink": "/fi/faq/#undelegated",
|
||||
"noticeText": "Mikä on ei-delegoitu verkkotunnustesti?",
|
||||
"nameServers": "Nimipalvelimet",
|
||||
"nameserver": "Nimipalvelin {index}",
|
||||
"deleteNameserver": "Poista nimipalvelin {index}",
|
||||
"name": "Nimi",
|
||||
"addressOptional": "Osoite (valinnainen)",
|
||||
"fetchNameservers": "Hae nimipalvelimet vanhemmasta vyöhykkeestä",
|
||||
"noNameservers": "Ei nimipalvelimia löytynyt vanhemmasta vyöhykkeestä",
|
||||
"fetching": "Haetaan...",
|
||||
"DSRecords": "DS-tietueet",
|
||||
"dsRecord": "DS-tietue {index}",
|
||||
"deleteDSRecord": "Poista DS-tietue {index}",
|
||||
"fetchDSRecords": "Hae DS ylätason vyöhykkeeltä",
|
||||
"noDSRecords": "Ei löytynyt DS-tietueita ylätason vyöhykkeeltä",
|
||||
"keytag": "Keytag",
|
||||
"algorithm": "Algoritmi",
|
||||
"digestType": "Tiivisteen tyyppi",
|
||||
"digest": "Tiiviste",
|
||||
"deleteRow": "Poista rivi",
|
||||
"general": "Yleinen",
|
||||
"disable": "Poista käytöstä",
|
||||
"only": "vain",
|
||||
"ipv4AndIpv6": "IPv4 ja IPv6",
|
||||
"resetForm": "Nollaa lomake",
|
||||
"programVersions": "Ohjelmaversiot",
|
||||
"sourceCode": "Lähdekoodi",
|
||||
"documentation": "Dokumentaatio",
|
||||
"copyright": "Copyright © AFNIC ja The Swedish Internet Foundation. Kaikki oikeudet pidätetään.",
|
||||
"infoHeading1": "Mikä on Zonemaster?",
|
||||
"infoPreamble": "Tee verkkotunnuksellesi perusteellinen DNS-laatutarkastus – Zonemaster auttaa arvioimaan verkkotunnuksesi toimivuutta ja teknistä laatua.",
|
||||
"infoTextParagraph1": "Kun verkkotunnus lähetetään Zonemasterille testattavaksi, Zonemaster tutkii verkkotunnuksen tilan DNS-puun yläosasta alosaan. Tämä tehdään yleensä tarkastelemalla DNS-tietoja juuresta, '.', verkkotunnuksen Top-Level Domain (TLD) kuten '.net', ja sitten lopulta DNS-palvelimien kautta, jotka sisältävät tietoa määritellystä verkkotunnuksesta.",
|
||||
"infoTextStrong": "Zonemaster suorittaa monia testejä,",
|
||||
"infoTextParagraph2": "esimerkiksi DNSSEC-allekirjoitusten tarkistaminen tai että eri isäntiä voidaan käyttää ja että IP-osoitteet ovat kelvollisia. Kaikki tämä on varmistettava, että verkkotunnuksesi toimii mahdollisimman sujuvasti.",
|
||||
"infoHeading2": "Sana DNS:stä",
|
||||
"infoTextParagraph3": "Domain Name System (DNS) on nimipalvelujärjestelmä, joka yhdistää verkkotunnukset Internet Protocol (IP) -osoitteisiin samaan tapaan kuin puhelinluettelo yhdistää nimet puhelinnumeroihin. IP-osoite on verkkoyhteydessä käytettävä osoite, joka yksilöi yhteyden määränpään Internetissä, mutta koska tällaiset numerosarjat ovat ihmisille vaikeita muistaa, DNS toimii välikerroksena, joka muuntaa helposti muistettavat verkkotunnusnimet laitteiden käyttämiksi IP-osoitteiksi ja mahdollistaa verkkosivustojen ja muiden Internet-palveluiden, kuten sähköpostin, käytön nimien avulla.",
|
||||
"img1Alt": "Henkilö katsoo tietokonetta",
|
||||
"img2Alt": "Maailma yhdistetty verkossa",
|
||||
"faqPreamble": "Löydä vastauksia yleisimpiin kysymyksiin Zonemasterista täältä.",
|
||||
"faqTextParagraph1": "Etkö vielä löydä etsimääsi tietoa? Voit ottaa yhteyttä Zonemaster-projektitiimiin käyttämällä",
|
||||
"faqParagraph1Link": "Postituslistaa, ongelmarekisteriä tai yhteystietoja.",
|
||||
"history": "Historia",
|
||||
"testHistory": "Testihistoria",
|
||||
"undelegated": "Ei-delegoitu",
|
||||
"delegated": "Delegoitu",
|
||||
"historyAll": "Kaikki",
|
||||
"all": "Kaikki",
|
||||
"info": "Info",
|
||||
"notice": "Huomio",
|
||||
"warning": "Varoitus",
|
||||
"error": "Virhe",
|
||||
"critical": "Kriittinen",
|
||||
"expandAll": "Laajenna kaikki moduulit",
|
||||
"collapseAll": "Supista kaikki moduulit",
|
||||
"search": "Etsi",
|
||||
"searchInText": "Etsi tekstiä viesteistä",
|
||||
"testResultFor": "Testitulokset",
|
||||
"createdOn": "Luotu",
|
||||
"filterSeverityLevels": "Suodata vakavuustasot",
|
||||
"profile": "Profiili",
|
||||
"tldURL": "TLD-URL",
|
||||
"exportResult": "Vie",
|
||||
"exportJson": "JSON",
|
||||
"exportHtml": "HTML",
|
||||
"exportCsv": "CSV",
|
||||
"exportText": "Teksti",
|
||||
"share": "Jaa"
|
||||
}
|
||||
86
zonemaster-gui/messages/fr.json
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"startTestNav": "Démarrer un test",
|
||||
"faqNav": "FAQ",
|
||||
"welcome": "Bienvenue sur Zonemaster",
|
||||
"startTestTitle": "Vérifiez l'état de votre domaine",
|
||||
"runTestTitle": "Testez votre domaine",
|
||||
"faqTitle": "Questions fréquentes",
|
||||
"resultTitle": "Résultat du test",
|
||||
"langLabel": "Changer de langue",
|
||||
"startTestBtn": "Lancer un test",
|
||||
"runningTest": "Test en cours...",
|
||||
"menu": "Menu",
|
||||
"close": "Fermer",
|
||||
"domain": "Domaine",
|
||||
"domainName": "Nom de domaine",
|
||||
"showOptions": "Afficher les options",
|
||||
"hideOptions": "Masquer les options",
|
||||
"noticeHeading": "Info ! Plus d'infos sur le test non délégué",
|
||||
"noticeLink": "/fr/faq/#undelegated",
|
||||
"noticeText": "Qu'est-ce qu'un test de domaine non délégué ?",
|
||||
"nameServers": "Serveurs de noms",
|
||||
"nameserver": "Serveur de noms {index}",
|
||||
"deleteNameserver": "Supprimer le serveur de noms {index}",
|
||||
"name": "Nom",
|
||||
"addressOptional": "Adresse (facultatif)",
|
||||
"fetchNameservers": "Récupérer les serveurs de noms à partir de la zone parente",
|
||||
"noNameservers": "Aucun serveur de noms trouvé dans la zone parent",
|
||||
"fetching": "Récupération en cours...",
|
||||
"DSRecords": "Enregistrements DS",
|
||||
"dsRecord": "Enregistrement DS {index}",
|
||||
"deleteDSRecord": "Supprimer l'enregistrement DS {index}",
|
||||
"fetchDSRecords": "Récupérer les DS à partir de la zone parent",
|
||||
"noDSRecords": "Aucun enregistrement DS trouvé dans la zone parent",
|
||||
"keytag": "Identifiant de clé",
|
||||
"algorithm": "Algorithme",
|
||||
"digestType": "Type de condensat",
|
||||
"digest": "Condensat",
|
||||
"deleteRow": "Supprimer la ligne",
|
||||
"general": "Général",
|
||||
"disable": "Désactiver",
|
||||
"only": "seulement",
|
||||
"ipv4AndIpv6": "IPv4 et IPv6",
|
||||
"resetForm": "Réinitialiser le formulaire",
|
||||
"programVersions": "Versions du programme",
|
||||
"sourceCode": "Code source",
|
||||
"documentation": "Documentation",
|
||||
"copyright": "Copyright © AFNIC et The Swedish Internet Foundation. Tous droits réservés",
|
||||
"infoHeading1": "Qu'est-ce que Zonemaster ?",
|
||||
"infoPreamble": "Offrez à votre nom de domaine un examen complet ! Zonemaster vous aide à évaluer l'état de votre nom de domaine.",
|
||||
"infoTextParagraph1": "Lorsque vous envoyez un nom de domaine à Zonemaster pour un test, Zonemaster examine l'état du nom de domaine de la racine à la base de l'arbre DNS. Cela se fait généralement en examinant les données DNS de la racine, « . », au domaine de premier niveau (TLD) pour ce nom de domaine, comme « .net », puis au moyen des serveurs DNS qui contiennent les informations faisant autorité sur le nom de domaine spécifié.",
|
||||
"infoTextStrong": "Zonemaster effectue de nombreux tests,",
|
||||
"infoTextParagraph2": "comme la vérification des signatures DNSSEC ou la joignabilité des différents hôtes et la validité des adresses IP. Tout cela pour s'assurer que votre nom de domaine fonctionne aussi bien que possible.",
|
||||
"infoHeading2": "Un mot sur le DNS",
|
||||
"infoTextParagraph3": "Le système de noms de domaine (DNS) est une base de données qui associe aux noms de domaine des adresses du protocole Internet (IP), de la même manière qu'un annuaire associe aux noms des numéros de téléphone. Une adresse IP est une série unique de nombres qui identifie chaque ordinateur connecté à Internet. C'est similaire à la manière dont chaque téléphone a son propre numéro dans le réseau téléphonique. De telles longues séries de nombres fonctionnent bien pour les ordinateurs, mais pour les personnes, il est beaucoup plus difficile de les mémoriser. Ainsi, le DNS a été développé comme une couche supplémentaire pour faire le lien entre des noms que nous pouvons mieux retenir et des adresses IP utilisées par les ordinateurs chaque fois que nous voulons atteindre un site Web spécifique ou utiliser d'autres services sur Internet, comme le courrier électronique.",
|
||||
"img1Alt": "Personne regardant un ordinateur",
|
||||
"img2Alt": "Le monde connecté par un réseau",
|
||||
"faqPreamble": "Trouvez des réponses aux questions courantes sur Zonemaster ici.",
|
||||
"faqTextParagraph1": "Vous ne trouvez toujours pas les informations que vous cherchez ? Vous pouvez contacter l'équipe du projet Zonemaster en utilisant la",
|
||||
"faqParagraph1Link": "liste de diffusion des utilisateurs, le suivi des problèmes ou l'adresse e-mail de contact.",
|
||||
"history": "Historique",
|
||||
"testHistory": "Historique des tests",
|
||||
"undelegated": "Non délégué",
|
||||
"delegated": "Délégué",
|
||||
"historyAll": "Tous",
|
||||
"all": "Tous",
|
||||
"info": "Info",
|
||||
"notice": "Note",
|
||||
"warning": "Avertissement",
|
||||
"error": "Erreur",
|
||||
"critical": "Critique",
|
||||
"expandAll": "Développer tous les modules",
|
||||
"collapseAll": "Réduire tous les modules",
|
||||
"search": "Rechercher",
|
||||
"searchInText": "Rechercher du texte dans les messages",
|
||||
"testResultFor": "Résultat du test pour",
|
||||
"createdOn": "Créé le",
|
||||
"filterSeverityLevels": "Filtrer les niveaux de sévérité",
|
||||
"profile": "Profil",
|
||||
"tldURL": "URL du TLD",
|
||||
"exportResult": "Exporter",
|
||||
"exportJson": "JSON",
|
||||
"exportHtml": "HTML",
|
||||
"exportCsv": "CSV",
|
||||
"exportText": "Texte",
|
||||
"share": "Partager"
|
||||
}
|
||||
86
zonemaster-gui/messages/nb.json
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"startTestNav": "Start sjekk",
|
||||
"faqNav": "FAQ",
|
||||
"welcome": "Velkommen til Zonemaster",
|
||||
"startTestTitle": "Sjekk hvordan ditt domene fungerer",
|
||||
"runTestTitle": "Sjekk ditt domene",
|
||||
"faqTitle": "Ofte stilte spørsmål",
|
||||
"resultTitle": "Testresultat",
|
||||
"langLabel": "Endre språk",
|
||||
"startTestBtn": "Start sjekk",
|
||||
"runningTest": "Kjører test...",
|
||||
"menu": "Meny",
|
||||
"close": "Lukk",
|
||||
"domain": "Domene",
|
||||
"domainName": "Domenenavn",
|
||||
"showOptions": "Vis alternativer",
|
||||
"hideOptions": "Skjul alternativer",
|
||||
"noticeHeading": "NB! Mer informasjon om udelegerte sjekker",
|
||||
"noticeLink": "/nb/faq/#undelegated",
|
||||
"noticeText": "Hva er en udelegert domenesjekk?",
|
||||
"nameServers": "Navnetjenere",
|
||||
"nameserver": "Navnetjener {index}",
|
||||
"deleteNameserver": "Slett navnetjener {index}",
|
||||
"name": "Navn",
|
||||
"addressOptional": "Adresse (valgfritt)",
|
||||
"fetchNameservers": "Hent navnetjenere fra overordnet sone",
|
||||
"noNameservers": "Ingen navnetjenere funnet i overordnet sone",
|
||||
"fetching": "Henter...",
|
||||
"DSRecords": "DS-oppføringer",
|
||||
"dsRecord": "DS-oppføring {index}",
|
||||
"deleteDSRecord": "Slett DS-oppføring {index}",
|
||||
"fetchDSRecords": "Hent DS fra overordnet sone",
|
||||
"noDSRecords": "Ingen DS-oppføringer funnet i overordnet sone",
|
||||
"keytag": "Nøkkelmerke",
|
||||
"algorithm": "Algoritme",
|
||||
"digestType": "Digest-type",
|
||||
"digest": "Digest",
|
||||
"deleteRow": "Slett rad",
|
||||
"general": "Generelt",
|
||||
"disable": "Deaktivér",
|
||||
"only": "bare",
|
||||
"ipv4AndIpv6": "IPv4 og IPv6",
|
||||
"resetForm": "Tilbakestill skjema",
|
||||
"programVersions": "Programversjoner",
|
||||
"sourceCode": "Kildekode",
|
||||
"documentation": "Dokumentasjon",
|
||||
"copyright": "Opphavsrett © AFNIC og The Swedish Internet Foundation. Alle rettigheter reservert",
|
||||
"infoHeading1": "Hva er Zonemaster?",
|
||||
"infoPreamble": "Gi ditt domene et fullstendig helsesjekk! Zonemaster hjelper deg med å vurdere hvordan ditt domene fungerer.",
|
||||
"infoTextParagraph1": "Når en domene sendes til Zonemaster for testing, undersøker Zonemaster tilstanden til domenen fra toppen til bunnen av DNS-treet. Dette gjøres vanligvis ved å undersøke DNS-data fra roten, '.', til Top-Level Domain (TLD) for den domenen, som '.net', og deretter gjennom DNS-servere som inneholder autoritativ informasjon om den spesifiserte domenen.",
|
||||
"infoTextStrong": "Zonemaster utfører mange tester,",
|
||||
"infoTextParagraph2": "som å sjekke DNSSEC-signaturer, eller at ulike vertsmaskiner kan tilgangs og at IP-adresser er gyldige. Alt dette for å sikre at din domene fungerer så jevnt som mulig.",
|
||||
"infoHeading2": "Et ord om DNS",
|
||||
"infoTextParagraph3": "Domain Name System (DNS) er en database som knytter domenenavn til Internet Protocol (IP) adresser, på samme måte som en telefonbok knytter navn til telefonnummer. En IP-adresse er en unik rekke tall som identifiserer hver datamaskin som er koblet til Internett. Det er likt måten hver telefon har sitt eget nummer i telefonnettet. Slike lange rekker av tall fungerer fint for datamaskiner, men for mennesker er det mye vanskeligere å huske. Dermed har DNS blitt utviklet som et ekstra lag for å kartlegge mellom navn som vi kan huske bedre og IP-adresser brukt av datamaskiner når vi vil nå en bestemt nettsted eller bruke andre tjenester på Internett, som e-post.",
|
||||
"img1Alt": "Person som ser på datamaskin",
|
||||
"img2Alt": "Verden koblet sammen av et nettverk",
|
||||
"faqPreamble": "Finn svar på vanlige spørsmål om Zonemaster her.",
|
||||
"faqTextParagraph1": "Finn du fremdeles ikke informasjonen du leter etter? Du kan kontakte Zonemaster-prosjektteamet ved å bruke",
|
||||
"faqParagraph1Link": "brukerpostlisten, problemsporingen eller kontakt-e-postadressen.",
|
||||
"history": "Historie",
|
||||
"testHistory": "Testhistorie",
|
||||
"undelegated": "Udelegerte",
|
||||
"delegated": "Delegerte",
|
||||
"historyAll": "Alle",
|
||||
"all": "Alle",
|
||||
"info": "Info",
|
||||
"notice": "Merknad",
|
||||
"warning": "Advarsel",
|
||||
"error": "Feil",
|
||||
"critical": "Kritisk",
|
||||
"expandAll": "Utvid alle moduler",
|
||||
"collapseAll": "Minimer alle moduler",
|
||||
"search": "Søk",
|
||||
"searchInText": "Søk tekst i meldinger",
|
||||
"testResultFor": "Testresultat for",
|
||||
"createdOn": "Opprettet",
|
||||
"filterSeverityLevels": "Filtrer alvorlighetsgrader",
|
||||
"profile": "Profil",
|
||||
"tldURL": "TLD-URL",
|
||||
"exportResult": "Eksportér",
|
||||
"exportJson": "JSON",
|
||||
"exportHtml": "HTML",
|
||||
"exportCsv": "CSV",
|
||||
"exportText": "Tekst",
|
||||
"share": "Del"
|
||||
}
|
||||
86
zonemaster-gui/messages/sl.json
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"startTestNav": "Začni test",
|
||||
"faqNav": "Pogosta vprašanja",
|
||||
"welcome": "Dobrodošli v Zonemaster",
|
||||
"startTestTitle": "Preverite, kako deluje vaša domena",
|
||||
"runTestTitle": "Preverite svojo domeno",
|
||||
"faqTitle": "Pogosta vprašanja",
|
||||
"resultTitle": "Rezultati testa",
|
||||
"langLabel": "Spremenite jezik",
|
||||
"startTestBtn": "Začni test",
|
||||
"runningTest": "Potekajoči test...",
|
||||
"menu": "Meni",
|
||||
"close": "Zapri",
|
||||
"domain": "Domena",
|
||||
"domainName": "Ime domene",
|
||||
"showOptions": "Pokaži možnosti",
|
||||
"hideOptions": "Skrij možnosti",
|
||||
"noticeHeading": "Opozorilo! Več informacij o neposrednem testu",
|
||||
"noticeLink": "/sl/faq/#undelegated",
|
||||
"noticeText": "Kaj je test nedelegirane domene?",
|
||||
"nameServers": "Imenski strežniki",
|
||||
"nameserver": "Imenski strežniki {index}",
|
||||
"deleteNameserver": "Izbriši imenske strežnike {index}",
|
||||
"name": "Ime",
|
||||
"addressOptional": "Naslov (neobvezno)",
|
||||
"fetchNameservers": "Pridobite imena strežnikov iz starševske cone",
|
||||
"noNameservers": "V starševski coni ni najdenih imenskih strežnikov",
|
||||
"fetching": "Pridobivam...",
|
||||
"DSRecords": "DS zapisi",
|
||||
"dsRecord": "DS zapis {index}",
|
||||
"deleteDSRecord": "Izbriši DS zapis {index}",
|
||||
"fetchDSRecords": "Pridobite DS zapise iz starševske cone",
|
||||
"noDSRecords": "V starševski coni ni najdenih DS zapisov",
|
||||
"keytag": "Keytag",
|
||||
"algorithm": "Algoritem",
|
||||
"digestType": "Tip izvlečka",
|
||||
"digest": "Izvleček",
|
||||
"deleteRow": "Izbriši vrstico",
|
||||
"general": "Splošno",
|
||||
"disable": "Onemogoči",
|
||||
"only": "samo",
|
||||
"ipv4AndIpv6": "IPv4 in IPv6",
|
||||
"resetForm": "Ponastavite obrazec",
|
||||
"programVersions": "Različice programa",
|
||||
"sourceCode": "Izvorna koda",
|
||||
"documentation": "Dokumentacija",
|
||||
"copyright": "Avtorska pravica © AFNIC in The Swedish Internet Foundation. Vse pravice pridržane",
|
||||
"infoHeading1": "Kaj je Zonemaster?",
|
||||
"infoPreamble": "Podrobno preverite svojo domeno. Zonemaster vam pomaga pri ocenjevanju, kako deluje vaša domene.",
|
||||
"infoTextParagraph1": "Zonemaster preveri stanje domene od vrha do dna DNS drevesa. To se običajno naredi s preverjanjem DNS podatkov od korena, '.', preko vrhnje domene (TLD) za to domeno, kot je '.si', in nato končno skozi DNS strežnike, ki vsebujejo avtoritativne informacije za navedeno domeno.",
|
||||
"infoTextStrong": "Zonemaster izvede številne teste,",
|
||||
"infoTextParagraph2": "kot je preverjanje podpisov DNSSEC ali dostop do različnih gostiteljev in veljavnost IP naslovov. Vse to je potrebno, da domena dela čim boljše.",
|
||||
"infoHeading2": "Beseda o DNS",
|
||||
"infoTextParagraph3": "Domain Name System (DNS) je baza podatkov, ki povezuje imena domen z naslovi Internet Protocol (IP), tako kot telefonski imenik povezuje imena s telefonskimi številkami. IP naslov je edinstvena zaporedje števil, ki identificira računalnike povezane z Internetom. To lahko primerjate s telefonom, ki ima svojo številko v telefonski mreži. Zaporedja številk delujejo dobro za računalnike, ljudje pa si jih težko zapomnijo. Zato je bil razvit DNS, kot dodatni sloj za preslikavo med številkami (IP naslovi) in imeni in obratno. ",
|
||||
"img1Alt": "Oseba, ki uporablja računalnik",
|
||||
"img2Alt": "Svet povezan z mrežo",
|
||||
"faqPreamble": "Odgovori na pogosta vprašanja o Zonemaster.",
|
||||
"faqTextParagraph1": "Še vedno niste našli informacij, ki jih iščete? Obrnite se na ekipo projekta Zonemaster z uporabo",
|
||||
"faqParagraph1Link": "dopisnega seznama, sledilnika vprašanj ali naslova elektronske pošte.",
|
||||
"history": "Zgodovina",
|
||||
"testHistory": "Zgodovina testov",
|
||||
"undelegated": "Neposredno",
|
||||
"delegated": "Posredno",
|
||||
"historyAll": "Vse",
|
||||
"all": "Vse",
|
||||
"info": "Info",
|
||||
"notice": "Obvestilo",
|
||||
"warning": "Opozorilo",
|
||||
"error": "Napaka",
|
||||
"critical": "Kritično",
|
||||
"expandAll": "Razširite vse module",
|
||||
"collapseAll": "Zbrišite vse module",
|
||||
"search": "Išči",
|
||||
"searchInText": "Išči besedilo v sporočilih",
|
||||
"testResultFor": "Rezultat testa za",
|
||||
"createdOn": "Ustvarjeno",
|
||||
"filterSeverityLevels": "Filter težavnosti",
|
||||
"profile": "Profil",
|
||||
"tldURL": "TLD URL",
|
||||
"exportResult": "Izvozi",
|
||||
"exportJson": "JSON",
|
||||
"exportHtml": "HTML",
|
||||
"exportCsv": "CSV",
|
||||
"exportText": "Besedilo",
|
||||
"share": "Deli"
|
||||
}
|
||||
86
zonemaster-gui/messages/sv.json
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"startTestNav": "Kör test",
|
||||
"faqNav": "Vanliga frågor",
|
||||
"welcome": "Välkommen till Zonemaster",
|
||||
"startTestTitle": "Kontrollera hur ditt domännamn mår",
|
||||
"runTestTitle": "Testa ditt domännamn",
|
||||
"faqTitle": "Vanliga frågor",
|
||||
"resultTitle": "Resultat",
|
||||
"langLabel": "Byt språk",
|
||||
"startTestBtn": "Kör test",
|
||||
"runningTest": "Testar...",
|
||||
"menu": "Meny",
|
||||
"close": "Stäng",
|
||||
"domain": "Domän",
|
||||
"domainName": "Domänamn",
|
||||
"showOptions": "Fler inställningar",
|
||||
"hideOptions": "Dölj inställningar",
|
||||
"noticeHeading": "Info! Mer info om test av odelegerad domän",
|
||||
"noticeLink": "/sv/faq/#undelegated",
|
||||
"noticeText": "Vad är ett odelegerat domännamnstest?",
|
||||
"nameServers": "Namnservrar",
|
||||
"nameserver": "Namnserver {index}",
|
||||
"deleteNameserver": "Ta bort namnserver {index}",
|
||||
"name": "Namn",
|
||||
"addressOptional": "Adress (valfritt)",
|
||||
"fetchNameservers": "Hämta namnservrar från moderzonen",
|
||||
"noNameservers": "Inga namnservrar hittades i moderzonen",
|
||||
"fetching": "Hämtar...",
|
||||
"DSRecords": "DS-poster",
|
||||
"dsRecord": "DS record {index}",
|
||||
"deleteDSRecord": "Ta bort DS-post {index}",
|
||||
"fetchDSRecords": "Hämta DS-poster från moderzonen",
|
||||
"noDSRecords": "Inga DS-poster hittades i moderzonen",
|
||||
"keytag": "'Keytag'",
|
||||
"algorithm": "Algoritm",
|
||||
"digestType": "Digest-typ",
|
||||
"digest": "'Digest'",
|
||||
"deleteRow": "Ta bort raden",
|
||||
"general": "Allmänt",
|
||||
"disable": "Inaktivera",
|
||||
"only": "",
|
||||
"ipv4AndIpv6": "IPv4 och IPv6",
|
||||
"resetForm": "Återställ formuläret",
|
||||
"programVersions": "Programversioner",
|
||||
"sourceCode": "Källkod",
|
||||
"documentation": "Dokumentation",
|
||||
"copyright": "Copyright © AFNIC och Internetstiftelsen. Alla rättigheter förbehållna",
|
||||
"infoHeading1": "Vad är Zonemaster?",
|
||||
"infoPreamble": "Ge ditt domännamn en komplett hälsokontroll! Zonemaster hjälper dig att bedöma hur ditt domännamn mår.",
|
||||
"infoTextParagraph1": "När ett domännamn skickas till Zonemaster för testning undersöker Zonemaster domännamnets tillstånd från toppen till botten av DNS-trädet.\nDetta görs vanligtvis genom att granska DNS-data från rotzonen, ‘.’, vidare till toppdomänen (TLD) för domännamnet, som ‘.net’, och slutligen genom de namnservrar som innehåller auktoritativ information om det angivna domännamnet.",
|
||||
"infoTextStrong": "Zonemaster genomför många tester,",
|
||||
"infoTextParagraph2": "Till exempel kontrolleras DNSSEC-signaturer, att olika värdar är åtkomliga och att IP-adresser är giltiga. Allt detta görs för att säkerställa att ditt domännamn fungerar så smidigt som möjligt.",
|
||||
"infoHeading2": "Några ord om DNS",
|
||||
"infoTextParagraph3": "Domännamnssystemet (DNS) är en databas som kopplar domännamn till IP-adresser (Internet Protocol), på samma sätt som en telefonkatalog kopplar namn till telefonnummer.\n\nEn IP-adress är en unik nummerserie som identifierar varje dator eller enhet som är ansluten till internet – ungefär som varje telefon har sitt eget nummer i telefonnätet.\n\nSådana långa nummerserier fungerar utmärkt för datorer, men är betydligt svårare för människor att komma ihåg. Därför har DNS utvecklats som ett extra lager som översätter mellan namn vi människor lättare minns och IP-adresser som används av datorer, varje gång vi vill nå en viss webbplats eller använda andra internettjänster, som e-post.",
|
||||
"img1Alt": "Person tittar på sin datorskärm",
|
||||
"img2Alt": "Världen ihopkopplad i ett nätverk",
|
||||
"faqPreamble": "Hitta svar på vanliga frågor om Zonemaster här.",
|
||||
"faqTextParagraph1": "Hittar du fortfarande inte informationen du söker? Du kan kontakta Zonemaster-projektteamet via",
|
||||
"faqParagraph1Link": "användarlistan, ärendehanteraren eller kontakt-e-postadressen.",
|
||||
"history": "Historik",
|
||||
"testHistory": "Testhistorik",
|
||||
"undelegated": "Odelegerad",
|
||||
"delegated": "Delegerad",
|
||||
"historyAll": "Alla",
|
||||
"all": "Alla",
|
||||
"info": "Info",
|
||||
"notice": "Notering",
|
||||
"warning": "Varning",
|
||||
"error": "Fel",
|
||||
"critical": "Kritisk",
|
||||
"expandAll": "Expandera alla moduler",
|
||||
"collapseAll": "Stäng alla moduler",
|
||||
"search": "Sök",
|
||||
"searchInText": "Sök i textmeddelanden",
|
||||
"testResultFor": "Testresultat för",
|
||||
"createdOn": "Skapad",
|
||||
"filterSeverityLevels": "Filtrera allvarlighetsnivå",
|
||||
"profile": "Profil",
|
||||
"tldURL": "TLD URL",
|
||||
"exportResult": "Exportera",
|
||||
"exportJson": "JSON",
|
||||
"exportHtml": "HTML",
|
||||
"exportCsv": "CSV",
|
||||
"exportText": "Text",
|
||||
"share": "Dela"
|
||||
}
|
||||
6987
zonemaster-gui/package-lock.json
generated
Normal file
43
zonemaster-gui/package.json
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "zonemaster-gui",
|
||||
"version": "v5.0.1",
|
||||
"license": "BSD-2-Clause",
|
||||
"scripts": {
|
||||
"start": "npm run dev",
|
||||
"dev": "astro dev",
|
||||
"build": "astro build",
|
||||
"release": "npm run build && node scripts/create_release.js",
|
||||
"preview": "astro preview",
|
||||
"astro": "astro",
|
||||
"lib:build": "cd src/lib && vite build -c ./vite.config.js --outDir ../../dist --emptyOutDir",
|
||||
"lib:demo": "vite serve demo -c src/lib/vite.config.js",
|
||||
"e2e": "playwright --version && playwright test",
|
||||
"e2e:update": "playwright --version && playwright test --update-snapshots",
|
||||
"e2e:install": "playwright install chromium",
|
||||
"e2e:install-deps": "playwright install-deps chromium"
|
||||
},
|
||||
"private": false,
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@astrojs/node": "^9.5.1",
|
||||
"@astrojs/svelte": "^7.2.2",
|
||||
"astro": "^5.16.4",
|
||||
"punycode": "^2.3.1",
|
||||
"remark-definition-list": "^2.0.0",
|
||||
"remark-gfm": "^4.0.1",
|
||||
"svelte": "^5.45.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.57.0",
|
||||
"@sveltejs/vite-plugin-svelte": "^6.2.1",
|
||||
"@tsconfig/svelte": "^5.0.6",
|
||||
"@types/node": "^24.10.1",
|
||||
"archiver": "^7.0.1",
|
||||
"prettier": "3.7.4",
|
||||
"prettier-plugin-astro": "0.14.1",
|
||||
"prettier-plugin-svelte": "^3.4.0",
|
||||
"svelte-check": "^4.3.4",
|
||||
"typescript": "^5.9.3",
|
||||
"vite": "^7.2.7"
|
||||
}
|
||||
}
|
||||
30
zonemaster-gui/playwright.config.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { type PlaywrightTestConfig, devices } from '@playwright/test';
|
||||
|
||||
const config: PlaywrightTestConfig = {
|
||||
workers: 4,
|
||||
testDir: 'e2e',
|
||||
testMatch: 'e2e/*.e2e-spec.ts',
|
||||
webServer: {
|
||||
command: 'NODE_ENV=testing npm run build && NODE_ENV=testing npm run preview',
|
||||
url: 'http://localhost:4321/',
|
||||
timeout: 120 * 1000,
|
||||
reuseExistingServer: !process.env.CI
|
||||
},
|
||||
expect: {
|
||||
toMatchSnapshot: {
|
||||
maxDiffPixelRatio: 0.01
|
||||
}
|
||||
},
|
||||
use: {
|
||||
headless: true,
|
||||
baseURL: 'http://localhost:4321',
|
||||
viewport: { width: 1920, height: 1080 }
|
||||
},
|
||||
projects: [
|
||||
{
|
||||
name: 'chromium',
|
||||
...devices['Desktop Chrome']
|
||||
},
|
||||
],
|
||||
};
|
||||
export default config;
|
||||
51
zonemaster-gui/scripts/create_release.js
Normal file
@@ -0,0 +1,51 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import archiver from 'archiver';
|
||||
import { readFileSync } from 'fs';
|
||||
|
||||
// Read package.json to get version
|
||||
const packageJson = JSON.parse(
|
||||
readFileSync(new URL('../package.json', import.meta.url))
|
||||
);
|
||||
|
||||
export async function zipDirectory(sourceDir, outPath) {
|
||||
const output = fs.createWriteStream(outPath);
|
||||
const archive = archiver('zip', {
|
||||
zlib: { level: 9 }
|
||||
});
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
output.on('close', () => {
|
||||
console.log(`Zipped ${archive.pointer()} total bytes`);
|
||||
resolve();
|
||||
});
|
||||
|
||||
archive.on('error', err => reject(err));
|
||||
|
||||
archive.pipe(output);
|
||||
archive.directory(sourceDir, false); // `false` keeps only folder contents
|
||||
archive.finalize();
|
||||
});
|
||||
}
|
||||
|
||||
// Example usage
|
||||
const __dirname = path.dirname(new URL(import.meta.url).pathname);
|
||||
const inputDir = path.resolve(__dirname, '../public');
|
||||
const version = packageJson.version;
|
||||
const outputZip = path.resolve(__dirname, `../zonemaster_web_gui_${version}.zip`);
|
||||
|
||||
// Copy zonemaster.conf-example into public
|
||||
const file1Src = path.resolve(__dirname, '../zonemaster.conf-example');
|
||||
const file1Dest = path.resolve(inputDir, 'zonemaster.conf-example');
|
||||
fs.copyFileSync(file1Src, file1Dest);
|
||||
console.log('Include zonemaster.conf-example in distribution zip file');
|
||||
|
||||
// Copy LICENSE into public
|
||||
const file2Src = path.resolve(__dirname, '../LICENSE');
|
||||
const file2Dest = path.resolve(inputDir, 'LICENSE');
|
||||
fs.copyFileSync(file2Src, file2Dest);
|
||||
console.log('Include LICENSE in distribution zip file');
|
||||
|
||||
zipDirectory(inputDir, outputZip)
|
||||
.then(() => console.log('Zip complete'))
|
||||
.catch(err => console.error('Error zipping:', err));
|
||||
166
zonemaster-gui/scripts/generate-messages.ts
Normal file
@@ -0,0 +1,166 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
// Regex to find placeholders like {variableName}
|
||||
const placeholderRegex = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
|
||||
|
||||
interface Messages {
|
||||
[key: string]: string;
|
||||
}
|
||||
|
||||
interface AllMessages {
|
||||
[lang: string]: Messages;
|
||||
}
|
||||
|
||||
interface GenerateConfig {
|
||||
defaultLanguage: string;
|
||||
enabledLanguages: string[];
|
||||
}
|
||||
|
||||
function getFileHeader(): string {
|
||||
return `/* Auto-generated by vite-plugin-messages - DO NOT EDIT */\n/* Generated: ${new Date().toISOString()} */\n`;
|
||||
}
|
||||
|
||||
export function generateMessages(langDir: string, outDir: string, config: GenerateConfig) {
|
||||
const { defaultLanguage, enabledLanguages } = config;
|
||||
|
||||
if (!fs.existsSync(outDir)) {
|
||||
fs.mkdirSync(outDir, { recursive: true });
|
||||
}
|
||||
|
||||
const allMessages: AllMessages = {};
|
||||
|
||||
for (const lang of enabledLanguages) {
|
||||
const filePath = path.join(langDir, `${lang}.json`);
|
||||
try {
|
||||
const content = fs.readFileSync(filePath, 'utf-8');
|
||||
allMessages[lang] = JSON.parse(content);
|
||||
} catch (e) {
|
||||
console.warn(`⚠️ Failed to load ${lang}.json:`, e instanceof Error ? e.message : String(e));
|
||||
allMessages[lang] = {};
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.keys(allMessages).length === 0) {
|
||||
console.warn('⚠️ No language files found');
|
||||
return;
|
||||
}
|
||||
|
||||
const defaultMessages = allMessages[defaultLanguage] || {};
|
||||
const allKeys = Object.keys(defaultMessages);
|
||||
|
||||
for (const lang of enabledLanguages) {
|
||||
const messages = allMessages[lang] || {};
|
||||
const functions: string[] = [];
|
||||
const reExports: string[] = [];
|
||||
|
||||
for (const key of allKeys) {
|
||||
const hasTranslation = key in messages;
|
||||
|
||||
if (hasTranslation) {
|
||||
functions.push(createMessageFunction(key, messages[key]));
|
||||
} else if (lang !== defaultLanguage) {
|
||||
reExports.push(key);
|
||||
}
|
||||
}
|
||||
|
||||
let content = getFileHeader();
|
||||
|
||||
if (reExports.length > 0) {
|
||||
content += `\nexport { ${reExports.join(', ')} } from './${defaultLanguage}.ts';\n`;
|
||||
}
|
||||
|
||||
if (functions.length > 0) {
|
||||
content += `\n${functions.join('\n\n')}\n`;
|
||||
}
|
||||
|
||||
const filePath = path.join(outDir, `${lang}.ts`);
|
||||
fs.writeFileSync(filePath, content, 'utf-8');
|
||||
console.log(`✅ Generated messages/${lang}.ts (${functions.length} translated, ${reExports.length} re-exported)`);
|
||||
}
|
||||
|
||||
generateIndexFile(outDir, allKeys, defaultMessages, config);
|
||||
}
|
||||
|
||||
function extractPlaceholders(value: string): string[] {
|
||||
const matches = value.matchAll(placeholderRegex);
|
||||
const placeholders = new Set<string>();
|
||||
for (const match of matches) {
|
||||
placeholders.add(match[1]);
|
||||
}
|
||||
return Array.from(placeholders);
|
||||
}
|
||||
|
||||
function escapeTemplateString(value: string): string {
|
||||
// Escape backticks and ${} that are not our placeholders
|
||||
return value
|
||||
.replace(/\\/g, '\\\\')
|
||||
.replace(/`/g, '\\`');
|
||||
}
|
||||
|
||||
function createMessageFunction(key: string, value: string): string {
|
||||
const placeholders = extractPlaceholders(value);
|
||||
const templateString = value.replace(placeholderRegex, '${params.$1}');
|
||||
const escapedTemplate = escapeTemplateString(templateString);
|
||||
|
||||
if (placeholders.length > 0) {
|
||||
const paramsType = placeholders.map(p => `${p}: string | number`).join(', ');
|
||||
return `export const ${key} = (params: { ${paramsType} }): string => \`${escapedTemplate}\`;`;
|
||||
}
|
||||
return `export const ${key} = (): string => \`${escapedTemplate}\`;`;
|
||||
}
|
||||
|
||||
function generateIndexFile(outDir: string, allKeys: string[], defaultMessages: Messages, config: GenerateConfig) {
|
||||
const { enabledLanguages } = config;
|
||||
|
||||
const langImports = enabledLanguages
|
||||
.map(lang => `import * as ${lang} from './${lang}.ts';`)
|
||||
.join('\n');
|
||||
|
||||
const langObject = enabledLanguages.join(', ');
|
||||
const languageType = enabledLanguages.map(l => `'${l}'`).join(' | ');
|
||||
const messageExports: string[] = [];
|
||||
|
||||
for (const key of allKeys) {
|
||||
const value = defaultMessages[key] || '';
|
||||
const placeholders = extractPlaceholders(value);
|
||||
const paramsType = placeholders.length > 0
|
||||
? `params: { ${placeholders.map(p => `${p}: string | number`).join(', ')} }`
|
||||
: '';
|
||||
const paramsArg = paramsType ? 'params' : '';
|
||||
|
||||
messageExports.push(
|
||||
`export const ${key} = (${paramsType}): string => allMessages[getLocale()].${key}(${paramsArg});`
|
||||
);
|
||||
}
|
||||
|
||||
const content = `${getFileHeader()}
|
||||
import config from '@/config';
|
||||
|
||||
${langImports}
|
||||
|
||||
const allMessages = { ${langObject} } as const;
|
||||
|
||||
export type Language = ${languageType};
|
||||
|
||||
export const defaultLanguage: Language = '${config.defaultLanguage}';
|
||||
export const enabledLanguages: readonly Language[] = ${JSON.stringify(config.enabledLanguages)} as const;
|
||||
|
||||
let _locale: Language = defaultLanguage;
|
||||
|
||||
export const getLocale = (): Language => _locale;
|
||||
export const isValidLocale = (locale: unknown): locale is Language => enabledLanguages.includes(locale as Language);
|
||||
export const setLocale = (locale: unknown): void => {
|
||||
if (isValidLocale(locale)) {
|
||||
_locale = locale as Language;
|
||||
}
|
||||
};
|
||||
|
||||
// Message functions
|
||||
${messageExports.join('\n\n')}
|
||||
`;
|
||||
|
||||
const filePath = path.join(outDir, 'index.ts');
|
||||
fs.writeFileSync(filePath, content, 'utf-8');
|
||||
console.log('✅ Generated messages/index.ts');
|
||||
}
|
||||
69
zonemaster-gui/scripts/messages-plugin.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
import path from 'path';
|
||||
import { generateMessages } from './generate-messages.ts';
|
||||
|
||||
interface MessagesPluginConfig {
|
||||
defaultLanguage: string;
|
||||
enabledLanguages: string[];
|
||||
}
|
||||
|
||||
function validateConfig(config: any): asserts config is MessagesPluginConfig {
|
||||
const errors = [];
|
||||
if (!config?.defaultLanguage) errors.push('defaultLanguage is required');
|
||||
if (!Array.isArray(config?.enabledLanguages) || !config.enabledLanguages.length)
|
||||
errors.push('enabledLanguages must be a non-empty array');
|
||||
if (config?.enabledLanguages?.some((l: any) => typeof l !== 'string'))
|
||||
errors.push('enabledLanguages must contain only strings');
|
||||
|
||||
if (errors.length) throw new Error(`messagesPlugin: ${errors.join(', ')}`);
|
||||
}
|
||||
|
||||
export function messagesIntegration() {
|
||||
return {
|
||||
name: 'messages-integration',
|
||||
hooks: {
|
||||
'astro:config:setup': ({ injectScript }: any) => {
|
||||
injectScript(
|
||||
'before-hydration',
|
||||
`
|
||||
import { setLocale } from '@/messages';
|
||||
setLocale(document.documentElement.lang);
|
||||
`
|
||||
);
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export default function messagesPlugin(config: MessagesPluginConfig) {
|
||||
validateConfig(config);
|
||||
|
||||
const langDir = path.resolve(process.cwd(), 'messages');
|
||||
const outDir = path.resolve(process.cwd(), 'src/messages');
|
||||
|
||||
const regenerate = () => {
|
||||
console.log('🔄 Generating message files...');
|
||||
generateMessages(langDir, outDir, config);
|
||||
};
|
||||
|
||||
return {
|
||||
name: 'vite-plugin-messages',
|
||||
|
||||
buildStart() {
|
||||
regenerate();
|
||||
},
|
||||
|
||||
configureServer(server: any) {
|
||||
server.watcher.add(langDir);
|
||||
},
|
||||
|
||||
handleHotUpdate({ file, server }: { file: string; server: any }) {
|
||||
if (file.startsWith(langDir) && file.endsWith('.json')) {
|
||||
console.log('♻️ Language file changed:', path.basename(file));
|
||||
regenerate();
|
||||
// Trigger a full reload to pick up the new messages
|
||||
server.ws.send({ type: 'full-reload' });
|
||||
return [];
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
6181
zonemaster-gui/src/assets/fonts/bootstrap-icons.css
vendored
Normal file
2052
zonemaster-gui/src/assets/fonts/bootstrap-icons.json
Normal file
6178
zonemaster-gui/src/assets/fonts/bootstrap-icons.min.css
vendored
Normal file
2095
zonemaster-gui/src/assets/fonts/bootstrap-icons.scss
vendored
Normal file
BIN
zonemaster-gui/src/assets/fonts/bootstrap-icons.woff
Normal file
BIN
zonemaster-gui/src/assets/fonts/bootstrap-icons.woff2
Normal file
|
After Width: | Height: | Size: 17 KiB |
1
zonemaster-gui/src/assets/images/world_connected.svg
Normal file
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 21 KiB |
BIN
zonemaster-gui/src/assets/logo.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
13
zonemaster-gui/src/config.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import baseConfig from '../config.ts';
|
||||
|
||||
const config = baseConfig;
|
||||
|
||||
export function setApiBaseUrl(url: string) {
|
||||
config.apiBaseUrl = url;
|
||||
}
|
||||
|
||||
export function setPollingInterval(url: number) {
|
||||
config.pollingInterval = url;
|
||||
}
|
||||
|
||||
export default config;
|
||||
18
zonemaster-gui/src/content.config.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { defineCollection, z } from 'astro:content';
|
||||
|
||||
const faqCollection = defineCollection({
|
||||
type: 'content',
|
||||
schema: z.object({
|
||||
question: z.string(),
|
||||
category: z.string(),
|
||||
}),
|
||||
});
|
||||
|
||||
export type FaqItem = {
|
||||
question: string;
|
||||
answer: string;
|
||||
};
|
||||
|
||||
export const collections = {
|
||||
faq: faqCollection,
|
||||
};
|
||||
10
zonemaster-gui/src/content/faq/da/difference.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
question: Hvad gør Zonemaster forskellig fra andre DNS-zonetestsoftware?
|
||||
category: Generel information
|
||||
---
|
||||
|
||||
* Zonemaster gemmer hele historien fra tidligere tests baseret på det testede domænenavn, hvilket betyder, at du kan gå tilbage til en test, du foretog for nogen tid siden, og sammenligne den med den test, du lige har kørt.
|
||||
* Alle tests, som Zonemaster udfører, er defineret i Test Case Specification-dokumenterne, som kan findes i [Test Case Specification-dokumenterne](https://github.com/zonemaster/zonemaster/tree/master/docs/public/specifications/tests#zonemaster-test-case-specifications).
|
||||
* Zonemaster kan bruges til at teste [ikke-delegerede domænenavne](https://zonemaster.net/da/faq#what-is-an-undelegated-domain-test).
|
||||
* Zonemaster kan bruges til at teste [DS-registreringer før deres offentliggørelse i forældrezonen](https://zonemaster.net/da/faq#can-i-test-the-ds-records-before-they-are-published).
|
||||
* Denne open source-version af Zonemaster er bygget ved hjælp af modulær kode, hvilket betyder, at du kan integrere dele af den i dine egne systemer, hvis du ønsker det. For eksempel er det ret sjældent, at du vil have et komplet program, bare for at tjekke for omdelegeringer.
|
||||
12
zonemaster-gui/src/content/faq/da/distinguish.md
Normal file
@@ -0,0 +1,12 @@
|
||||
---
|
||||
question: Hvordan kan Zonemaster skelne mellem hvad der er rigtigt og forkert?
|
||||
category: Generel information
|
||||
---
|
||||
|
||||
Zonemasters dom er primært baseret på DNS-standarderne, som er defineret i RFC'er. Den baserer også sin dom på DNS-bedste praksis, som kan være mere løst defineret.
|
||||
|
||||
Alle Zonemaster-tests er defineret i [Test Case Specification-dokumenterne](https://github.com/zonemaster/zonemaster/tree/master/docs/public/specifications/tests#zonemaster-test-case-specifications), hvor henvisninger til standarddokumenterne for hvert testtilfælde findes.
|
||||
|
||||
Beskrivelserne af meddelelsesniveauer som _MEDDELELSE_, _ADVARSEL_ og _FEJL_ findes i [Severity Level Definitions](https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/tests/SeverityLevelDefinitions.md).
|
||||
|
||||
Nogle gange er der forskellige fortolkninger af standarderne eller meninger om, hvad der er bedste praksis, og Zonemaster-holdet er altid åbent for input. Hvis du tror, at vi har gjort en fejl i vores dom, tøv ikke med at sende os en e-mail på [zonemaster-users@lists.iis.se](mailto:zonemaster-users@lists.iis.se) (modereret mailingliste) med et link til dit testresultat og en forklaring på, hvorfor du tror, at det viser noget, som du betragter som forkert.
|
||||
6
zonemaster-gui/src/content/faq/da/dnssec.md
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
question: Verifierer Zonemaster DNSSEC?
|
||||
category: Brug af Zonemaster
|
||||
---
|
||||
|
||||
Ja. Hvis DNSSEC er tilgængeligt for et domænenavn, der testes af Zonemaster, vil det blive tjekket automatisk.
|
||||
6
zonemaster-gui/src/content/faq/da/ds-records.md
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
question: Kan jeg teste DS-registreringerne før de offentliggøres?
|
||||
category: Brug af Zonemaster
|
||||
---
|
||||
|
||||
Ja. Brug knappen "Vis indstillinger" og tilføj derefter Delegation Signer (DS)-registreringerne, der skal testes. Zonemaster vil derefter bruge dem på samme måde som om de allerede var tilføjet i forældrezonen.
|
||||
8
zonemaster-gui/src/content/faq/da/errors.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
question: Zonemaster returnerer "FEJL" eller "ADVARSEL" for mit domænenavn. Hvad betyder det?
|
||||
category: Brug af Zonemaster
|
||||
---
|
||||
|
||||
Det afhænger af, hvilken test mislykkedes for dit domænenavn. Hver test ledsages af en eller flere meddelelser, der beskriver de fundne problemer.
|
||||
|
||||
Du kan også få yderligere indsigt om hver test fra [Test Case Specification-dokumenterne](https://github.com/zonemaster/zonemaster/tree/master/docs/public/specifications/tests#zonemaster-test-case-specifications).
|
||||
11
zonemaster-gui/src/content/faq/da/how-can-zonemaster-help.md
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
question: Hvordan kan Zonemaster hjælpe mig?
|
||||
category: Generel information
|
||||
---
|
||||
|
||||
Værktøjet Zonemaster kan hjælpe forskellige typer brugere:
|
||||
|
||||
* DNS-administratorer, eksperter og begyndere, som vil tjekke deres DNS-konfiguration;
|
||||
* brugere, som vil vide, om det domænenavn, de ejer eller bruger, har problemer eller ej.
|
||||
|
||||
Brugere i den anden kategori bør kontakte deres DNS-operatør, hvis der er fejl eller advarsler for nogen af testene af deres domænenavn.
|
||||
6
zonemaster-gui/src/content/faq/da/ipv6.md
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
question: Understøtter Zonemaster IPv6?
|
||||
category: Brug af Zonemaster
|
||||
---
|
||||
|
||||
Ja. Som standard vil Zonemaster forespørge navneservere både over IPv4 og IPv6, medmindre det er eksplicit konfigureret anderledes. En sådan konfiguration er tilgængelig gennem knappen "Vis indstillinger".
|
||||
12
zonemaster-gui/src/content/faq/da/not-tested.md
Normal file
@@ -0,0 +1,12 @@
|
||||
---
|
||||
question: Hvorfor kan mit domænenavn ikke testes?
|
||||
category: Brug af Zonemaster
|
||||
---
|
||||
|
||||
Der er flere muligheder.
|
||||
|
||||
* Dit domænenavn er endnu ikke delegeret.
|
||||
* Dit domænenavn er ikke tilgængeligt fra det offentlige internet.
|
||||
* Zonemaster kan kun teste, hvad der kaldes en DNS-zone, for eksempel 'zonemaster.net', og ikke værtsnavne, som 'www.zonemaster.net'.
|
||||
* Der er en 10 minutters beskyttelse mellem på hinanden følgende tests for et givet domænenavn, med samme testparametre. At køre en test inden for dette vindue vil i stedet vise den seneste tilgængelige test for det domænenavn og parametre.
|
||||
* Du har stavet dit domænenavn forkert.
|
||||
8
zonemaster-gui/src/content/faq/da/privacy.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
question: Zonemaster og privatliv
|
||||
category: Generel information
|
||||
---
|
||||
|
||||
Intet andet end det testede domæne, andre testparametre og resultatet bliver gemt i databasen. Specifikt gemmer vi ikke nogen information, der kunne knytte en test til brugeren, der initierede den.
|
||||
|
||||
Dog, da [zonemaster.net](https://zonemaster.net), ligesom andre offentlige instanser, er åben for alle, er det muligt for enhver at teste dit domæne og se dets testhistorie.
|
||||
10
zonemaster-gui/src/content/faq/da/queries.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
question: Hvilken type DNS-forespørgsler genererer Zonemaster?
|
||||
category: Generel information
|
||||
---
|
||||
|
||||
Zonemaster sender flere DNS-forespørgsler til navneserverne, der værter det domænenavn, der testes, og også til navneserverne, der værter forældrezonen for det domænenavn.
|
||||
|
||||
Webgrænsefladen for Zonemaster viser ikke de forespørgsler, der blev sendt, kun CLI-grænsefladen gør det. Hvis du vil se sådanne forespørgsler, skal du installere en lokalt fungerende Zonemaster-instans med både Engine- og CLI-komponenterne. Se [CLI-installationsdokumentet](https://github.com/zonemaster/zonemaster/blob/master/docs/public/installation/zonemaster-cli.md) for mere information, eller hvis du foretrækker et [Docker-billede](https://github.com/zonemaster/zonemaster/blob/master/docs/public/using/cli.md#Invoking-the-command-line-tool-using-Docker) er også tilgængeligt.
|
||||
|
||||
De sendte forespørgsler kan vises ved hjælp af 'DEBUG'-niveauindstillingen. Advarsel, uddata fra CLI kan være ret omfattende. For mere information, se [CLI-brugsdokumentation](https://github.com/zonemaster/zonemaster/blob/master/docs/public/using/cli.md).
|
||||
11
zonemaster-gui/src/content/faq/da/reverse-zone.md
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
question: Hvordan kan jeg teste en "omvendt" zone med Zonemaster?
|
||||
category: Brug af Zonemaster
|
||||
---
|
||||
|
||||
For at tjekke en omvendt zone med Zonemaster, skal man først vide, hvad den omvendte zone er, og indtaste den i det format, den har i DNS. En omvendt zone opnås ved at vende en IP-adresse og tilføje et suffiks. IPv4-adresser bruger suffikset "in-addr.arpa", mens IPv6-adresser bruger "ip6.arpa".
|
||||
|
||||
Eksempler:
|
||||
|
||||
* for IPv4-præfiks "198.51.100.0/24": 100.51.198.in-addr.arpa
|
||||
* for IPv6-præfiks "2001:db8::/32": 8.b.d.0.1.0.0.2.ip6.arpa
|
||||
19
zonemaster-gui/src/content/faq/da/severity-levels.md
Normal file
@@ -0,0 +1,19 @@
|
||||
---
|
||||
question: Hvad betyder sværhedsgradene?
|
||||
category: Brug af Zonemaster
|
||||
---
|
||||
|
||||
Info
|
||||
: Meddelelsen er noget, der måske er af interesse for zonens administrator, men som bestemt ikke indikerer et problem.
|
||||
|
||||
Meddelelse
|
||||
: Meddelelsen betyder noget, som zonens administrator bør vide, men som ikke nødvendigvis er et problem.
|
||||
|
||||
Advarsel
|
||||
: Meddelelsen betyder noget, der under visse omstændigheder vil være et problem, men som sandsynligvis ikke vil blive bemærket af en tilfældig bruger.
|
||||
|
||||
Fejl
|
||||
: Meddelelsen betyder et problem, der meget sandsynligt (eller måske sikkert) vil påvirke funktionen af den zone, der testes, negativt, men ikke så alvorligt, at hele zonen bliver uopløselig.
|
||||
|
||||
Kritisk
|
||||
: Meddelelsen betyder en meget alvorlig fejl.
|
||||
31
zonemaster-gui/src/content/faq/da/test-case-identifiers.md
Normal file
@@ -0,0 +1,31 @@
|
||||
---
|
||||
question: Hvad er testtilfældeidentifikatorer?
|
||||
category: Brug af Zonemaster
|
||||
---
|
||||
|
||||
Alle testtilfælde tilhører et specifikt testniveau, og deres navne er baseret på navnet på dette testniveau. Følgende testniveauer er defineret og tilgængelige:
|
||||
|
||||
- Address
|
||||
- Basic
|
||||
- Connectivity
|
||||
- Consistency
|
||||
- DNSSEC
|
||||
- Delegation
|
||||
- Nameserver
|
||||
- Syntax
|
||||
- Zone
|
||||
|
||||
Navnet på testniveauet er ikke skriftstørrelsesfølsomt, men de former, der er defineret ovenfor, skal bruges, når der henvises til testniveauerne, dvs. kun den første bogstav er stort, undtagen akronymer, hvor alle bogstaver er store. For eksempel "Address" og hverken "ADDRESS" eller "address".
|
||||
|
||||
Testtilfældeidentifikatoren i testtilfældespecifikationen (både i hovedoverskriften og i afsnittet "Testtilfældeidentifikator") bruger navnet på testniveauet, som defineret ovenfor, og har formatet: `{Testniveau navn} + {Indeks}`
|
||||
|
||||
Når der henvises til et testtilfælde, skal bogstavstørrelsen, der er defineret ovenfor, bruges til navnet på testniveauet for læsbarhed.
|
||||
|
||||
`{Indeks}` er et to-cifret suffiks 01-99, og skal vælges, så testtilfældeidentifikatoren er unik. Normalt vælges det første ledige indeks.
|
||||
|
||||
Eksempler på testtilfældeidentifikatorer:
|
||||
|
||||
- Address03
|
||||
- Basic04
|
||||
- DNSSEC15
|
||||
- Zone06
|
||||
10
zonemaster-gui/src/content/faq/da/undelegated.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
question: Hvad er en ikke-delegeret domænetest?
|
||||
category: Brug af Zonemaster
|
||||
---
|
||||
|
||||
En ikke-delegeret domænetest er en test, der udføres på et domænenavn, der måske er, eller måske ikke er, fuldt offentliggjort i DNS.
|
||||
|
||||
Dette kan være meget nyttigt, hvis man skal migrere sit domæne fra en registrator til en anden, for eksempel migrere zonen 'example.com' fra navneserveren 'ns.example.com' til navneserveren 'ns.example.org'. I dette scenarie kan man udføre en ikke-delegeret domænetest, der leverer zonen ('example.com') og navneserveren, man migrerer til ('ns.example.org'), før man migrerer sit domæne.
|
||||
|
||||
Når testresultaterne ikke viser nogen fejl eller advarsler, kan man være ret sikker på, at domænets nye placering fungerer godt. Der kan dog stadig være andre problemer i zonedataene selv, som denne test ikke er opmærksom på.
|
||||
17
zonemaster-gui/src/content/faq/da/what-is-zonemaster.md
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
question: Hvad er Zonemaster?
|
||||
category: Generel information
|
||||
---
|
||||
|
||||
Zonemaster er et softwarepakke, der validerer kvaliteten af en DNS-delegering.
|
||||
|
||||
Ambitionen bag Zonemaster-projektet er at udvikle og vedligeholde et open source DNS-validationsværktøj, der tilbyder forbedret ydeevne i forhold til eksisterende værktøjer og leverer omfattende dokumentation, der kan genbruges af lignende projekter i fremtiden.
|
||||
|
||||
Zonemaster består af flere moduler eller komponenter:
|
||||
|
||||
- Engine, et testrammeværk, der understøtter al funktionalitet til udførelse af DNS-tests;
|
||||
- CLI, en kommandolinjegrænseflade til Engine;
|
||||
- Backend, en server, der gør det muligt at køre Zonemaster-tests og gemme resultater ved hjælp af en JSON-RPC-API og en database;
|
||||
- GUI, en webgrænseflade til Backend.
|
||||
|
||||
Komponenterne vil hjælpe forskellige typer brugere med at tjekke et domænes navneservere for konfigurationfejl og generere en rapport, der vil hjælpe med at rette fejlene.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
question: Hvem står bag Zonemaster?
|
||||
category: Generel information
|
||||
---
|
||||
|
||||
Zonemaster er et fælles projekt mellem [AFNIC](https://www.afnic.fr/en/), registret for ".fr" TLD og flere andre TLD'er som ".re", ".pm", ".tf", ".wf", ".yt" og ".paris", og [The Swedish Internet Foundation](https://internetstiftelsen.se/en/), registret for ".se" og ".nu" TLD'er.
|
||||
11
zonemaster-gui/src/content/faq/en/difference.md
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
question: What makes Zonemaster different from other DNS zone validating software?
|
||||
category: General information
|
||||
---
|
||||
|
||||
* Zonemaster saves all history from earlier tests based on the tested domain name, which means you can go back to a test you did some time ago and compare it to the test you ran just a moment ago.
|
||||
* All tests that Zonemaster runs are defined in the Test Case Specification documents that can be found in the [Test Case Specification documents](https://github.com/zonemaster/zonemaster/tree/master/docs/public/specifications/tests#zonemaster-test-case-specifications).
|
||||
* Zonemaster can be used to test [undelegated domain names](https://zonemaster.net/en/faq#what-is-an-undelegated-domain-test).
|
||||
* Zonemaster can be used to test [DS records before their publication in the parent zone](https://zonemaster.net/en/faq#can-i-test-the-ds-records-before-they-are-published).
|
||||
* This open source version of Zonemaster was built using modular code which basically means that you can integrate parts of it in your own systems, if you wish. For example, it is quite rare that you would want a complete program just to check for redelegations.
|
||||
|
||||
12
zonemaster-gui/src/content/faq/en/distinguish.md
Normal file
@@ -0,0 +1,12 @@
|
||||
---
|
||||
question: How can Zonemaster distinguish between what is right and wrong?
|
||||
category: General information
|
||||
---
|
||||
|
||||
The judgement of Zonemaster is primarily based on the DNS standards as defined in RFCs. It also bases its judgement on DNS best practices, which can be more loosely defined.
|
||||
|
||||
All Zonemaster tests are defined in the [Test Case Specification documents](https://github.com/zonemaster/zonemaster/tree/master/docs/public/specifications/tests#zonemaster-test-case-specifications) in which the references to the standard documents for each test case are found.
|
||||
|
||||
The descriptions of message levels such as _NOTICE_, _WARNING_ and _ERROR_ are found in [Severity Level Definitions](https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/tests/SeverityLevelDefinitions.md).
|
||||
|
||||
Sometimes there are different interpretations of the standards or opinions on what is best practice, and the Zonemaster team is always open to input. If you think we have made a mistake in our judgement please do not hesitate to send us an email at [zonemaster-users@lists.iis.se](mailto:zonemaster-users@lists.iis.se) (moderated mailing list) with a link to your test result and an explanation as to why you think it shows something that you consider incorrect.
|
||||
6
zonemaster-gui/src/content/faq/en/dnssec.md
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
question: Does Zonemaster verify DNSSEC?
|
||||
category: Using Zonemaster
|
||||
---
|
||||
|
||||
Yes. If DNSSEC is available for a domain name that is tested by Zonemaster, it will be checked automatically.
|
||||
6
zonemaster-gui/src/content/faq/en/ds-records.md
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
question: Can I test the DS records before they are published?
|
||||
category: Using Zonemaster
|
||||
---
|
||||
|
||||
Yes. Use the "Show options" button and there add the Delegation Signer (DS) records to be tested. Zonemaster will then use those in the same way as if they were already added in the parent zone.
|
||||
8
zonemaster-gui/src/content/faq/en/errors.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
question: Zonemaster returns "Error" or "Warning" for my domain name. What does it mean?
|
||||
category: Using Zonemaster
|
||||
---
|
||||
|
||||
It depends on which test failed for your domain name. Each test is accompanied with one or several messages describing the issues found.
|
||||
|
||||
You can also get further insight about each test from the [Test Case Specification documents]( https://github.com/zonemaster/zonemaster/tree/master/docs/public/specifications/tests#zonemaster-test-case-specifications).
|
||||
11
zonemaster-gui/src/content/faq/en/how-can-zonemaster-help.md
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
question: How can Zonemaster help me?
|
||||
category: General information
|
||||
---
|
||||
|
||||
The Zonemaster tool could help different kind of users:
|
||||
|
||||
* DNS administrators, experts and beginners alike, who want to check their DNS configuration;
|
||||
* users who want to know whether the domain name they own or use have any issues or not.
|
||||
|
||||
Users of the second category should contact their DNS operator in case there are errors or warnings for any test of their domain name.
|
||||
6
zonemaster-gui/src/content/faq/en/ipv6.md
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
question: Does Zonemaster support IPv6?
|
||||
category: Using Zonemaster
|
||||
---
|
||||
|
||||
Yes. By default Zonemaster will query name servers both over IPv4 and IPv6, unless explicitly configured otherwise. Such configuration is accessible through the "Show options" button.
|
||||