Skip to content
This repository was archived by the owner on Aug 21, 2024. It is now read-only.
3 changes: 2 additions & 1 deletion packages/server-core/src/hooks/verify-project-owner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ Ethereal Engine. All Rights Reserved.
import { BadRequest, Forbidden, NotAuthenticated } from '@feathersjs/errors'
import { HookContext, Paginated } from '@feathersjs/feathers'

import { checkScope } from '@etherealengine/engine/src/common/functions/checkScope'
import {
ProjectPermissionType,
projectPermissionPath
Expand All @@ -39,7 +40,7 @@ export default () => {
if (context.params.isInternal) return context
const loggedInUser = context.params.user as UserType
if (!loggedInUser) throw new NotAuthenticated('No logged in user')
if (loggedInUser.scopes && loggedInUser.scopes.find((scope) => scope.type === 'admin:admin')) return context
if (loggedInUser.scopes && (await checkScope(loggedInUser, 'projects', 'write'))) return context
const app = context.app
const projectId =
context.service === 'project'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Ethereal Engine. All Rights Reserved.
import { hooks as schemaHooks } from '@feathersjs/schema'

import { projectBuildPatchValidator } from '@etherealengine/engine/src/schemas/projects/project-build.schema'
import { disallow, iff, isProvider } from 'feathers-hooks-common'
import verifyScope from '../../hooks/verify-scope'
import {
projectBuildExternalResolver,
Expand All @@ -35,16 +36,16 @@ export default {

before: {
all: [],
find: [verifyScope('admin', 'admin')],
get: [],
create: [],
update: [],
find: [iff(isProvider('external'), verifyScope('projects', 'read'))],
get: [disallow()],
create: [disallow()],
update: [disallow()],
patch: [
iff(isProvider('external'), verifyScope('projects', 'write')),
() => schemaHooks.validateData(projectBuildPatchValidator),
schemaHooks.resolveData(projectBuildPatchResolver),
verifyScope('admin', 'admin')
schemaHooks.resolveData(projectBuildPatchResolver)
],
remove: []
remove: [disallow()]
},
after: {
all: [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ All portions of the code written by the Ethereal Engine team are Copyright © 20
Ethereal Engine. All Rights Reserved.
*/

import { iff, isProvider } from 'feathers-hooks-common'
import { disallow, iff, isProvider } from 'feathers-hooks-common'
import projectPermissionAuthenticate from '../../hooks/project-permission-authenticate'
import verifyScope from '../../hooks/verify-scope'

Expand All @@ -29,12 +29,12 @@ export default {

before: {
all: [],
find: [],
get: [],
create: [],
update: [],
patch: [iff(isProvider('external'), verifyScope('editor', 'write') as any, projectPermissionAuthenticate('write'))],
remove: []
find: [disallow()],
get: [disallow()],
create: [disallow()],
update: [disallow()],
patch: [iff(isProvider('external'), verifyScope('projects', 'write'), projectPermissionAuthenticate('write'))],
remove: [disallow()]
},
after: {
all: [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Ethereal Engine. All Rights Reserved.
import { hooks as schemaHooks } from '@feathersjs/schema'

import { projectInvalidatePatchValidator } from '@etherealengine/engine/src/schemas/projects/project-invalidate.schema'
import { disallow, iff, isProvider } from 'feathers-hooks-common'
import verifyScope from '../../hooks/verify-scope'
import { projectInvalidatePatchResolver } from './project-invalidate.resolvers'

Expand All @@ -31,16 +32,16 @@ export default {

before: {
all: [],
find: [],
get: [],
create: [],
update: [],
find: [disallow()],
get: [disallow()],
create: [disallow()],
update: [disallow()],
patch: [
iff(isProvider('external'), verifyScope('projects', 'write')),
() => schemaHooks.validateData(projectInvalidatePatchValidator),
schemaHooks.resolveData(projectInvalidatePatchResolver),
verifyScope('admin', 'admin')
schemaHooks.resolveData(projectInvalidatePatchResolver)
],
remove: []
remove: [disallow()]
},
after: {
all: [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import { disallow, iff, isProvider } from 'feathers-hooks-common'
import verifyProjectOwner from '../../hooks/verify-project-owner'

import { INVITE_CODE_REGEX, USER_ID_REGEX } from '@etherealengine/common/src/constants/IdConstants'
import { checkScope } from '@etherealengine/engine/src/common/functions/checkScope'
import {
ProjectPermissionData,
ProjectPermissionPatch,
Expand Down Expand Up @@ -89,7 +90,6 @@ const checkExistingPermissions = async (context: HookContext<ProjectPermissionSe
const data: ProjectPermissionData[] = Array.isArray(context.data) ? context.data : [context.data]

const selfUser = context.params!.user!
//
try {
const searchParam = data[0].inviteCode
? {
Expand Down Expand Up @@ -126,7 +126,7 @@ const checkExistingPermissions = async (context: HookContext<ProjectPermissionSe
type:
data[0].type === 'owner' ||
existingPermissionsCount.length === 0 ||
(selfUser.scopes?.find((scope) => scope.type === 'admin:admin') && selfUser.id === users.data[0].id)
((await checkScope(selfUser, 'projects', 'write')) && selfUser.id === users.data[0].id)
? 'owner'
: 'user'
}
Expand All @@ -143,8 +143,7 @@ const checkExistingPermissions = async (context: HookContext<ProjectPermissionSe
*/
const checkUserScopes = async (context: HookContext<ProjectPermissionService>) => {
if (!context.params.user) return false
if (context.params.user.scopes.find((scope) => scope.type === 'admin:admin')) return false
return true
return checkScope(context.params.user, 'projects', 'read')
}

/**
Expand Down Expand Up @@ -173,7 +172,7 @@ const checkPermissionStatus = async (context: HookContext<ProjectPermissionServi
*/
const ensureOwnership = async (context: HookContext<ProjectPermissionService>) => {
const loggedInUser = context.params!.user!
if (loggedInUser.scopes?.find((scope) => scope.type === 'admin:admin')) return context
if (await checkScope(loggedInUser, 'projects', 'read')) return
const result = (Array.isArray(context.result) ? context.result : [context.result]) as ProjectPermissionType[]
if (result[0].userId !== loggedInUser.id) throw new Forbidden('You do not own this project-permission')
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,11 @@ describe('project-permission.test', () => {
userId: user4.id
})
await app.service(scopePath).create({
type: 'admin:admin',
type: 'projects:read',
userId: user4.id
})
await app.service(scopePath).create({
type: 'projects:write',
userId: user4.id
})
})
Expand Down
5 changes: 3 additions & 2 deletions packages/server-core/src/projects/project/project.hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import verifyScope from '../../hooks/verify-scope'
import { projectPermissionDataResolver } from '../project-permission/project-permission.resolvers'

import { GITHUB_URL_REGEX } from '@etherealengine/common/src/constants/GitHubConstants'
import { checkScope } from '@etherealengine/engine/src/common/functions/checkScope'
import { apiJobPath } from '@etherealengine/engine/src/schemas/cluster/api-job.schema'
import { StaticResourceType, staticResourcePath } from '@etherealengine/engine/src/schemas/media/static-resource.schema'
import { ProjectBuildUpdateItemType } from '@etherealengine/engine/src/schemas/projects/project-build.schema'
Expand Down Expand Up @@ -125,7 +126,7 @@ const ensurePushStatus = async (context: HookContext<ProjectService>) => {
.select()
.options({ nestTables: true })

const allowedProjects = await projectPermissions.map((permission) => permission.project)
const allowedProjects = projectPermissions.map((permission) => permission.project)
const repoAccess =
githubIdentityProvider.data.length > 0
? ((await context.app.service(githubRepoAccessPath).find({
Expand Down Expand Up @@ -175,7 +176,7 @@ const ensurePushStatus = async (context: HookContext<ProjectService>) => {
context.projectPushIds = context.projectPushIds.concat(matchingAllowedRepos.map((repo) => repo.id))
}

if (!context.params.user!.scopes?.find((scope) => scope.type === 'admin:admin'))
if (!(await checkScope(context.params.user!, 'projects', 'read')))
context.params.query.id = { $in: [...new Set(allowedProjects.map((project) => project.id))] }
}
}
Expand Down
6 changes: 3 additions & 3 deletions packages/server-core/src/projects/project/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,14 @@ export default (app: Application): void => {
})) as any as ProjectPermissionType[]
targetIds = targetIds.concat(projectOwners.map((permission) => permission.userId))

const adminScopes = (await app.service(scopePath).find({
const projectReadScopes = (await app.service(scopePath).find({
query: {
type: 'admin:admin'
type: 'projects:read'
},
paginate: false
})) as ScopeType[]

targetIds = targetIds.concat(adminScopes.map((admin) => admin.userId!))
targetIds = targetIds.concat(projectReadScopes.map((admin) => admin.userId!))
targetIds = _.uniq(targetIds)
return Promise.all(targetIds.map((userId: UserID) => app.channel(`userIds/${userId}`).send(data)))
} catch (err) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ All portions of the code written by the Ethereal Engine team are Copyright © 20
Ethereal Engine. All Rights Reserved.
*/

import { disallow, iff, isProvider } from 'feathers-hooks-common'
import verifyScope from '../../hooks/verify-scope'

export default {
Expand All @@ -27,12 +28,12 @@ export default {

before: {
all: [],
find: [],
get: [],
create: [verifyScope('editor', 'write')],
update: [],
patch: [],
remove: []
find: [disallow()],
get: [disallow()],
create: [iff(isProvider('external'), verifyScope('editor', 'write'))],
update: [disallow()],
patch: [disallow()],
remove: [disallow()]
},
after: {
all: [],
Expand Down
8 changes: 4 additions & 4 deletions packages/server-core/src/projects/scene/scene.hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ export default {
all: [],
find: [],
get: [],
create: [iff(isProvider('external'), verifyScope('editor', 'write') as any, projectPermissionAuthenticate(false))],
update: [iff(isProvider('external'), verifyScope('editor', 'write') as any, projectPermissionAuthenticate(false))],
patch: [iff(isProvider('external'), verifyScope('editor', 'write') as any, projectPermissionAuthenticate(false))],
remove: [iff(isProvider('external'), verifyScope('editor', 'write') as any, projectPermissionAuthenticate(false))]
create: [iff(isProvider('external'), verifyScope('editor', 'write'), projectPermissionAuthenticate(false))],
update: [iff(isProvider('external'), verifyScope('editor', 'write'), projectPermissionAuthenticate(false))],
patch: [iff(isProvider('external'), verifyScope('editor', 'write'), projectPermissionAuthenticate(false))],
remove: [iff(isProvider('external'), verifyScope('editor', 'write'), projectPermissionAuthenticate(false))]
},

after: {
Expand Down