-
Notifications
You must be signed in to change notification settings - Fork 4
/
users.clj
112 lines (98 loc) · 4.22 KB
/
users.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
(ns clj-jargon.users
(:use [clj-jargon.validations]
[clj-jargon.gen-query])
(:require [otel.otel :as otel])
(:import [org.irods.jargon.core.connection IRODSAccount]
[org.irods.jargon.core.exception DataNotFoundException]
[org.irods.jargon.core.query RodsGenQueryEnum]
[org.irods.jargon.core.pub UserGroupAO
UserAO]
[org.irods.jargon.core.pub.domain User UserGroup]))
(def ^:private user-type-mapping
{"rodsuser" :user
"groupadmin" :group-admin
"rodsadmin" :admin
"rodsgroup" :group
"unknown" :unknown
})
(defn user
[{^UserAO user-ao :userAO} username]
(otel/with-span [s ["user" {:attributes {"irods.user" username}}]]
(try
(let [jargon-user (.findByName user-ao username)]
{:id (.getId jargon-user)
:type (get user-type-mapping (.getTextValue (.getUserType jargon-user)) :unknown)
:name (.getName jargon-user)
:zone (.getZone jargon-user)
:info (.getInfo jargon-user)
:comment (.getComment jargon-user)
:date-created (long (.getTime (.getCreateTime jargon-user)))
:date-modified (long (.getTime (.getModifyTime jargon-user)))})
(catch DataNotFoundException _ {:type :none}))))
(defn username->id
[cm username]
(otel/with-span [s ["username->id" {:attributes {"irods.user" username}}]]
(:id (user cm username))))
(defn user-exists?
"Returns true if 'username' exists in iRODS."
[cm username]
(otel/with-span [s ["user-exists?" {:attributes {"irods.user" username}}]]
(not (= :none (:type (user cm username))))))
(defn user-groups
"Returns a list of group names that the user is in."
[{^UserGroupAO ug-ao :userGroupAO} username]
(otel/with-span [s ["user-groups" {:attributes {"irods.user" username}}]]
(for [^UserGroup ug (.findUserGroupsForUser ug-ao username)]
(.getUserGroupName ug))))
(defn user-group-ids
"Returns a list of group IDs that the user is in."
[{^UserGroupAO ug-ao :userGroupAO} username]
(otel/with-span [s ["user-group-ids" {:attributes {"irods.user" username}}]]
(for [^UserGroup ug (.findUserGroupsForUser ug-ao username)]
(.getUserGroupId ug))))
(defn proxied?
"Returns true if this context map is using a proxied (client) user"
[{:keys [^IRODSAccount irodsAccount]}]
(cond (not (= (.getUserName irodsAccount) (.getProxyName irodsAccount))) true
(not (= (.getZone irodsAccount) (.getProxyZone irodsAccount))) true
:else false))
(defn list-groups
"List groups (qualified usernames), using an optional search (postgresql/iquest LIKE format)"
([{^UserGroupAO ug-ao :userGroupAO}]
(for [^UserGroup ug (.findAll ug-ao)]
(str (.getUserGroupName ug) "#" (.getZone ug))))
([{^UserGroupAO ug-ao :userGroupAO} search]
(for [^UserGroup ug (.findWhere ug-ao search)]
(str (.getUserGroupName ug) "#" (.getZone ug)))))
(defn group-exists?
[{^UserGroupAO ug-ao :userGroupAO} group-name]
(-> (.findByName ug-ao group-name)
nil?
not))
(defn list-group-members
"List members of a group named `group-name` (qualified usernames)"
[{^UserGroupAO ug-ao :userGroupAO} group-name]
(for [^User u (.listUserGroupMembers ug-ao group-name)]
(.getNameWithZone u)))
(defn create-user-group
"Create a new user group named `group-name` in the logged-in user zone"
[{^UserGroupAO ug-ao :userGroupAO zone :zone} group-name]
(let [group (doto (new UserGroup)
(.setUserGroupName group-name)
(.setZone zone))]
(.addUserGroup ug-ao group)))
(defn delete-user-group
"Delete a group named `group-name` in the logged-in user zone"
[{^UserGroupAO ug-ao :userGroupAO zone :zone} group-name]
(let [group (doto (new UserGroup)
(.setUserGroupName group-name)
(.setZone zone))]
(.removeUserGroup ug-ao group)))
(defn add-to-group
"Add a user `username` to the group `group-name`"
[{^UserGroupAO ug-ao :userGroupAO zone :zone} group-name username]
(.addUserToGroup ug-ao group-name username zone))
(defn remove-from-group
"Remove a user `username` from the group `group-name`"
[{^UserGroupAO ug-ao :userGroupAO zone :zone} group-name username]
(.removeUserFromGroup ug-ao group-name username zone))