Utilisateurs ayant accédé à un sujet dans une catégorie protégée

J’aurais besoin d’un peu d’aide. Je ne m’y connais absolument pas en SQL.

Je gère un forum pour mon syndicat. Je suis un représentant élu, mais je ne fais pas partie de la direction. La raison pour laquelle j’administre ce forum est que j’ai déjà de l’expérience avec Discourse ; je l’ai mis en place pour moderniser notre communication interne (collaboration d’équipe), et je suis actuellement le seul (sur 20 personnes) à avoir la moindre idée de comment faire quoi que ce soit de plus avancé dans un contexte technique en coulisses, au-delà de l’utilisation d’un générateur de sites web pour créer un site. Le point important est que notre groupe est technophile en tant qu’utilisateurs finaux, mais pas « en coulisses ».

Comme il s’agit d’un espace de travail pour nous tous, y compris la direction, j’ai créé quelques catégories dans lesquelles ils peuvent travailler et où je ne devrais pas pouvoir espionner. (Disons que c’est au-dessus de mon niveau de responsabilité).

Puisqu’il n’y a pas de véritable moyen de cacher du contenu à un administrateur, j’ai créé un composant de thème avec du CSS pour :

  • masquer les boutons de messages dans les profils des utilisateurs
  • masquer le bouton d’impersonation dans les profils d’administrateur
  • masquer l’aperçu des sujets des catégories sur la page des catégories
  • masquer la liste des sujets au sein des catégories à tout le monde
    • Puis ajouter la visibilité des listes de sujets aux membres d’un groupe (principal).

En résumé, je crée une série de journaux et de pistes d’audit qui seront disponibles au cas où ils souhaiteraient vérifier que je n’espionne pas.

  1. ils peuvent consulter les journaux du site pour voir si j’ai jamais touché à ce composant de thème (modification/désactivation) sans qu’ils en soient informés ; ils peuvent demander pourquoi et voir les détails.
  2. si j’ai jamais utilisé la fonction d’impersonation ou de visualisation des messages, cela apparaîtrait également dans les journaux.

Fondamentalement, si je modifie jamais le CSS que j’ai écrit pour masquer ces éléments, ils pourront le voir et me demander de m’expliquer.

  1. si je m’étais ajouté à leur groupe afin que le contenu me soit visible, les journaux du groupe montreraient que je me suis ajouté/retiré. Ils peuvent me demander de m’expliquer.

Ce dont j’ai besoin pour m’aider :
si je consulte jamais la page avec les feuilles de style CSS désactivées, je peux voir les URL des sujets. Ensuite, évidemment, je peux ouvrir les sujets directement. Ce que je veux, c’est une requête Data Explorer qu’ils (l’équipe exécutive qui obtient tous un accès administrateur) peuvent exécuter de temps en temps pour afficher les sujets consultés au sein d’une catégorie par tout utilisateur ne faisant pas partie du groupe « executive ».

Ils n’ont aucune idée que cela est possible, mais je veux couvrir toutes les bases. Je veux que cela soit pérenne au-delà de ma propre présence. Dans la mesure du possible avec les outils disponibles.

Donc, encore une fois, j’ai besoin d’une requête Data Explorer pour :

  1. Si l’utilisateur ne fait pas partie du groupe « executive »
  2. Alors afficher les sujets consultés par l’utilisateur(s) dans la catégorie « EB » (ou l’ID de catégorie : 34)

Cela, combiné au masquage CSS que j’ai appliqué, crée suffisamment de traçabilité pour indiquer que si quelqu’un (moi ou toute personne ne faisant pas partie de l’équipe exécutive qui pourrait se voir attribuer un accès administrateur à l’avenir) a consulté des sujets au sein de cette catégorie et qu’il ne fait pas partie de l’équipe exécutive, il a vraiment dû faire un effort considérable et il s’agit d’un espionnage intentionnel.

Quelqu’un peut-il m’aider avec cela ?

Je pense que vous devriez ouvrir un nouveau sujet à ce sujet…

Mais, vous pouvez essayer (et apprendre le SQL) :wink:

Point 1 :

-- [params]
-- string :gname = executive
-- string :uname = SidV
SELECT u.username, g.id as "group id", g.name
FROM group_users gu, users u, groups g
WHERE g.id = gu.group_id
AND u.id = gu.user_id
AND g.name ILIKE :gname
AND u.username ILIKE :uname

Point 2

Je ne comprends pas votre point… de quoi avez-vous besoin ?

Vérifiez la liste des requêtes et essayez d’adapter une requête à votre besoin.

Écrivez essentiellement une requête pour afficher tous les sujets lus dans les catégories 1 ou 2 par tout utilisateur non assigné au groupe A.

Utilisateurs ayant accédé à un sujet dans une catégorie protégée

Cette requête retourne tous les topic_users (utilisateurs ayant consulté ou publié dans un sujet) qui ne sont pas membres du groupe spécifié pour le paramètre :group_name de la requête, pour les sujets appartenant à des catégories ayant ce groupe dans leurs paramètres de sécurité. Cela peut être utilisé pour identifier les administrateurs ayant consulté un sujet dans une catégorie à laquelle des permissions de groupe ont été ajoutées.

--[params]
-- string :group_name

WITH allowed_users AS (
SELECT user_id
FROM group_users gu
JOIN groups g
ON g.id = gu.group_id
WHERE g.name = :group_name
),
group_categories AS (
SELECT category_id
FROM category_groups cg
JOIN groups g
ON g.id = cg.group_id
WHERE g.name = :group_name
)

SELECT
tu.user_id,
tu.topic_id,
tu.last_visited_at::date
FROM topic_users tu
JOIN topics t
ON t.id = tu.topic_id
WHERE t.category_id IN (SELECT category_id FROM group_categories)
AND tu.user_id NOT IN (SELECT user_id FROM allowed_users)
ORDER BY t.category_id