Compare commits
3 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 407db39098 | |||
| 586018483a | |||
| 1a907e36f4 |
7 changed files with 118 additions and 19 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 ]
|
||||
|
||||
|
|
|
|||
|
|
@ -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
91
src/App/Page/News.purs
Normal 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, l’accaparement 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)
|
||||
|
|
@ -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).
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 ]
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue