Skip to content

Commit b6ba5c7

Browse files
authored
Merge pull request #1811 from CVEProject/dr_1699
Resolves issue #1699, Fix registry user lookups by user UUID.
2 parents 23fcd13 + 61bebc1 commit b6ba5c7

2 files changed

Lines changed: 71 additions & 20 deletions

File tree

src/controller/registry-user.controller/registry-user.controller.js

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -103,21 +103,40 @@ async function getUser (req, res, next) {
103103
const isSecretariat = await repo.isSecretariatByShortName(req.ctx.org)
104104

105105
try {
106-
const result = identifier
107-
? await userRepo.getUserUUID(identifier)
108-
: await userRepo.findOneByUsernameAndOrgShortname(userToGetParameters.username, userToGetParameters.org)
106+
let result
107+
let org
108+
109+
if (identifier) {
110+
result = await userRepo.findUserByUUID(identifier)
111+
if (!result) {
112+
logger.info({ uuid: req.ctx.uuid, message: identifier + ' user could not be found.' })
113+
return res.status(404).json(error.userDne(identifier))
114+
}
115+
116+
const orgUUID = await repo.getOrgUUIDByUserUUID(identifier)
117+
if (!orgUUID) {
118+
logger.info({ uuid: req.ctx.uuid, message: identifier + ' user organization could not be found.' })
119+
return res.status(404).json(error.userDne(identifier))
120+
}
109121

110-
const org = identifier
111-
? await repo.getOrg(identifier, true)
112-
: await repo.getOrg(req.ctx.params.shortname)
122+
org = await repo.getOrg(orgUUID, true)
113123

114-
if (!result) {
115-
logger.info({ uuid: req.ctx.uuid, message: identifier || userToGetParameters.username + 'user could not be found.' })
116-
return res.status(404).json(error.userDne(userToGetParameters.username))
117-
}
118-
userToGetParameters = {
119-
org: org.short_name,
120-
username: result.username
124+
userToGetParameters = {
125+
org: org.short_name,
126+
username: result.username
127+
}
128+
} else {
129+
result = await userRepo.findOneByUsernameAndOrgShortname(userToGetParameters.username, userToGetParameters.org)
130+
if (!result) {
131+
logger.info({ uuid: req.ctx.uuid, message: userToGetParameters.username + ' user could not be found.' })
132+
return res.status(404).json(error.userDne(userToGetParameters.username))
133+
}
134+
135+
org = await repo.getOrg(req.ctx.params.shortname)
136+
userToGetParameters = {
137+
org: org.short_name,
138+
username: result.username
139+
}
121140
}
122141

123142
if (!isSecretariat && req.ctx.org !== userToGetParameters.org) {
@@ -249,14 +268,31 @@ async function updateUser (req, res, next) {
249268
// TODO: This will need to be atomic at some point like revoke or grant
250269
// Specific check for org_short_name (Secretariat only)
251270

252-
const userToEdit = identifier
253-
? await userRepo.getUserUUID(identifier)
254-
: await userRepo.findOneByUsernameAndOrgShortname(userToEditParameters.username, userToEditParameters.org, { session })
271+
let userToEdit
272+
let org
273+
if (identifier) {
274+
userToEdit = await userRepo.findUserByUUID(identifier, { session })
275+
if (!userToEdit) {
276+
logger.info({ uuid: req.ctx.uuid, message: identifier + ' user could not be found.' })
277+
return res.status(404).json(error.userDne(identifier))
278+
}
255279

256-
const org = await orgRepo.findOneByShortName(userToEditParameters.org)
257-
if (!org) {
258-
logger.info({ uuid: req.ctx.uuid, message: `Target organization ${userToEditParameters.org} does not exist.` })
259-
return res.status(404).json(error.orgDnePathParam(userToEditParameters.org))
280+
const orgUUID = await orgRepo.getOrgUUIDByUserUUID(identifier)
281+
if (!orgUUID) {
282+
logger.info({ uuid: req.ctx.uuid, message: identifier + ' user organization could not be found.' })
283+
return res.status(404).json(error.orgDnePathParam(identifier))
284+
}
285+
286+
org = await orgRepo.findOneByUUID(orgUUID, { session })
287+
userToEditParameters.org = org.short_name
288+
userToEditParameters.username = userToEdit.username
289+
} else {
290+
userToEdit = await userRepo.findOneByUsernameAndOrgShortname(userToEditParameters.username, userToEditParameters.org, { session })
291+
org = await orgRepo.findOneByShortName(userToEditParameters.org)
292+
if (!org) {
293+
logger.info({ uuid: req.ctx.uuid, message: `Target organization ${userToEditParameters.org} does not exist.` })
294+
return res.status(404).json(error.orgDnePathParam(userToEditParameters.org))
295+
}
260296
}
261297

262298
if (body.org_short_name && !isSecretariat) {

src/repositories/baseOrgRepository.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,21 @@ class BaseOrgRepository extends BaseRepository {
188188
return null
189189
}
190190

191+
// Eventually, when a user can be in more than one org this will no longer be valid.
192+
/**
193+
* @async
194+
* @function getOrgUUIDByUserUUID
195+
* @description Retrieves the UUID of an organization by a user's UUID.
196+
* @param {string} userUUID - The UUID of the user.
197+
* @param {object} [options={}] - Optional settings for the repository query.
198+
* @returns {Promise<string|null>} The organization UUID or null if not found.
199+
*/
200+
async getOrgUUIDByUserUUID (userUUID, options = {}) {
201+
const org = await BaseOrgModel.findOne({ users: userUUID }, null, options).select('UUID')
202+
if (org) return org.UUID
203+
return null
204+
}
205+
191206
/**
192207
* @async
193208
* @function orgExists

0 commit comments

Comments
 (0)