Confluence - Spacepermissions oder wer darf was?

Kurt

Heute war ich mit einer Anforderung konfrontiert, die in etwa wie folgt aussah
"Leg einen Confluence Account an und geb dem den gleichen Zugriff wie XYX".
Nachdem in Confluence selbst keine direkte Möglichkeit besteht für einen User alle Berechtigungen für die diversen Bereiche aufzulisten, muß also mal wieder Plain-old-SQL herhalten.

Auf die Schnelle also mal die Suchmaschine des Vertrauens befragt und unter anderem folgenden Treffer gefunden

https://confluence.atlassian.com/display/CONFKB/How+to+List+Which+Spaces+a+User+Can+Access

Der Part für die Ermittlung der gruppenbasierten Berechtigungen funktioniert einwandfrei

SELECT s.spacekey
FROM spacepermissions sp 
JOIN spaces s ON s.spaceid = sp.spaceid
JOIN cwd_group g ON sp.permgroupname = g.group_name
JOIN cwd_membership m ON g.id = m.parent_id
JOIN cwd_user u ON m.child_user_id = u.id
WHERE sp.permgroupname IN
    (
    SELECT g.group_name
    FROM cwd_group g
    JOIN cwd_membership m ON g.id = m.parent_id
    JOIN cwd_user u ON m.child_user_id = u.id
    WHERE u.user_name = '<user_name>'
    )
GROUP BY s.spacekey
ORDER BY s.spacekey;

Allerdings liefert die Query für die individuellen Rechte nichts zurück

SELECT s.spacekey
FROM spacepermissions sp
JOIN spaces s ON s.spaceid = sp.spaceid
WHERE sp.permusername = '<user_name>'
GROUP BY s.spacekey
ORDER BY s.spacekey;

Das Problem an der Stelle ist, das in der Spalte permusername der Tabelle SPACEPERMISSIONS nicht (mehr) direkt der Username referenziert wird, sondern viel mehr eine eindeutige UUID die man mittels der Mappingtabelle user_mapping auflösen muss (im konkreten Beispiel joine ich de cwd_users, sprich die zentrale Benutzertabelle ebenfalls dazu)

select s.spacekey
from cwd_user u
join user_mapping um
        on u.user_name=um.username
join SPACEPERMISSIONS sp
        on um.user_key=sp.permusername
join SPACES s
        on sp.spaceid=s.spaceid
where u.user_name = "<user_name>"
group by s.spacekey
order by s.spacekey;