Compare commits

...
Sign in to create a new pull request.

3 commits
local ... main

7 changed files with 118 additions and 19 deletions

View file

@ -79,6 +79,7 @@ import App.Page.Setup as PageSetup
import App.Page.DomainList as PageDomainList
import App.Page.Zone as PageZone
import App.Page.Home as PageHome
import App.Page.News as PageNews
import App.Page.Migration as PageMigration
import App.Page.Navigation as PageNavigation
@ -186,10 +187,11 @@ type State = { token :: Maybe String
-- | The list of child components: log, `WS` twice (once for each ws connection),
-- | then all the pages (AuthenticationInterface, RegistrationInterface, MailValidationInterface,
-- | PageHome, PageDomainList, PageZone and AdministrationInterface).
-- | PageHome, PageNews, PageDomainList, PageZone and AdministrationInterface).
type ChildSlots =
( log :: AppLog.Slot Unit
, ho :: PageHome.Slot Unit
, news :: PageNews.Slot Unit
, ws_auth :: WS.Slot Unit
, ws_dns :: WS.Slot Unit
, nav :: PageNavigation.Slot Unit
@ -206,6 +208,7 @@ type ChildSlots =
)
_ho = Proxy :: Proxy "ho" -- Home Interface
_news = Proxy :: Proxy "news" -- News Interface
_log = Proxy :: Proxy "log" -- Log
_ws_auth = Proxy :: Proxy "ws_auth" -- WS with `authd`
_ws_dns = Proxy :: Proxy "ws_dns" -- WS with `dnsmanagerd`
@ -260,6 +263,7 @@ render state
, migration_warning_on_email_address
, case state.current_page of
Home -> render_home
News -> render_news
Authentication -> render_auth_form
Registration -> render_registration
MailValidation -> render_mail_validation
@ -330,6 +334,8 @@ render state
render_home :: forall monad. MonadAff monad => H.ComponentHTML Action ChildSlots monad
render_home = HH.slot_ _ho unit PageHome.component unit
render_news :: forall monad. MonadAff monad => H.ComponentHTML Action ChildSlots monad
render_news = HH.slot_ _news unit PageNews.component unit
render_domainlist_interface :: forall monad. MonadAff monad => H.ComponentHTML Action ChildSlots monad
render_domainlist_interface = HH.slot _dli unit PageDomainList.component unit (EventOnPage <<< EventPageDomainList)
render_auth_form :: forall monad. MonadAff monad => H.ComponentHTML Action ChildSlots monad
@ -1028,6 +1034,7 @@ revert_old_page = do
case page of
Nothing -> pure unit
Just "Home" -> handleAction $ Routing Home
Just "News" -> handleAction $ Routing News
Just "Authentication" -> handleAction $ Routing Authentication
Just "Registration" -> handleAction $ Routing Registration
Just "DomainList" -> handleAction $ Routing DomainList

View file

