Compare commits

...

283 Commits
master ... dev

Author SHA1 Message Date
Philippe Pittoli 645d6836c3 Some explanations.
6 hours ago
Philippe Pittoli 896254092a WIP: explanations. Text can now be justified. Dedicated `explanation` function.
9 hours ago
Philippe Pittoli 7e311d7ba0 WIP: SPF: display correctly the Mechanism and Modifier forms.
10 hours ago
Philippe Pittoli 2a75f54a47 Give logs a title.
1 day ago
Philippe Pittoli b4a68fbaf2 Nice tags before tables.
1 day ago
Philippe Pittoli 5ed64fc8c0 Display of zones: two columns solution. Not great, not terrible.
2 days ago
Philippe Pittoli 2f2d02249b Minor code changes.
2 days ago
Philippe Pittoli c35544f55e SPF: interface ± done. Works as expected. Next step: validations.
3 days ago
Philippe Pittoli 7593702398 Minor syntax detail.
3 days ago
Philippe Pittoli e893a6dca2 WIP: SPF. Can now remove mechanisms.
3 days ago
Philippe Pittoli e21ff35835 Allow empty names for root domain RR, like usually SPF and MX.
3 days ago
Philippe Pittoli 82bf6b57b4 WIP: SPF. Display mechanisms.
4 days ago
Philippe Pittoli bf97e0bc60 minor code cleaning
4 days ago
Philippe Pittoli 8f75a4e88b WIP: SPF interface. Different types were implemented (Mechanism, Modifier, Qualifier).
4 days ago
Philippe Pittoli 4a8451a388 Display mechanisms.
4 days ago
Philippe Pittoli 73fcdd0b7c WIP: SPF. Add Qualifier type.
4 days ago
Philippe Pittoli 0beba6ea6d WIP: SPF interface.
4 days ago
Philippe Pittoli 10f9f7ebb5 WIP: SPF
5 days ago
Philippe Pittoli b8b766007c Remove useless message in the logs.
6 days ago
Philippe Pittoli 755a2a577d Can ask `dnsmanagerd` for the final zonefile, fancy display.
6 days ago
Philippe Pittoli 1f2142e62b `dnsmanagerd`: ask and receive generated zone file.
6 days ago
Philippe Pittoli b155ee1d2f Add some admin messages: GenerateAllZoneFiles + GenerateZoneFile.
1 week ago
Philippe Pittoli 0793b2c878 InsufficientRights
1 week ago
Philippe Pittoli b448278c84 dnsmanagerd: Maintenance message slightly changed.
1 week ago
Philippe Pittoli f6602be98f Change the form for new domains, this should fix phone rendering.
1 week ago
Philippe Pittoli 33a8d451ba box_input -> box_password
1 week ago
Philippe Pittoli 648fca9352 Some form validations.
1 week ago
Philippe Pittoli 065bc7a716 Password can now be recovered!
1 week ago
Philippe Pittoli 66820d0dd4 New Setup page, to handle user account administration.
1 week ago
Philippe Pittoli e480469ac6 Smaller header.
1 week ago
Philippe Pittoli cd5477b269 Navbar now is fully functional and fancy.
1 week ago
Philippe Pittoli 3098372879 Fix the navbar.
1 week ago
Philippe Pittoli b3b84959e6 Rendering isn't great, but that seems to work good enough for now.
1 week ago
Philippe Pittoli 27a96dc74e Navigation Interface component: WIP.
1 week ago
Philippe Pittoli 6c4ed85335 Navigation bar now has a dedicated component.
2 weeks ago
Philippe Pittoli 88b1221569 Automatic routing to DomainList page when authentication happens on Authentication page.
2 weeks ago
Philippe Pittoli 523df99f5c Fix typo, minor bugfix.
2 weeks ago
Philippe Pittoli e6bb3c53d6 Display errors on DomainList interface.
2 weeks ago
Philippe Pittoli 6883263b24 Read-only RRs: display a single button.
2 weeks ago
Philippe Pittoli d6f85b5a00 Zone Interface: group RO RRs and a better display of RRs in general.
2 weeks ago
Philippe Pittoli 419d68784a Do not allow modification of read only RRs.
2 weeks ago
Philippe Pittoli 926f461a51 Many Bulma CSS classes, mostly about colors.
2 weeks ago
Philippe Pittoli f668edda86 New API for logs, no more SimpleLog.
2 weeks ago
Philippe Pittoli 1d15a47c77 Improved API for logs (new SuccessLog & ErrorLog).
2 weeks ago
Philippe Pittoli c2e51dc964 Administration page now handles administration for both `authd` and `dnsmanagerd`.
2 weeks ago
Philippe Pittoli 1b1c7e80c7 Add old code, for reference.
2 weeks ago
Philippe Pittoli 07135d2ea3 Implement Keep Alive messages.
2 weeks ago
Philippe Pittoli b6b6a6be77 WS: `send_message` function. Will soon serve for sending keepalive messages.
2 weeks ago
Philippe Pittoli bcc76c8378 Fix the page reload problem not routing for the right page.
2 weeks ago
Philippe Pittoli 529c2edae7 Make the code flow clearer.
2 weeks ago
Philippe Pittoli d84c5f789a Automatically re-authenticate to authd on page reload.
2 weeks ago
Philippe Pittoli 0f0d016ad7 Admin: render list of users differently.
2 weeks ago
Philippe Pittoli 7895c3f52c Can now remove an user in the Authentication Daemon Admin Interface.
2 weeks ago
Philippe Pittoli 3e0d4ecfe6 Remove original Interface.
2 weeks ago
Philippe Pittoli 3310a48fd2 Bulma: remove dead code comments.
2 weeks ago
Philippe Pittoli f53c265114 Authentication Daemon Administration Interface: search for a user!
2 weeks ago
Philippe Pittoli 98a30b6c1d Authd: authentication by token (useful on page reload).
2 weeks ago
Philippe Pittoli b6655a0ee0 Clear all stored session data when user disconnects himself.
2 weeks ago
Philippe Pittoli abf03de8c9 Authentication Daemon Administrative Interface.
2 weeks ago
Philippe Pittoli c9bbe81d09 Labeled button.
2 weeks ago
Philippe Pittoli 58eee12511 Code cleaning (buttons).
2 weeks ago
Philippe Pittoli c017dc1b05 Cleaning the code.
2 weeks ago
Philippe Pittoli 1a0b48134e Bulma modal, refactored and simplified.
2 weeks ago
Philippe Pittoli fefe6769f2 WIP: Authd Admin: Search User Interface.
2 weeks ago
Philippe Pittoli b60913ef02 WIP: Authd Admin: Search User Interface.
2 weeks ago
Philippe Pittoli ef22dd22c3 WIP: Authd Admin: Search User Interface.
2 weeks ago
Philippe Pittoli 554280956b Validation: simplification from new Parser functions (errorParser and <:>).
2 weeks ago
Philippe Pittoli de758a9e49 DNS validation: use the G.<:> function.
2 weeks ago
Philippe Pittoli aec64681eb Quick fix to generate the documentation.
2 weeks ago
Philippe Pittoli 6abd592aa5 input_with_side_text
3 weeks ago
Philippe Pittoli 8f16222114 Use new `errorParser` and `<:>` functions.
3 weeks ago
Philippe Pittoli 8d3ecb1c14 Comments on what has been done and what should be done.
3 weeks ago
Philippe Pittoli 5a38838f88 Remove confusing typing.
3 weeks ago
Philippe Pittoli 6cda323c9f minor comment change
3 weeks ago
Philippe Pittoli 871e4ad4b3 Change the subtitle, alpha version is coming!
3 weeks ago
Philippe Pittoli 065ca206da Minor changes: slight change to some logs.
3 weeks ago
Philippe Pittoli 5fc15be352 Some minor changes for convenience.
3 weeks ago
Philippe Pittoli f9f79875c0 Add mail verification.
3 weeks ago
Philippe Pittoli 3f2573831a Registration: validation works.
3 weeks ago
Philippe Pittoli 9a19462a99 Validate login (alphanum), email, password (vchar).
3 weeks ago
Philippe Pittoli dc7ee7d250 WIP: validation for the email address at registration.
3 weeks ago
Philippe Pittoli 329d84e6f9 Change a few names, split authentication and registration.
3 weeks ago
Philippe Pittoli 41b4511a94 Use (#) instead of ($) for multi-line function chaining.
3 weeks ago
Philippe Pittoli 42192fb9e9 Better rendition of the zone content (empty line between record groups).
3 weeks ago
Philippe Pittoli 412a06d10b Page reload: DONE!
4 weeks ago
Philippe Pittoli 7544cb90ee WIP: automatic re-authentication to `dnsmanagerd` on page reload.
4 weeks ago
Philippe Pittoli c9c1b81912 WS Module comments.
4 weeks ago
Philippe Pittoli 5a987a524c Better display of resource records.
4 weeks ago
Philippe Pittoli 4f785e6dcc Largely simplify the Bulma module.
4 weeks ago
Philippe Pittoli 32fe44e34c Massive code removal!
4 weeks ago
Philippe Pittoli e63bfdca3c DROP: add some examples of Regex uses, that will be removed from production code.
4 weeks ago
Philippe Pittoli 4813d5dd60 Remove RR.purs (now useless).
4 weeks ago
Philippe Pittoli 6367bf8a86 ZoneInterface: the interface change is almost complete.
4 weeks ago
Philippe Pittoli cf6370640d WIP: replacing the dedicated records with ResourceRecord. Compiles again!
4 weeks ago
Philippe Pittoli 0cc1fec90b WIP: switching to ResourceRecord everywhere. Cannot compile ATM.
4 weeks ago
Philippe Pittoli 0838c962f0 Compiles again. CurrentRR Modal is on the way.
4 weeks ago
Philippe Pittoli e343523142 WIP: modals. CANNOT COMPILE ATM.
4 weeks ago
Philippe Pittoli 1f4191acba WIP: massive code cleaning & _resources array for all RRs.
4 weeks ago
Philippe Pittoli 2904a0e089 UpdateLocalForm: simpler code, could replace dozens and dozens of lines.
4 weeks ago
Philippe Pittoli 08dcd6d875 WIP: a single entry in the state for all resources.
4 weeks ago
Philippe Pittoli cfd356a650 Provide error messages + fix some warnings.
4 weeks ago
Philippe Pittoli 2b8a640427 Errors are displayed in a fancy way.
4 weeks ago
Philippe Pittoli 4a10ffa4e3 Validation: parsers for about everything. WIP.
1 month ago
Philippe Pittoli 64fe15aff7 Validation: both simplification and slowly using GenericParser.
1 month ago
Philippe Pittoli 38bbc36a88 AcceptedRRTypes.
1 month ago
Philippe Pittoli 1171703b62 A new path for the validation process. Will be rewritten with GenericParser!
1 month ago
Philippe Pittoli 28c1d56b6f WIP Validation, CANNOT COMPILE ATM.
1 month ago
Philippe Pittoli bbc258bc58 minor
1 month ago
Philippe Pittoli 8310488e82 Remove unused code.
1 month ago
Philippe Pittoli d6f49210a8 Remove the modal when the "add" button is clicked.
1 month ago
Philippe Pittoli 7fcb9d73a9 Remove a lot of obsolete code.
1 month ago
Philippe Pittoli 68a06928ca WIP: code clean-up. loopE to loop over Halogen evenful functions.
1 month ago
Philippe Pittoli 272237a5a1 WIP: modal forms.
1 month ago
Philippe Pittoli c448521df7 WIP: (slowly) replacing fixed "new RR" forms with modal forms.
1 month ago
Philippe Pittoli c9552677ab Bulma "level" layout.
1 month ago
Philippe Pittoli 22053089af WIP: bulma modal caps + remove some warnings.
1 month ago
Philippe Pittoli 047c21103f WIP: Bulma module now has modal capabilities.
1 month ago
Philippe Pittoli f579353d11 Start using GenericParser.
1 month ago
Philippe Pittoli b4d80d2c71 New dependency: generic-parser (+ install it locally from its git repository).
1 month ago
Philippe Pittoli efbadd09f8 README: remove old content.
1 month ago
Philippe Pittoli 6829b6445b Put all decoding message code in Container instead of AuthenticationForm.
5 months ago
Philippe Pittoli 7178b29ae1 Remove redundant code.
5 months ago
Philippe Pittoli 7c6cb46c12 ZoneInterface is now somewhat working again. Should remove useless log messages.
5 months ago
Philippe Pittoli 5ac94bf0fe Can build again
5 months ago
Philippe Pittoli ab654ddbe7 Comments.
7 months ago
Philippe Pittoli 8786af38a7 Decode DNS messages in the Container module (WIP: NOT BUILDABLE).
7 months ago
Philippe Pittoli e1dcf5c40b Prevent new domain request until new subdomain is correct.
7 months ago
Philippe Pittoli fa4e6703ee New domains are now tested before submit.
7 months ago
Philippe Pittoli 729eedf475 Comments.
7 months ago
Philippe Pittoli 26b1c59937 Domain Parser: return the last point.
7 months ago
Philippe Pittoli 91337d0f57 Comments.
7 months ago
Philippe Pittoli f1f30c8bcd DomainParser: removed warnings.
7 months ago
Philippe Pittoli 1101ab70bd PlayingWithParsers == HomeInterface
7 months ago
Philippe Pittoli 016f0e03c5 DomainParser
7 months ago
Philippe Pittoli f81449c100 Last commit before BOOM.
7 months ago
Philippe Pittoli 3314add2fb Domain parsing is now almost complete.
7 months ago
Philippe Pittoli f60b1a7568 Playing with parsers: reading domain labels is okay-ish.
8 months ago
Philippe Pittoli ff46b7937a Bulma: strong
8 months ago
Philippe Pittoli a297cddb0e Playing with parsers!
8 months ago
Philippe Pittoli 99eedc1c15 Bulma: code + text
8 months ago
Philippe Pittoli 37de517c60 Playing with parsers some more.
8 months ago
Philippe Pittoli fb2b4ec86a Spago: add 'control' module (for parsing).
8 months ago
Philippe Pittoli b14d63459b PlayingWithParsers
8 months ago
Philippe Pittoli ae0de9d734 Add a simple input module as an example.
8 months ago
Philippe Pittoli ef3be6cc76 Take care of many error responses.
8 months ago
Philippe Pittoli c168c36dd0 Password recovery (draft).
8 months ago
Philippe Pittoli b059b42bfc Navbar: single button for login and register.
8 months ago
Philippe Pittoli 54e7e77c5a Delete button for removing domains.
8 months ago
Philippe Pittoli 576e036501 Disconnection button.
8 months ago
Philippe Pittoli 6705d29dba Textareas for TXT records.
8 months ago
Philippe Pittoli 3e358f04fc THIS IS AN ALPHA RELEASE
8 months ago
Philippe Pittoli 62078e04b8 Navbar rewrite.
8 months ago
Philippe Pittoli e4c696b656 Rework on the home page and the navbar.
8 months ago
Philippe Pittoli eb780fc5ce HomeInterface: module can be compiled, nothing to render yet.
8 months ago
Philippe Pittoli e172a41f2d HomeInterface, WIP.
8 months ago
Philippe Pittoli 8e83eb3b56 Better new RR forms.
8 months ago
Philippe Pittoli e60664b522 Better forms.
8 months ago
Philippe Pittoli 4767bd186c No more useless columns.
8 months ago
Philippe Pittoli 2d31751b09 Better tables + SOA display is now okay-ish.
8 months ago
Philippe Pittoli 9b674a9d1e Show errors for both Simple, MX and SRV RR.
8 months ago
Philippe Pittoli b0b0429ace Show actual errors.
8 months ago
Philippe Pittoli 9e55254f91 Add a new error line when an error in a RR occurs. Empty for now.
8 months ago
Philippe Pittoli e07e5f35cd Add a (still commented) function to refactor update code.
8 months ago
Philippe Pittoli 50eeb340f8 Slight refactoring.
8 months ago
Philippe Pittoli 106245c6c6 Many more small contributions for the validation module.
8 months ago
Philippe Pittoli f261e836b4 Let's try some parsing.
8 months ago
Philippe Pittoli 2c439667cf Move AlternativeMain (will probably be ignored forever).
8 months ago
Philippe Pittoli 65857a7155 Fix warnings.
8 months ago
Philippe Pittoli 418f6d74cd Compiles again, but not everything will work (still validations to do!)
8 months ago
Philippe Pittoli 15eb7d9acb `andThen`
8 months ago
Philippe Pittoli 5fdbcc6058 Fix most errors in the validation module.
8 months ago
Philippe Pittoli 66cc65dc52 Validation: WIP. Still cannot build for the moment.
8 months ago
Philippe Pittoli db6987b3a8 Validation: first draft. WIP. Cannot build atm.
8 months ago
Philippe Pittoli bf0db1417d (minor) remove some logs.
8 months ago
Philippe Pittoli c0ed930bea Rewrite RecordBase type (in RR.purs) to match ResourceRecord.
8 months ago
Philippe Pittoli 7c5574e3d4 Remove Finalize action.
8 months ago
Philippe Pittoli 52bbebd879 RR.purs: clean unused code.
8 months ago
Philippe Pittoli 297f0312bd New RRUpdated & RRReadOnly return messages.
8 months ago
Philippe Pittoli d23699d85a Sync RR.
8 months ago
Philippe Pittoli f0db34d694 All updates in only two actions.
8 months ago
Philippe Pittoli c307e1679e Fix warnings.
8 months ago
Philippe Pittoli c2fb32b547 fromLocalToRR + some code removal
8 months ago
Philippe Pittoli 15012f3824 Cosmetic changes (fix -> save, X -> remove) + comments.
8 months ago
Philippe Pittoli 437722c323 Add "Protocol" attribute to SRV RR.
8 months ago
Philippe Pittoli f883dcd27a SOA is now supported.
8 months ago
Philippe Pittoli a6e6e84cb7 Commit some unused code.
8 months ago
Philippe Pittoli 2fb58ea458 Update comments.
8 months ago
Philippe Pittoli 4467ceaa74 Remove most debug logs.
8 months ago
Philippe Pittoli 8c1b0b8b76 Minor fix for the zone update.
8 months ago
Philippe Pittoli cf8380fff4 Add new entries!
8 months ago
Philippe Pittoli 0680c9f1ab Zone is correctly received. SOA todo.
8 months ago
Philippe Pittoli 88226019fd Add real data from the server: WIP.
8 months ago
Philippe Pittoli e60ce8f8b4 Can add new MX RR. RR removal implies a modal.
8 months ago
Philippe Pittoli 2f7ac68e2c Further cleaning of the ZoneInterface module.
8 months ago
Philippe Pittoli 252fbac269 Classes are in CSSClasses, some unused code removed, etc.
8 months ago
Philippe Pittoli b976cd2ebc Remove now useless App.Style module.
8 months ago
Philippe Pittoli c0db4a93e0 ZoneInterface now uses mostly the Bulma module.
8 months ago
Philippe Pittoli 44004ec96e ZoneInterface: log decode errors, log received Zone.
8 months ago
Philippe Pittoli fbb34ba0fe TTL limit actually isn't sent.
8 months ago
Philippe Pittoli 8130a90f4a Container now provides messages from dnsmanagerd to the ZoneInterface module.
8 months ago
Philippe Pittoli 5dc03a9649 Interface slightly fixed.
8 months ago
Philippe Pittoli faf7129989 Forgot a value in the ResourceRecord type.
8 months ago
Philippe Pittoli b89eae5a82 DNSZone now relates to the actual DNSZone on dnsmanagerd.
8 months ago
Philippe Pittoli 1870c5df50 RRDeleted message.
8 months ago
Philippe Pittoli 302b18c9ff Minor changes.
8 months ago
Philippe Pittoli f03909f83d ResourceRecord type is now implemented to handle incoming messages.
8 months ago
Philippe Pittoli b3e422c38f Remove the App.Button module (only served as an example).
8 months ago
Philippe Pittoli 44e4331943 ZoneInterface: remove the DoNothing action.
8 months ago
Philippe Pittoli c0d38d09bb ZoneInterface another stab at cleaning the whole module.
8 months ago
Philippe Pittoli d9518bc563 ZoneInterface rewrite: WIP. Updates for new RR are now cleaner (1 action).
8 months ago
Philippe Pittoli f9ab384d06 ZoneInterface outputs are taken care of.
8 months ago
Philippe Pittoli b178a830cc Tiles + titles.
8 months ago
Philippe Pittoli 7f08646fda Show a zone template.
8 months ago
Philippe Pittoli 6ccc1846df Adding a WIP zone interface. Not even showable ATM.
8 months ago
Philippe Pittoli 2072347df0 Add a modal to confirm the removal of a domain.
8 months ago
Philippe Pittoli 796cd3ea55 Store the AuthenticationDaemonAdminInterface state, too.
8 months ago
Philippe Pittoli f6f78f49ed Store the state of DomainListInterface in its parent. IT WORKS!
8 months ago
Philippe Pittoli 507330120e Add some documentation for DomainListInterface.
8 months ago
Philippe Pittoli 572dfc88a4 Make the compiler happy (remove useless imports).
8 months ago
Philippe Pittoli 367e914fc7 At last, some documentation. Just a scratch on the surface.
8 months ago
Philippe Pittoli 05f256b4e8 Generate and serve documentation.
8 months ago
Philippe Pittoli dafb90b71a Problem to fix: state is rewritten when changing page.
8 months ago
Philippe Pittoli a395b88ef2 Better (pseudo-)routing.
8 months ago
Philippe Pittoli 05f751dd21 Actual navigation WIP.
8 months ago
Philippe Pittoli 0e29dc5df6 Navbar in a separate file.
8 months ago
Philippe Pittoli afe576a557 Coding style corrections.
8 months ago
Philippe Pittoli ed4ac04c28 Bulma: provide remaining signatures.
8 months ago
Philippe Pittoli e4fbe59a3b Clearer netlib.re navbar.
8 months ago
Philippe Pittoli 46d9352a16 Bulma cleaning (WIP). Removing some useless stuff.
8 months ago
Philippe Pittoli 7c88287f2b Oopsie.
8 months ago
Philippe Pittoli dac8067508 CSS classes in a separate module.
8 months ago
Philippe Pittoli ac9492b62e Decorative navbar.
8 months ago
Philippe Pittoli caaefcca3e Show the URL of the WS connection.
8 months ago
Philippe Pittoli 0fb4fcd608 Style (minor). Are sections even useful?
8 months ago
Philippe Pittoli 9f4600b1e8 Style, again. Improved DomainList UI.
8 months ago
Philippe Pittoli de52e40036 Style.
8 months ago
Philippe Pittoli 53fdefd790 New LogMessage structure.
8 months ago
Philippe Pittoli d99e38d1b8 Some name changes (+ fix).
8 months ago
Philippe Pittoli fb7c07e64d Change some names.
8 months ago
Philippe Pittoli 85df40cc23 Better message routing.
8 months ago
Philippe Pittoli 634b30bbf5 Change some log messages.
8 months ago
Philippe Pittoli 5ed167d8bb NewDomainInterface is now connected to the other components.
8 months ago
Philippe Pittoli a145577791 Compiles again! :)
8 months ago
Philippe Pittoli 07008d9038 WIP: CAN'T BE COMPILED. WILL BE SOON FIXED.
8 months ago
Philippe Pittoli c2569bc959 Small code reduction.
8 months ago
Philippe Pittoli b061c0b18e Remove printing messages in AuthenticationDaemonAdminInterface.
8 months ago
Philippe Pittoli 3be96bd436 Log all authentication form messages.
8 months ago
Philippe Pittoli 7c9f5a7a56 UX
8 months ago
Philippe Pittoli 6d4268820d Log component!
8 months ago
Philippe Pittoli 51f5ba79f1 A single component for WS, another one for messages. WIP!
8 months ago
Philippe Pittoli 88aa805613 WS component (WIP).
8 months ago
Philippe Pittoli 320ff4f2ec Fix admin toggle.
8 months ago
Philippe Pittoli b2caff5123 Bulma: introduce some fields.
8 months ago
Philippe Pittoli 4522c22c42 Reset subdomain input when sending a NewDomain message.
8 months ago
Philippe Pittoli cbaeaf8ee2 Slight code simplification.
8 months ago
Philippe Pittoli 62347d40b2 Domain can be deleted - with automatic update of the own domain list.
8 months ago
Philippe Pittoli 99fb18c57a Can now delete a domain. No automatic domain list update.
8 months ago
Philippe Pittoli e0fc55e5ca Put websocket info in a dedicated record.
8 months ago
Philippe Pittoli 15e407972a Remove another big chunk of code.
8 months ago
Philippe Pittoli 026e3f055a Remove a massive amount of redundant code.
8 months ago
Philippe Pittoli 87731bf061 Removing useless imports.
8 months ago
Philippe Pittoli 771573ec5c App.Utils.
8 months ago
Philippe Pittoli 3dddbf6990 (minor) remove a useless line.
8 months ago
Philippe Pittoli 850d61678a Add a "." between the subdomain and domain names, only when needed.
8 months ago
Philippe Pittoli 02f312b447 WS info in a record: code is now clearer.
8 months ago
Philippe Pittoli ab74a4a57e Remove unused packages.
8 months ago
Philippe Pittoli ad6a64d78a Type simplification.
8 months ago
Philippe Pittoli e9808e70f1 Create a subdomain based on the selected domain.
8 months ago
Philippe Pittoli 8d32f9933b Let's select a domain!
8 months ago
Philippe Pittoli 8fe25f8aca Bulma select.
8 months ago
Philippe Pittoli 81bdec302c DomainAdded message. List of domains auto-update when adding a message.
8 months ago
Philippe Pittoli a1c1c462c9 Show acceptable domains and my own domains.
8 months ago
Philippe Pittoli e77829b7a6 DNSManager: add some error messages.
8 months ago
Philippe Pittoli ad7ee31806 Minor DNSManager API change.
8 months ago
Philippe Pittoli b20504dfb9 Messages are sent and received, but something fails.
9 months ago
Philippe Pittoli 7dc993ae26 WIP
9 months ago
Philippe Pittoli de88796773 DNSManager Interface: first draft (WIP).
9 months ago
Philippe Pittoli 2352d2a3bb DNSManager interface: WIP.
9 months ago
Philippe Pittoli 1457e7bf7c Put the signature for codecs.
9 months ago
Philippe Pittoli 2ad1ede8f1 Reorder some messages.
9 months ago
Philippe Pittoli ffecb63c8d DNSManager messages: mostly done. Build is okay.
9 months ago
Philippe Pittoli 7f50ad1ffe DNSManager messages: still WIP.
9 months ago
Philippe Pittoli 6fb46022fe DNSManager network: WIP
9 months ago

