diff --git a/app/assets/stylesheets/contrib/grayscale.scss b/app/assets/stylesheets/contrib/grayscale.scss index a7b76022f..56a2a7743 100644 --- a/app/assets/stylesheets/contrib/grayscale.scss +++ b/app/assets/stylesheets/contrib/grayscale.scss @@ -1810,6 +1810,9 @@ body:not(#tags-new) input[value="Tagger"] { .edit_account #account_user_attributes_jabber_id { width: 210px; } +.edit_account #account_user_attributes_deltachat_id { + width: 210px; +} button.remove { padding-bottom: 2px; } diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index 1dee5e84e..d0cc08200 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -51,6 +51,7 @@ def update user = @account.user user.homesite = nil user.jabber_id = nil + user.deltachat_id = nil user.mastodon_url = nil user.save Board.amr_notification("Le compte #{@account.login} #{user_url @account.login} a été désactivé par #{current_user.name} #{user_url(current_user)}") @@ -64,6 +65,7 @@ def destroy user = @account.user user.homesite = nil user.jabber_id = nil + user.deltachat_id = nil user.mastodon_url = nil user.save Board.amr_notification("Le compte #{@account.login} #{user_url @account.login} a été désactivé par #{current_user.name} #{user_url(current_user)}") diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index b47f42c1c..4dbcc0069 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -67,7 +67,7 @@ def configure_permitted_parameters :sort_by_date_on_home, :hide_signature, :show_negative_nodes, :totoz_style, :totoz_source, :board_in_sidebar, - user_attributes: [:id, :name, :homesite, :jabber_id, :mastodon_url, :signature, :avatar, :custom_avatar_url] + user_attributes: [:id, :name, :homesite, :jabber_id, :deltachat_id, :mastodon_url, :signature, :avatar, :custom_avatar_url] ]) end diff --git a/app/helpers/node_helper.rb b/app/helpers/node_helper.rb index ef50a5da1..421b677b6 100644 --- a/app/helpers/node_helper.rb +++ b/app/helpers/node_helper.rb @@ -112,6 +112,7 @@ def posted_by(content, user_link='Anonyme') user_infos << email_link(user) user_infos << homesite_link(user) user_infos << jabber_link(user) + user_infos << deltachat_link(user) user_infos << mastodon_link(user) user_infos.compact! user_link += (" (" + user_infos.join(', ') + ")").html_safe if user_infos.any? diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index ab7c1ab0b..af5fcc5d9 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -51,6 +51,14 @@ def jabber_link(user) link_to("adresse XMPP", "xmpp:" + user.jabber_id) end + def deltachat_link(user) + return unless current_account + return if user.deltachat_id.blank? + karma = user.account.try(:karma).to_i + return unless karma > 0 + link_to("adresse Delta Chat", "mailto:" + user.deltachat_id) + end + def mastodon_link(user) return if user.mastodon_url.blank? karma = user.account.try(:karma).to_i diff --git a/app/models/statistics/users.rb b/app/models/statistics/users.rb index b30e5b53f..24ef0b566 100644 --- a/app/models/statistics/users.rb +++ b/app/models/statistics/users.rb @@ -114,6 +114,10 @@ def top_xmpp_domains select_all "SELECT SUBSTRING_INDEX(jabber_id,'@', -1) AS domain, COUNT(*) AS cnt FROM accounts LEFT JOIN users ON accounts.user_id=users.id WHERE jabber_id LIKE '%@%' AND last_seen_on > DATE_SUB(CURDATE(),INTERVAL 90 DAY) AND role<>'inactive' GROUP BY domain HAVING cnt > 3 ORDER BY cnt DESC LIMIT 10;" end + def top_deltachat_domains + select_all "SELECT SUBSTRING_INDEX(deltachat_id,'@', -1) AS domain, COUNT(*) AS cnt FROM accounts LEFT JOIN users ON accounts.user_id=users.id WHERE deltachat_id LIKE '%@%' AND last_seen_on > DATE_SUB(CURDATE(),INTERVAL 90 DAY) AND role<>'inactive' GROUP BY domain HAVING cnt > 3 ORDER BY cnt DESC LIMIT 10;" + end + def top_mastodon_domains # We assume Mastodon URLs will always start with "https://" select_all "SELECT SUBSTRING_INDEX(SUBSTRING(mastodon_url, 9),'/', 1) AS domain, COUNT(*) AS cnt FROM accounts LEFT JOIN users ON accounts.user_id=users.id WHERE mastodon_url LIKE 'https://%/%' AND last_seen_on > DATE_SUB(CURDATE(),INTERVAL 90 DAY) AND role<>'inactive' GROUP BY domain HAVING cnt > 3 ORDER BY cnt DESC LIMIT 10;" diff --git a/app/models/user.rb b/app/models/user.rb index 708c6d1a6..89c0e74c8 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -7,6 +7,7 @@ # name :string(40) # homesite :string(100) # jabber_id :string(32) +# deltachat_id :string(32) # mastodon_url :string(100) # cached_slug :string(32) not null # created_at :datetime @@ -34,6 +35,7 @@ class User < ActiveRecord::Base length: { maximum: 100, message: "L’adresse du site Web personnel est trop longue" } validates :name, length: { maximum: 40, message: "Le nom affiché est trop long" } validates :jabber_id, length: { maximum: 32, message: "L’adresse XMPP est trop longue" } + validates :deltachat_id, length: { maximum: 32, message: "L’adresse Delta Chat est trop longue" } validates :mastodon_url, uri: { protocols: ["https"], message: "L’adresse du compte Mastodon n’est pas valide" }, length: { maximum: 255, message: "L’adresse du compte Mastodon est trop longue" } validates :signature, length: { maximum: 255, message: "La signature est trop longue" } diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml index e840d7729..ceec759a4 100644 --- a/app/views/admin/accounts/index.html.haml +++ b/app/views/admin/accounts/index.html.haml @@ -39,6 +39,9 @@ - if account.user.jabber_id.present? %br = account.user.jabber_id + - if account.user.deltachat_id.present? + %br + = account.user.deltachat_id - if account.user.mastodon_url.present? %br = account.user.mastodon_url diff --git a/app/views/devise/registrations/_preferences.html.haml b/app/views/devise/registrations/_preferences.html.haml index b9c2d8d74..4765cd1ba 100644 --- a/app/views/devise/registrations/_preferences.html.haml +++ b/app/views/devise/registrations/_preferences.html.haml @@ -11,6 +11,10 @@ = u.label :jabber_id, 'Adresse XMPP' %span.prefix xmpp: = u.text_field :jabber_id, placeholder: "me@example.net", maxlength: 32 + %p + = u.label :deltachat_id, 'Adresse Delta Chat' + %span.prefix mailto: + = u.text_field :deltachat_id, placeholder: "monchat@example.net", maxlength: 32 %p = u.label :mastodon_url, 'Adresse du compte Mastodon' = u.url_field :mastodon_url, placeholder: "https://mastodon.example/@me", maxlength: 100 diff --git a/app/views/statistics/users.html.haml b/app/views/statistics/users.html.haml index c43341b1f..9fd9aacf5 100644 --- a/app/views/statistics/users.html.haml +++ b/app/views/statistics/users.html.haml @@ -19,6 +19,7 @@ %li= link_to("Informations personnelles", "#stats_infosperso") %li= link_to("Domaines des courriels", "#stats_courriel") %li= link_to("Domaines XMPP", "#stats_xmpp") + %li= link_to("Domaines Delta Chat", "#stats_deltachat") %li= link_to("Domaines Mastodon", "#stats_mastodon") %li= link_to("Utilisation des fonctionnalités", "#stats_fonctionnalites") %li= link_to("Style (CSS)", "#stats_css") @@ -206,6 +207,11 @@ %td .stat.misc(style="width: #{(width_stats * @stats.filled("jabber_id") / maxval).to_i}px;")= @stats.filled("jabber_id") %td #{@stats.pctrecent(@stats.filled("jabber_id"))} + %tr + %td.stat Adresse Delta Chat + %td + .stat.misc(style="width: #{(width_stats * @stats.filled("deltachat_id") / maxval).to_i}px;")= @stats.filled("deltachat_id") + %td #{@stats.pctrecent(@stats.filled("deltachat_id"))} %tr %td.stat Adresse Mastodon %td @@ -261,6 +267,27 @@ %td #{@stats.pctrecent_filled(domain["cnt"],"jabber_id")} + %h2#stats_deltachat Domaines Delta Chat + %p + Sur #{pluralize @stats.nb_recently_seen_accounts, "compte utilisé", "comptes utilisés"} sur le site au cours des trois derniers mois : + %table + - maxval = @stats.nb_recently_seen_accounts + %tr + %th Domaines à plus de trois comptes + %th Nombre de comptes + %th Actifs + %th Déclarés + - @stats.top_deltachat_domains.each do |domain| + %tr + %td.stat + = domain["domain"] + %td + .stat.misc(style="width: #{(width_stats * domain["cnt"] / maxval).to_i}px;")= domain["cnt"] + %td + #{@stats.pctrecent(domain["cnt"])} + %td + #{@stats.pctrecent_filled(domain["cnt"],"deltachat_id")} + %h2#stats_mastodon Domaines Mastodon %p Sur #{pluralize @stats.nb_recently_seen_accounts, "compte utilisé", "comptes utilisés"} sur le site au cours des trois derniers mois : diff --git a/app/views/users/_recent.html.haml b/app/views/users/_recent.html.haml index cb11bef48..d3ef411ea 100644 --- a/app/views/users/_recent.html.haml +++ b/app/views/users/_recent.html.haml @@ -16,6 +16,8 @@ %li Site perso : #{@user.homesite} - if @user.jabber_id.present? %li XMPP : #{@user.jabber_id} + - if @user.deltachat_id.present? + %li Delta Chat: #{@user.deltachat_id} - if @user.mastodon_url.present? %li Mastodon : #{@user.mastodon_url} - if current_account.admin? diff --git a/app/views/users/_user.html.haml b/app/views/users/_user.html.haml index d392c23ba..3709a3d4d 100644 --- a/app/views/users/_user.html.haml +++ b/app/views/users/_user.html.haml @@ -12,6 +12,9 @@ - if current_account && user.jabber_id.present? %p Adresse XMPP : #{link_to 'xmpp:' + user.jabber_id, 'xmpp:' + user.jabber_id, class: 'url'} + - if current_account && user.deltachat_id.present? + %p + Adresse Delta Chat: #{link_to 'mailto:' + user.deltachat_id, 'mailto:' + user.deltachat_id, class: 'url'} - if current_account && user.mastodon_url.present? %p Adresse Mastodon : #{link_to 'Mastodon', user.mastodon_url, class: 'url'} diff --git a/db/migrate/20260814121540_add_deltachat_id_to_users.rb b/db/migrate/20260814121540_add_deltachat_id_to_users.rb new file mode 100644 index 000000000..59a1fb055 --- /dev/null +++ b/db/migrate/20260814121540_add_deltachat_id_to_users.rb @@ -0,0 +1,5 @@ +class AddDeltachatIdToUsers < ActiveRecord::Migration[5.2] + def change + add_column :users, :deltachat_id, :string + end +end diff --git a/db/pages/aide.html b/db/pages/aide.html index cccd12cb8..622231cb6 100644 --- a/db/pages/aide.html +++ b/db/pages/aide.html @@ -233,7 +233,7 @@

Visite (non) authentifiée, ou pourquoi ouvrir un
  • accéder à ses dépêches en modération ou en rédaction dans son tableau de bord ;
  • choisir un avatar ;
  • publier l’adresse de courriel associée à son compte (sous condition de karma) ;
  • -
  • afficher l’adresse d’un site personnel, une adresse XMPP et/ou une adresse Mastodon (sous condition de karma) ;
  • +
  • afficher l’adresse d’un site personnel, une adresse XMPP, une adresse Delta Chat et/ou une adresse Mastodon (sous condition de karma) ;
  • choisir quels types de contenus sont affichés en page d’accueil ;
  • afficher ou non les signatures ou les avatars ;
  • afficher par défaut les contenus notés négativement ;
  • @@ -574,8 +574,8 @@

    Système de karma

    Pour pouvoir afficher l’adresse de courriel associée à son compte ou -l’adresse de son site personnel ou de son compte Mastodon ou son adresse -XMPP, il faut avoir un karma strictement supérieur à 0 +l’adresse de son site personnel ou de son compte Mastodon, son adresse Delta Chat +ou son adresse XMPP, il faut avoir un karma strictement supérieur à 0 (source).

    Le karma a un effet sur les indications données aux moteurs de recherche externes et un faible karma conduit à des commentaires et contenus non indexés.

    @@ -1094,6 +1094,9 @@

    Quelles sont les données à caractère personnel (DCP) trait moment tant que le compte est ouvert ;
  • une adresse de messagerie instantanée XMPP : la personne utilisant le compte peut y associer une telle adresse et peut la modifier à tout +moment tant que le compte est ouvert ;
  • +
  • une adresse de messagerie instantanée Delta Chat: la personne utilisant +le compte peut y associer une telle adresse et peut la modifier à tout moment tant que le compte est ouvert ;
  • une adresse de compte Mastodon : la personne utilisant le compte peut y associer une telle adresse et peut la modifier à tout moment tant @@ -1146,8 +1149,8 @@

    Quelles sont les données inutiles au service qui
  • seront supprimées de la base le mot de passe, les dates et adresses IP des deux dernières connexions du compte, l’image éventuelle d’avatar, les éventuelles adresses de site web personnel, de messagerie -instantanée XMPP et/ou de compte Mastodon, l’éventuelle feuille de style -personnelle, l’éventuel choix de publier son adresse de courriel ;
  • +instantanée XMPP, de messagerie instantanée Delta Chat et/ou de compte Mastodon, +l’éventuelle feuille de style personnelle, l’éventuel choix de publier son adresse de courriel ;

  • seront supprimées les applications utilisant l’API du site reliées au compte, ainsi que les accès et tokens reliés à ces applications ou au compte.
  • @@ -1173,7 +1176,7 @@

    Quelles sont les données inutiles au service qui
  • seront supprimées de la base active l’adresse de courriel, le mot de passe, les dates et adresses IP des deux dernières connexions du compte, l’image éventuelle d’avatar, les éventuelles adresses de site -web personnel, de messagerie instantanée XMPP et/ou de compte Mastodon, +web personnel, de messagerie instantanée XMPP, de messagerie instantanée Delta Chat et/ou de compte Mastodon, l’éventuelle feuille de style personnelle ;
  • seront supprimées les applications utilisant l’API du site reliées au compte, ainsi que les accès et tokens reliés à ces diff --git a/db/pages/regles_de_moderation_du_problematique.html b/db/pages/regles_de_moderation_du_problematique.html index 291cc08f0..7b34d528d 100644 --- a/db/pages/regles_de_moderation_du_problematique.html +++ b/db/pages/regles_de_moderation_du_problematique.html @@ -45,7 +45,7 @@

    Les rappels aux règles via un commentaire

    Signalements au reste de l’équipe

    Les signalements au reste de l’équipe pour discussion sont :