@ -42,17 +42,9 @@ initialState _ = unit
render :: forall m. State -> H.ComponentHTML Action () m
render _ = HH.div_
[ Web.hero_danger
-- "THIS IS A BETA RELEASE"
-- "You can register, login and play a bit with the tool. Feel free to report errors and suggestions."
[ HH.text "MESSAGE DE MIGRATION" ]
[ Web.p "En bref : le site a été refait à neuf, en anglais (une traduction arrivera… un jour), et les comptes ont été migrés."
, Web.p "Les utilisateurs peuvent se connecter avec leurs identifiants habituels et leurs domaines sont toujours attribués, mais le contenu n'a pas été préservé (il faut re-configurer les zones)."
, Web.p """
Les comptes migrés sont conservés 6 mois, puis supprimés si aucune connexion n'est faite,
afin de purger un certain nombre de vieux comptes de robots.
"""
, HH.p [ HP.classes [C.margin_top 3] ]
[ Web.outside_link [C.button, C.is_info] url_linuxfr "Article linuxfr.org présentant la nouvelle version de netlibre" ]
[ HH.text "Read the news! 📰" ]
[ Web.hr
, Web.p "Check out the News page regarding the events of the last few days on netlibre."
]
, Web.section_small
[ Web.h1 "Welcome to netlib.re"
@ -65,7 +57,6 @@ render _ = HH.div_
]
]
where
url_linuxfr = "https://linuxfr.org/news/netlibre-un-service-libre-et-un-nom-de-domaine-gratuit"
title = Web.h4
b x = Web.column_ [ Web.box x ]

View file

@ -117,9 +117,9 @@ render { logged, active, admin, login } =
where
left_bar_div =
case logged, admin of
false, _ -> [ link_home, code_dropdown ]
_, false -> [ link_home, link_domains, code_dropdown ]
_, _ -> [ link_home, link_domains, link_authd_admin, code_dropdown ]
false, _ -> [ link_home, link_news, code_dropdown ]
_, false -> [ link_home, link_news, link_domains, code_dropdown ]
_, _ -> [ link_home, link_news, link_domains, link_authd_admin, code_dropdown ]
right_bar_div =
case logged of
@ -159,6 +159,7 @@ render { logged, active, admin, login } =
navbar_end = HH.div [HP.classes [C.navbar_end]]
link_home = nav_link "Home" (Navigate Home)
link_news = nav_link "News 📝" (Navigate News)
link_domains = nav_link "Domains" (Navigate DomainList)
link_authd_admin = nav_link "Admin" (Navigate Administration)
link_auth = nav_link "Login" (Navigate Authentication)

91
src/App/Page/News.purs Normal file
View file

@ -0,0 +1,91 @@
-- | `App.Page.News` presents the news of the service.
module App.Page.News where
import Prelude (Unit, (<>), pure, 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 CSSClasses as C
import Web as Web
type Input = Unit
type Action = Unit
type State = Unit
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
initialState :: forall input. input -> State
initialState _ = unit
render :: forall m. State -> H.ComponentHTML Action () m
render _ = HH.div_ [ Web.section
[ article "13th December 2025: I've been purging, a lot."
[ Web.strong "(French version below / version française plus bas)"
, Web.p "Hello everyone, I would like to clarify a few things regarding the events of the last few days on netlibre."
, Web.p "1. I have received numerous complaints of abuse (phishing, among other things). As I am the only person behind the project, I don't have time to deal with each case individually, and I have been forced to take urgent and drastic measures against bots. As a result, almost 20,000 accounts out of 27,000 were deleted (reducing the number of domains from 160,000 to just 12,000)."
, Web.p "2. Delegation was used extensively by bots, and a massive number of accounts were created immediately after this feature was added. As a result, all delegation users were considered bots by default and deleted. Similarly, accounts with more than 50 domains (highly suspected of being automated) were also deleted, as were those that were not linked to a valid email address (this criterion was used to delete old inactive accounts)."
, Web.p "3. For remaining users, delegation is once again permitted without resulting in automatic account deletion."
, Web.p "4. Account creation has been temporarily disabled. It will be possible again soon. However, to limit the number of bots, all new accounts must now be created via co-optation rather than free registration to access the free service, which will be limited to 10 domains, without delegation."
, Web.p "5. In the future, which I hope will be soon (but I can't guarantee anything), in addition to the free service, I will provide a commercial version of netlibre that will allow intensive use, i.e., more than 10 domains (with no upper limit), as well as the use of delegation. Current users who fall into this category will have to switch to this new formula."
, Web.p "6. That being said, the future commercial service will still not be open to abuse. Any reports I receive of phishing or other abuse will result in the account being deleted, whether it is a paid account or not. Similarly, the automated hoarding of numerous domains (via keywords or brute force, for example by taking all domains with one or two letters) is not legitimate use and will result in the immediate deletion of the account, with no possibility of appeal, whether it is a paid account or not."
, Web.p "To summarize, any account has been deleted if:"
, Web.ul [ Web.li "it had more than 50 domains"
, Web.li "it used delegation (very popular with bots)"
, Web.li "I received security alerts (phishing, spam, etc.)"
]
, Web.p "Since the deletion, my email inbox has been flooded with requests to restore accounts. Unfortunately, I am unable to verify the honesty of each individual case. As a reminder, I manage this service on a voluntary basis in my spare time. I am sincerely sorry if you were using netlibre in good faith and have been caught up in the collateral damage of the radical measures I have been forced to implement."
, Web.p "My goal now is to enable legitimate and enjoyable use for the 7,000+ accounts that remain."
, Web.p "Thank you for your support and understanding."
]
, article "13 décembre 2025 : grosse purge terminée."
[ Web.p "Bonjour à tous, j'aimerais apporter des précisions concernant les événements de ces derniers jours sur netlibre."
, Web.p "1. J'ai reçu de nombreuses plaintes d'abus (phishing entre autres). Étant seul derrière le projet, je n'ai pas le temps de faire du cas par cas, et ai été contraint d'appliquer en urgence des mesures drastiques contre les bots. Ainsi, presque 20 000 comptes ont été supprimés sur 27 000 (passant de 160 000 domaines à seulement 12 000)."
, Web.p "2. La délégation a été intensivement utilisée par les bots, et une création massive de comptes a eu lieu juste après l'ajout de cette fonctionnalité. Par conséquent, tout utilisateur de délégation a été considéré par défaut comme étant un bot et supprimé. De même, les comptes détenant plus de 50 domaines (grosse suspicion de gestion automatisée) ont également été supprimés, ainsi que ceux qui n'étaient pas liés à une adresse email valide (ce critère a servi à supprimer de vieux comptes inactifs)."
, Web.p "3. Pour les utilisateurs restants, la délégation est à nouveau autorisée sans entraîner la suppression automatique du compte."
, Web.p "4. La création de compte a temporairement été désactivée. Elle sera prochainement possible à nouveau. Cependant, pour limiter le nombre de bots, tout nouveau compte devra désormais être créé via cooptation plutôt qu'enregistrement libre pour accéder au service gratuit, qui se limitera à 10 domaines, sans délégation."
, Web.p "5. Dans un avenir que j'espère proche (mais je ne peux rien garantir), en plus du service gratuit, je fournirai une version commerciale de netlibre qui permettra un usage intensif, c'est-à-dire au-delà de 10 domaines (sans limite haute), ainsi que l'utilisation de la délégation. Les utilisateurs actuels qui rentrent dans ce cas devront basculer sur cette nouvelle formule."
, Web.p "6. Le futur service commercial ne sera tout de même pas une porte ouverte à tous les abus. Ainsi, les alertes qui me seront remontées pour du phishing, ou tout autre abus, entraîneront la suppression du compte, payant ou non. De même, laccaparement de nombreux domaines de manière automatisée (via des mots clés ou par force brute en prenant tous les domaines à une ou deux lettres par exemple), n'est pas un usage légitime et entraînera la suppression immédiate et sans recours possible du compte, payant ou non."
, Web.p "Pour résumer, tout compte a été supprimé si :"
, Web.ul [ Web.li "il possédait plus de 50 domaines"
, Web.li "il utilisait la délégation (très prisée par les bots)"
, Web.li "on m'a remonté des alertes de sécurité (phishing, spam, etc.)"
]
, Web.p "Depuis la suppression, ma boîte mails est submergée par un flux de demandes de rétablissements de comptes. Malheureusement, je ne suis pas en mesure de vérifier l'honnêteté de chacun au cas par cas. Pour rappel, je gère le service bénévolement sur mon temps libre. Je suis sincèrement désolé si vous utilisiez netlibre de bonne foi, et que vous faites partie des dommages collatéraux des mesures radicales que j'ai été contraint d'appliquer."
, Web.p "Mon objectif maintenant est de permettre un usage légitime et agréable aux +7000 comptes qui restent."
, Web.p "Merci de votre soutien et compréhension."
]
, article "18th November 2025: Bots, bots everywhere!"
[ Web.p "A few days ago, I implemented zone delegation for netlib.re. This feature is useful in a number of cases, but it is also exploited by hackers to hide their misdeeds."
, Web.p "Due to their abuse, I am temporarily disabling account creation on netlib.re and will be purging some of the accounts created since the introduction of delegation. My goal is to implement a countermeasure to these attacks in the near future. Only then will I reactivate account creation."
, Web.p "Current accounts will continue to function without disruption."
, Web.p "Thank you for your understanding."
]
]
]
where
article t c = Web.section_ [ C.content, HH.ClassName "has-background-grey-lighter" ]
([ Web.h1 t ] <> c)

View file

@ -6,6 +6,7 @@ import Data.Show.Generic (genericShow)
data Page
= Home -- | `Home`: presentation of the project.
| News -- | `News`: news of the service.
| Authentication -- | `Authentication`: authentication page.
| Registration -- | `Registration`: to register new people.
| MailValidation -- | `MailValidation`: to validate email addresses (via a token).

View file

@ -35,7 +35,7 @@ import Web.Input (box_input, box_input_, box_password, box_password_, email_inpu
import Web.Level (level)
import Web.Modal (modal, modal_, modal_background, modal_body, modal_card_large, modal_foot, modal_header)
import Web.Notification (error_box, notification, notification', notification_block', notification_danger, notification_danger', notification_danger_block', notification_primary, notification_primary', notification_success, notification_warning, notification_warning')
import Web.Section (section_medium, section_small)
import Web.Section (section_, section, section_medium, section_small)
import Web.Tab (fancy_tabs, tab_entry, tabs)
import Web.Table (table, table_)
import Web.Tag (tag, tag_ro, tags, tag_light_info)

View file

@ -3,10 +3,18 @@ module Web.Section where
import Halogen.HTML as HH
import Halogen.HTML.Properties as HP
import Prelude ((<>))
import CSSClasses as C
section_ :: forall w i. Array HH.ClassName -> Array (HH.HTML w i) -> HH.HTML w i
section_ classes = HH.section [ HP.classes ([C.section] <> classes) ]
section :: forall w i. Array (HH.HTML w i) -> HH.HTML w i
section = section_ []
section_small :: forall w i. Array (HH.HTML w i) -> HH.HTML w i
section_small = HH.section [ HP.classes [C.section, C.is_small] ]
section_small = section_ [ C.is_small ]
section_medium :: forall w i. Array (HH.HTML w i) -> HH.HTML w i
section_medium = HH.section [ HP.classes [C.section, C.medium] ]
section_medium = section_ [ C.is_medium ]