@ -1,91 +1,11 @@
# Halogen Template
# dnsmanager interface
### Quick Start
```sh
git clone https://github.com/purescript-halogen/purescript-halogen-template.git halogen-project
cd halogen-project
npm install
npm run build
npm run serve
make
```
### Introduction
This is a template for starting a fresh project with the [Halogen](https://github.com/purescript-halogen/purescript-halogen) library for writing declarative, type-safe user interfaces.
You can learn more about Halogen with these resources:
- The [Halogen documentation](https://github.com/purescript-halogen/purescript-halogen/tree/master/docs), which includes a quick start guide and a concepts reference.
- The [Learn Halogen](https://github.com/jordanmartinez/learn-halogen) learning repository.
- The [Real World Halogen](https://github.com/thomashoneyman/purescript-halogen-realworld) application and guide. Note that the published article is written for the older halogen v4, but the code and comments cover the current halogen v5.
- The [API documentation](https://pursuit.purescript.org/packages/purescript-halogen) on Pursuit
You can chat with other Halogen users on the [PureScript Discourse](https://discourse.purescript.org), or join the [Functional Programming Slack](https://functionalprogramming.slack.com) ([invite link](https://fpchat-invite.herokuapp.com/)) in the `#purescript` and `#purescript-beginners` channels.
If you notice any problems with the below setup instructions, or have suggestions on how to make the new-user experience any smoother, please create an issue or pull-request.
Compatible with PureScript compiler 13.x
### Initial Setup
**Prerequisites:** This template assumes you already have Git and Node.js installed with `npm` somewhere on your path.
First, clone the repository and step into it:
```sh
git clone https://github.com/purescript-halogen/purescript-halogen-template.git halogen-project
cd halogen-project
```
Then, install the PureScript compiler, the [Spago](https://github.com/purescript/spago) package manager and build tool, and the [Parcel](https://github.com/parcel-bundler/parcel) bundler. You may either install PureScript tooling _globally_, to reduce duplicated `node_modules` across projects, or _locally_, so that each project uses specific versions of the tools.
To install the toolchain globally:
```sh
npm install -g purescript spago parcel
```
To install the toolchain locally (reads `devDependencies` from `package.json`):
```sh
npm install
```
### Building
You can now build the PureScript source code with:
```sh
# An alias for `spago build`
npm run build
```
### Launching the App
You can launch your app in the browser with:
```sh
# An alias for `parcel dev/index.html --out-dir dev-dist --open`
npm run serve
```
### Development Cycle
If you're using an [editor](https://github.com/purescript/documentation/blob/master/ecosystem/Editor-and-tool-support.md#editors) that supports [`purs ide`](https://github.com/purescript/purescript/tree/master/psc-ide) or are running [`pscid`](https://github.com/kRITZCREEK/pscid), you simply need to keep the previous `npm run serve` command running in a terminal. Any save to a file will trigger an incremental recompilation, rebundle, and web page refresh, so you can immediately see your changes.
If your workflow does not support automatic recompilation, then you will need to manually re-run `npm run build`. Even with automatic recompilation, a manual rebuild is occasionally required, such as when you add, remove, or modify module names, or notice any other unexpected behavior.
### Production
When you are ready to create a minified bundle for deployment, run the following command:
```sh
npm run build-prod
```
Parcel output appears in the `./dist/` directory.
You can test the production output locally with a tool like [`http-server`](https://github.com/http-party/http-server#installation). It seems that `parcel` should also be able to accomplish this, but it unfortunately will only serve development builds locally.
```sh
npm install -g http-server
http-server dist -o
```
If everything looks good, you can then upload the contents of `dist` to your preferred static hosting service.
This code is an alpha version of the official interface for `dnsmanager` (second edition).
For now, nothing much to see.

@ -6,6 +6,12 @@
<link rel="stylesheet" href="./bulma.css">
<title>DNS Manager (beta)</title>
</head>
<style>
.justified {
text-justify: auto;
text-align: justify
}
</style>
<body>
<script src="./index.js" type="module"></script>
</body>

@ -0,0 +1,3 @@
maybeCurrentConnection <- H.gets _.wsInfo.connection
when (isJust maybeCurrentConnection) do
H.modify_ _ { wsInfo { connection = Nothing, reconnect = true } }

@ -0,0 +1,7 @@
btn_delete :: forall w i. (MouseEvent -> i) -> HH.HTML w i
btn_delete action
= HH.button
[ HE.onClick action
, HP.classes [ HH.ClassName "button is-small is-danger" ]
] [ HH.text "remove" ]

@ -0,0 +1,96 @@
-- | `DomainParser` is a simple parser for domain names as described in RFC 1035.
module DomainParser where
import Prelude (bind, discard, pure, show, ($), (<>), (>))
import Control.Alt ((<|>))
import Control.Lazy (defer)
import Data.Array.NonEmpty as NonEmpty
import Data.Either (Either(..))
import Data.Maybe (Maybe(..))
import Data.String as S -- length
import Data.String.CodeUnits as CU
-- import Data.String.Regex as R
-- import Data.String.Regex.Flags as RF
import Data.Tuple (Tuple(..))
import Parsing.Combinators.Array (many1)
import Parsing.Combinators as PC
import Parsing (Parser, fail, runParser)
import Parsing.String.Basic (alphaNum, letter)
import Parsing.String (char, string, eof)
-- | From RFC 1035: <domain> ::= <subdomain> | " "
-- |
-- | Accepting an optional '.' at the end of the subdomain doesn't conform
-- | to the (prefered) syntax of a domain as described in RFC 1035.
-- | However, this last '.' character should be acceptable in most applications.
-- | In some cases, a fully qualified domain name (FQDN) such as `example.com.`
-- | has to be differenciated from a "relative" name (www).
domain :: Parser String String
domain = PC.try (string " ") <|> sub_eof
sub_eof :: Parser String String
sub_eof = do
sub <- subdomain
maybe_final_point <- PC.optionMaybe (char '.')
eof
let parsed_domain = did_we_parsed_the_final_point maybe_final_point sub
if S.length parsed_domain > 255
then fail $ "domain length is > 255 bytes (" <> show (S.length parsed_domain) <> ")"
else pure parsed_domain
where
did_we_parsed_the_final_point Nothing sub = sub
did_we_parsed_the_final_point (Just _) sub = sub <> "."
-- From RFC 1035: <subdomain> ::= <label> | <subdomain> "." <label>
subdomain :: Parser String String
subdomain = do
-- First: read a label. This is bare minimum for a subdomain.
lab <- label
-- Second: the rest is optional.
r <- PC.optionMaybe (PC.try point_sub)
case r of
Nothing -> pure lab
Just sub -> pure $ lab <> sub
where
point_sub :: Parser String String
point_sub = do
point <- string "."
sub <- defer \_ -> subdomain
pure $ point <> sub
-- From RFC 1035: <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
label :: Parser String String
label = let_then_str_then_alpha <|> char_to_string letter
where
let_then_str_then_alpha :: Parser String String
let_then_str_then_alpha = do
Tuple whole_label last_char <- PC.try do
l <- letter
s <- ldhstr
pure $ Tuple (CU.singleton l <> (CU.fromCharArray $ NonEmpty.toArray s)) (NonEmpty.last s)
case runParser (CU.singleton last_char) let_dig of
Left _ -> fail $ "Label is wrong: last char is '" <> (CU.singleton last_char) <> "' which isn't an alphanum"
Right _ -> if S.length whole_label > 63 -- Remember: we already did read a letter (l).
then fail $ "Label is larger than expected (max 63 characters, current: " <> show (S.length whole_label) <> ")"
else pure whole_label
-- From RFC 1035: <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
ldhstr :: Parser String (NonEmpty.NonEmptyArray Char)
ldhstr = many1 let_dig_hyp
-- From RFC 1035: <let-dig-hyp> ::= <let-dig> | "-"
-- Either a Letter, Digital or an Hyphenation character.
let_dig_hyp :: Parser String Char
let_dig_hyp = let_dig <|> char '-' <|> fail "invalid character"
-- From RFC 1035: <let-dig> ::= <letter> | <digit>
let_dig :: Parser String Char
let_dig = alphaNum
-- | Converting a single letter parser to a String parser.
char_to_string :: Parser String Char -> Parser String String
char_to_string p = do
character <- p
pure $ CU.singleton character

@ -0,0 +1,171 @@
-- | `App.HomeInterface` presents the website and its features.
module App.HomeInterface where
import Prelude (Unit, map, show, ($), (<>))
import DomainParser as DomainParser
--import Data.Either (Either(..))
-- import Data.Maybe (Maybe(..), maybe)
-- import Data.Tuple (Tuple(..))
import Effect.Aff.Class (class MonadAff)
import Halogen as H
import Halogen.HTML as HH
import Parsing
-- import Halogen.HTML.Events as HE
import Halogen.HTML.Properties as HP
import Bulma as Bulma
type Input = Unit
--type Action = Unit
data Action = UpdateStuff String
-- type State = Unit
type State = { stuff :: String }
data Query a = DoNothing a
type Output = Unit
type Slot = H.Slot Query Output
component :: forall m. MonadAff m => H.Component Query Input Output m
component =
H.mkComponent
{ initialState
, render
, eval: H.mkEval $ H.defaultEval
{ handleAction = handleAction
}
}
-- handleAction :: forall m. MonadAff m => Action -> H.HalogenM State Action () Output m Unit
-- handleAction _ = pure unit
handleAction :: forall m. MonadAff m => Action -> H.HalogenM State Action () Output m Unit
handleAction = case _ of
UpdateStuff val -> H.modify_ _ { stuff = val }
-- initialState :: forall input. input -> State
-- initialState _ = unit
initialState :: forall input. input -> State
initialState _ = { stuff: "" }
list_of_domains_to_test :: Array String
list_of_domains_to_test
= [ "ex.net"
, "??"
, "e-x.net"
, "way-too-long--way-too-long--way-too-long--way-too-long--way-too-long.net"
, "way-too-long--way-too-long--way-too-long--way-too-long.way-too-long--way-too-long--way-too-long--way-too-long.way-too-long--way-too-long--way-too-long--way-too-long.way-too-long--way-too-long--way-too-long--way-too-long.way-too-long--way-too-long--way-too-long--way-too-long.way-too-long--way-too-long--way-too-long--way-too-long.way-too-long--way-too-long--way-too-long--way-too-long.way-too-long--way-too-long--way-too-long--way-too-long.net"
, "e-.net"
, "-x.net"
, "truc-blah.example.com"
, "te.s-t.net"
, "example.com"
]
render :: forall m. State -> H.ComponentHTML Action () m
render state
= HH.div_
[ Bulma.hero_danger
"THIS IS AN ALPHA RELEASE"
"Come back later!"
, Bulma.section_small
[ Bulma.h1 "Welcome to netlib.re"
, Bulma.subtitle "Free domain names"
, Bulma.hr
, render_description
, render_second_line
, render_why_and_contact
, Bulma.hr
, render_how_and_code
]
, Bulma.hero_danger "A simple input" "Nothing much to see"
, Bulma.section_small $
[ Bulma.h1 "Examples of domain parsing in Purescript"
] <> test_domains list_of_domains_to_test
, Bulma.section_small [ render_stuff ]
]
where
-- Some helpers.
title = Bulma.h3
p = Bulma.p
b x = Bulma.column_ [ Bulma.box x ]
render_stuff = Bulma.columns_ [ b [ title "stuff"
, stuff_input
]
--, b [ title "result"
-- , p $ case runParser state.stuff DomainParser.parse_stuff of
-- Left _ -> "NOT OKAY"
-- Right _ -> "OKAY"
-- ]
]
stuff_input
= Bulma.box_input "stuff" "stuff" "stuff"
UpdateStuff
state.stuff
true
should_be_disabled
should_be_disabled = (if true then (HP.enabled true) else (HP.disabled true))
-- test_domains :: Array String -> _
test_domains doms = map tests_on_domain doms
-- tests_on_domain :: String -> _
tests_on_domain d
= b [ Bulma.strong $ d <> " -> [ldhstr, label, subdomain, domain]"
, p $ d <> " : ldhstr : " <> (show $ runParser d DomainParser.ldhstr)
, p $ d <> " : label : " <> (show $ runParser d DomainParser.label)
, p $ d <> " : subdomain : " <> (show $ runParser d DomainParser.subdomain)
, p $ d <> " : domain : " <> (show $ runParser d DomainParser.domain)
]
render_description = Bulma.columns_ [ render_basics, render_no_expert ]
render_basics
= b [ title "What is provided?"
, p "Reserve a domain name in <something>.netlib.re for free."
, p "Manage your own DNS zone."
]
render_no_expert
= b [ title "No need to be an expert!"
, p """
This website will help you through your configuration, as much as we can.
"""
]
render_second_line = Bulma.columns_ [ render_no_housing, render_updates ]
render_no_housing
= b [ title "No housing, just a name"
, p """
We don't provide housing for your services or websites,
just a name.
"""
]
render_updates
= b [ title "Automatic updates"
, p "Update your current address with a simple script."
]
render_why_and_contact = Bulma.columns_ [ render_why, render_contact ]
render_why
= b [ title "Why?"
, p "Because everyone should be able to have a place on the Internet."
, p "We provide you a name, build something meaningful with it."
]
render_contact
= b [ title "Contact"
, p "You have a question, you saw a bug or you just want to chat?"
, p "You can contact us: ..."
]
render_how_and_code = Bulma.columns_ [ render_how, render_code ]
render_how
= b [ title "How does this work?"
, p "We pay for the domain names (netlib.re and codelib.re) and let you have a subdomain."
, p "This service helps you manage your domain (a subdomain of netlib.re or codelib.re)."
]
render_code
= b [ title "I want to see the code!"
, p "The project is fully open-source (ISC licence)."
, p "There are 3 parts: libipc, micro-services (authentication and dnsmanager) and this website."
]

@ -0,0 +1,71 @@
module App.RR where
type InputParameter
= { valid :: Boolean
, value :: String
}
type RecordType = String
type RecordTarget = String
type RecordName = String
-- These should be integers, but I use these values in user inputs.
type TTL = String
type Weight = String
type Priority = String
type Port = String
type Protocol = String
type RRId = Int
type Modified = Boolean
type Valid = Boolean
type RecordBase l
= { rrtype :: RecordType
, rrid :: RRId
, modified :: Boolean
, valid :: Boolean
, ttl :: TTL
, name :: RecordName
, target :: RecordTarget
, readonly :: Boolean
| l
}
-- CNAME A AAAA NS TXT
type SimpleRR l = RecordBase (|l)
type MXRR l = RecordBase ( priority :: Priority | l)
type SRVRR l = MXRR ( protocol :: Protocol
, weight :: Weight
, port :: Port
| l)
type SOARR l
= RecordBase ( mname :: String
, rname :: String
, serial :: String -- Int
, refresh :: String -- Int
, retry :: String -- Int
, expire :: String -- Int
, minttl :: String -- Int
| l)
defaultResourceA :: SimpleRR ()
defaultResourceA
= { rrid: 0, rrtype: "A", modified: false, valid: true, readonly: false
, ttl: "200", name : "www", target: "192.168.10.2" }
defaultResourceMX :: MXRR ()
defaultResourceMX
= { rrid: 0, rrtype: "MX", modified: false, valid: true, readonly: false
, ttl: "500", priority: "10", name : "mail", target: "www" }
defaultResourceSRV :: SRVRR ()
-- RRId Modified Valid Priority Protocol Weight Port TTL Domain Value
defaultResourceSRV
= { rrid: 0, rrtype: "SRV", modified: false, valid: true, readonly: false
, priority: "10", protocol: "_tcp", weight: "100"
, port: "80", ttl: "200"
, name : "_sip._tcp.example.com.", target: "sip.example.com." }

@ -0,0 +1,69 @@
-- | `App.HomeInterface` presents the website and its features.
module App.SimpleInput where
import Prelude (Unit, ($))
-- import Data.Either (Either(..))
-- import Data.Maybe (Maybe(..), maybe)
-- import Data.Tuple (Tuple(..))
import Effect.Aff.Class (class MonadAff)
import Halogen as H
import Halogen.HTML as HH
-- import Halogen.HTML.Events as HE
import Halogen.HTML.Properties as HP
import Bulma as Bulma
type Input = Unit
data Action = UpdateStuff String
data Query a = DoNothing a
type Output = Unit
type Slot = H.Slot Query Output
type State = { stuff :: String }
component :: forall m. MonadAff m => H.Component Query Input Output m
component =
H.mkComponent
{ initialState
, render
, eval: H.mkEval $ H.defaultEval
{ handleAction = handleAction
}
}
handleAction :: forall m. MonadAff m => Action -> H.HalogenM State Action () Output m Unit
handleAction = case _ of
UpdateStuff val -> H.modify_ _ { stuff = val }
initialState :: forall input. input -> State
initialState _ = { stuff: "" }
render :: forall m. State -> H.ComponentHTML Action () m
render state
= HH.div_
[ Bulma.hero_danger "A simple input" "Nothing much to see"
, Bulma.section_small [ render_stuff ]
]
where
-- Some helpers.
title = Bulma.h3
p = Bulma.p
b x = Bulma.column_ [ Bulma.box x ]
render_stuff = Bulma.columns_ [ b [ title "stuff"
, stuff_input
]
, b [ title "value"
, p state.stuff
]
]
stuff_input
= Bulma.box_input "stuff" "stuff" "stuff"
UpdateStuff
state.stuff
true
should_be_disabled
should_be_disabled = (if true then (HP.enabled true) else (HP.disabled true))

@ -0,0 +1,44 @@
-- TODO: wrong type
--home_icon :: forall r w i. Array (HP.IProp r i) -> HH.HTML w i
--home_icon = HH.span
-- [HP.classes [HH.ClassName "icon is-small"]]
-- [HH.i ([HP.classes [HH.ClassName "fas fa-home"]] <> aria) []]
-- where aria = [Aria.hidden "true"]
nav_bar :: forall w i. String -> HH.HTML w i
nav_bar domain
= HH.nav
[ HP.classes $ C.breadcrumb <> C.is_centered <> C.has_succeeds_separator
, Aria.label "breadcrumbs"
] [ HH.ul_
[ HH.li_ [ HH.a [HP.href "/"] [ HH.text "Home"] ]
, HH.li []
[ HH.a
[HP.href "/", aria_current "page"]
[HH.text ("Domain: " <> domain)]
]
]
]
-- type_selection: create a "select" input.
-- Get the changes with "onSelectedIndexChange" which provides an index (from `baseRecords`)
type_selection :: HH.HTML w Action
type_selection = HH.div [HP.classes $ C.select <> C.is_normal]
[ HH.select
[ HE.onSelectedIndexChange (UpdateNewForm <<< Update_New_Form_SRR <<< Update_SRR_Type) ]
$ map type_option baseRecords
]
type_option n
= HH.option
[ HP.value n
, HP.selected (n == rr.rrtype)
] [ HH.text n ]
-- Get the element from the index
H.modify_ _ { _newSRR = changeType state._newSRR (baseRecords A.!! val) }
changeType :: forall (l :: Row Type). (SimpleRR l) -> Maybe String -> (SimpleRR l)
changeType rr Nothing = rr
changeType rr (Just s) = rr { rrtype = s }

@ -0,0 +1,44 @@
import Data.String.Regex as R
import Data.String.Regex.Flags as RF
import Data.Validation.Semigroup (V, andThen, invalid, toEither)
andThenDrop :: forall errors a b. V errors a -> V errors b -> V errors b
-- andThenDrop f1 f2 = f1 !> (\ _ -> f2)
infixl 8 andThen as !>
-- infixl 8 andThenDrop as !<
name_format :: String
name_format = "[a-zA-Z]+"
protocol_format :: String
protocol_format = "^(tcp|udp|sctp)$"
hostname_format :: String
hostname_format = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]).)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])[.]?$"
-- Basic tools for validation.
lengthIsBetween :: Attribute -> Int -> Int -> String -> V Errors String
lengthIsBetween field minlen maxlen value
= if valid_condition
then pure value
else invalid [ Tuple field error_message ]
where
actual_len = S.length value
valid_condition = actual_len >= minlen && actual_len <= maxlen
error_message = "acceptable length [" <> show minlen <> "-" <> show maxlen <> "]"
-- | `matches` is a simple format verification based on regex parsing.
-- | `verify_regex` is a handler to use `matches` with a string regex format.
-- |
-- | ```
-- | verify_regex Name name_format name
-- | ```
matches :: Attribute -> String -> R.Regex -> V Errors String
matches field value regex
| R.test regex value = pure value
| otherwise = invalid [Tuple field "unacceptable format"]
verify_regex :: Attribute -> String -> String -> V Errors String
verify_regex field restr value
= case R.regex restr RF.unicode of
Left error_string -> invalid [Tuple field $ "error in regex: " <> error_string]
Right regex -> matches field value regex

@ -1,6 +1,9 @@
all: build
build:
clone-generic-parser:
[ ! -d ../parser ] && cd .. && git clone ssh://_gitea@git.baguette.netlib.re:2299/Baguette/parser.git || :
build: clone-generic-parser
spago build
bundle: install-esbuild
@ -13,6 +16,19 @@ repl:
spagobuild:
spago build
docs-with-search:
spago docs
docs:
spago docs --no-search
DOCS_HTTPD_ACCESS_LOGS ?= /tmp/docs-access.log
DOCS_HTTPD_ADDR ?= 127.0.0.1
DOCS_HTTPD_PORT ?= 31000
DOCS_DIR ?= generated-docs/html
serve-docs: docs
darkhttpd $(DOCS_DIR) --addr $(DOCS_HTTPD_ADDR) --port $(DOCS_HTTPD_PORT) --log $(DOCS_HTTPD_ACCESS_LOGS)
install-esbuild:
@echo "install ebbuild"
[ -f node_modules/.bin/esbuild ] || npm install esbuild

@ -3,3 +3,4 @@ let upstream =
sha256:8b94a0cd7f86589a6bd06d48cb9a61d69b66a94b668657b2f10c8b14c16e028c
in upstream
with generic-parser = ../parser/spago.dhall as Location

@ -1,7 +1,6 @@
{ name = "halogen-project"
{ name = "dnsmanager-interface"
, dependencies =
[ "aff"
, "argonaut-codecs"
, "argonaut-core"
, "arraybuffer"
, "arraybuffer-builder"
@ -10,13 +9,16 @@
, "bifunctors"
, "codec-argonaut"
, "console"
, "const"
, "control"
, "dom-indexed"
, "effect"
, "either"
, "exceptions"
, "foreign"
, "generic-parser"
, "halogen"
, "halogen-subscriptions"
, "integers"
, "maybe"
, "newtype"
, "parsing"
@ -24,14 +26,17 @@
, "prelude"
, "profunctor"
, "strings"
, "stringutils"
, "tailrec"
, "transformers"
, "tuples"
, "uint"
, "variant"
, "validation"
, "web-encoding"
, "web-events"
, "web-html"
, "web-socket"
, "web-uievents"