Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -620,10 +620,12 @@ class DashboardResource {
if (resourceType == "file") {
DashboardFile(
record.into(USER).getEmail,
record.get(
"user_file_access",
classOf[UserFileAccessPrivilege]
) == UserFileAccessPrivilege.WRITE,
record
.get(
"user_file_access",
classOf[UserFileAccessPrivilege]
)
.toString,
record.into(FILE).into(classOf[File])
)
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package edu.uci.ics.texera.web.resource.dashboard.user.file

import edu.uci.ics.texera.web.SqlServer
import edu.uci.ics.texera.web.auth.SessionUser
import edu.uci.ics.texera.web.model.common.AccessEntry
import edu.uci.ics.texera.web.model.jooq.generated.Tables.{
FILE,
Expand All @@ -18,12 +17,10 @@ import edu.uci.ics.texera.web.model.jooq.generated.tables.daos.{
}
import edu.uci.ics.texera.web.model.jooq.generated.tables.pojos.{FileOfWorkflow, UserFileAccess}
import edu.uci.ics.texera.web.resource.dashboard.user.file.UserFileAccessResource.{
checkWriteAccess,
context,
fileDao,
userDao
}
import io.dropwizard.auth.Auth
import org.jooq.DSLContext
import org.jooq.types.UInteger

Expand Down Expand Up @@ -73,46 +70,6 @@ object UserFileAccessResource {
None
}
}

/**
* Identifies whether the given user has read-only access over the given workflow
* @param fid file id
* @param uid user id, works with file id as primary keys in database
*/
def checkReadAccess(fid: UInteger, uid: UInteger): Unit = {
if (
!(getPrivilege(fid, uid).eq(UserFileAccessPrivilege.READ) || getPrivilege(fid, uid).eq(
UserFileAccessPrivilege.WRITE
))
) {
throw new ForbiddenException("No sufficient access privilege.")
}
}

/**
* Identifies whether the given user has write access over the given workflow
* @param fid file id
* @param uid user id, works with file id as primary keys in database
*/
def checkWriteAccess(fid: UInteger, uid: UInteger): Unit = {
if (!getPrivilege(fid, uid).eq(UserFileAccessPrivilege.WRITE)) {
throw new ForbiddenException("No sufficient access privilege.")
}
}

/**
* @param fid file id
* @param uid user id, works with file id as primary keys in database
* @return UserFileAccessPrivilege value indicating NONE/READ/WRITE
*/
private def getPrivilege(fid: UInteger, uid: UInteger): UserFileAccessPrivilege = {
context
.select()
.from(USER_FILE_ACCESS)
.where(USER_FILE_ACCESS.FID.eq(fid).and(USER_FILE_ACCESS.UID.eq(uid)))
.fetchOneInto(classOf[UserFileAccess])
.getPrivilege
}
}
@Produces(Array(MediaType.APPLICATION_JSON))
@RolesAllowed(Array("REGULAR", "ADMIN"))
Expand All @@ -129,8 +86,7 @@ class UserFileAccessResource {
@GET
@Path("/owner/{fid}")
def getOwner(@PathParam("fid") fid: UInteger): String = {
val uid = fileDao.fetchOneByFid(fid).getOwnerUid
userDao.fetchOneByUid(uid).getEmail
userDao.fetchOneByUid(fileDao.fetchOneByFid(fid).getOwnerUid).getEmail
}

/**
Expand All @@ -142,8 +98,7 @@ class UserFileAccessResource {
@GET
@Path("list/{fid}")
def getAccessList(
@PathParam("fid") fid: UInteger,
@Auth user: SessionUser
@PathParam("fid") fid: UInteger
): util.List[AccessEntry] = {
context
.select(
Expand All @@ -157,7 +112,7 @@ class UserFileAccessResource {
.where(
USER_FILE_ACCESS.FID
.eq(fid)
.and(USER_FILE_ACCESS.UID.notEqual(user.getUid))
.and(USER_FILE_ACCESS.UID.notEqual(fileDao.fetchOneByFid(fid).getOwnerUid))
)
.fetchInto(classOf[AccessEntry])
}
Expand All @@ -175,10 +130,8 @@ class UserFileAccessResource {
def grantAccess(
@PathParam("fid") fid: UInteger,
@PathParam("email") email: String,
@PathParam("privilege") privilege: String,
@Auth user: SessionUser
@PathParam("privilege") privilege: String
): Unit = {
checkWriteAccess(fid, user.getUid)
userFileAccessDao.merge(
new UserFileAccess(
userDao.fetchOneByEmail(email).getUid,
Expand All @@ -197,13 +150,10 @@ class UserFileAccessResource {
*/
@DELETE
@Path("/revoke/{fid}/{email}")
@RolesAllowed(Array("REGULAR", "ADMIN"))
def revokeAccess(
@PathParam("fid") fid: UInteger,
@PathParam("email") email: String,
@Auth user: SessionUser
@PathParam("email") email: String
): Unit = {
checkWriteAccess(fid, user.getUid)
context
.delete(USER_FILE_ACCESS)
.where(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@ import edu.uci.ics.texera.web.model.jooq.generated.Tables._
import edu.uci.ics.texera.web.model.jooq.generated.enums.UserFileAccessPrivilege
import edu.uci.ics.texera.web.model.jooq.generated.tables.daos.{FileDao, UserFileAccessDao}
import edu.uci.ics.texera.web.model.jooq.generated.tables.pojos.{File, User, UserFileAccess}
import edu.uci.ics.texera.web.resource.dashboard.user.file.UserFileAccessResource.{
checkReadAccess,
checkWriteAccess
}
import edu.uci.ics.texera.web.resource.dashboard.user.file.UserFileResource.{
DashboardFile,
context,
Expand Down Expand Up @@ -66,7 +62,7 @@ object UserFileResource {

case class DashboardFile(
ownerEmail: String,
writeAccess: Boolean,
accessLevel: String,
file: File
)
}
Expand Down Expand Up @@ -116,7 +112,7 @@ class UserFileResource {
fids += fileRecord.into(FILE).getFid
fileEntries += DashboardFile(
fileRecord.into(USER).getEmail,
fileRecord.into(USER_FILE_ACCESS).getPrivilege == UserFileAccessPrivilege.WRITE,
fileRecord.into(USER_FILE_ACCESS).getPrivilege.toString,
fileRecord.into(FILE).into(classOf[File])
)
})
Expand All @@ -136,7 +132,7 @@ class UserFileResource {
if (!fileEntries.exists(file => { file.file.getFid == fileRecord.into(FILE).getFid })) {
fileEntries += DashboardFile(
fileRecord.into(USER).getEmail,
writeAccess = false,
"READ",
fileRecord.into(FILE).into(classOf[File])
)
}
Expand Down Expand Up @@ -183,7 +179,6 @@ class UserFileResource {
@PathParam("fid") fid: UInteger,
@Auth user: SessionUser
): Unit = {
checkWriteAccess(fid, user.getUid)
Files.deleteIfExists(Paths.get(fileDao.fetchOneByFid(fid).getPath))
fileDao.deleteById(fid)
}
Expand All @@ -194,7 +189,6 @@ class UserFileResource {
@PathParam("fid") fid: UInteger,
@Auth user: SessionUser
): Response = {
checkReadAccess(fid, user.getUid)
Response
.ok(
new StreamingOutput() {
Expand All @@ -220,7 +214,6 @@ class UserFileResource {
@PathParam("name") name: String,
@Auth user: SessionUser
): Unit = {
checkWriteAccess(fid, user.getUid)
val validationRes = this.validateFileName(name, user.getUid)
if (!validationRes.getLeft) {
throw new BadRequestException(validationRes.getRight)
Expand All @@ -235,10 +228,8 @@ class UserFileResource {
@Path("/description/{fid}/{description}")
def changeFileDescription(
@PathParam("fid") fid: UInteger,
@PathParam("description") description: String,
@Auth user: SessionUser
@PathParam("description") description: String
): Unit = {
checkWriteAccess(fid, user.getUid)
val userFile = fileDao.fetchOneByFid(fid)
userFile.setDescription(description)
fileDao.update(userFile)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package edu.uci.ics.texera.web.resource.dashboard.user.project
import edu.uci.ics.texera.web.SqlServer
import edu.uci.ics.texera.web.auth.SessionUser
import edu.uci.ics.texera.web.model.common.AccessEntry
import edu.uci.ics.texera.web.model.jooq.generated.Tables.{PROJECT_USER_ACCESS, USER}
import edu.uci.ics.texera.web.model.jooq.generated.enums.ProjectUserAccessPrivilege
Expand All @@ -10,7 +9,6 @@ import edu.uci.ics.texera.web.model.jooq.generated.tables.daos.{
UserDao
}
import edu.uci.ics.texera.web.model.jooq.generated.tables.pojos.ProjectUserAccess
import io.dropwizard.auth.Auth
import org.jooq.DSLContext
import org.jooq.types.UInteger
import java.util
Expand Down Expand Up @@ -46,8 +44,7 @@ class ProjectAccessResource() {
@GET
@Path("/list/{pid}")
def getAccessList(
@PathParam("pid") pid: UInteger,
@Auth user: SessionUser
@PathParam("pid") pid: UInteger
): util.List[AccessEntry] = {
context
.select(
Expand All @@ -58,7 +55,11 @@ class ProjectAccessResource() {
.from(PROJECT_USER_ACCESS)
.join(USER)
.on(USER.UID.eq(PROJECT_USER_ACCESS.UID))
.where(PROJECT_USER_ACCESS.PID.eq(pid).and(PROJECT_USER_ACCESS.UID.notEqual(user.getUid)))
.where(
PROJECT_USER_ACCESS.PID
.eq(pid)
.and(PROJECT_USER_ACCESS.UID.notEqual(projectDao.fetchOneByPid(pid).getOwnerId))
)
.fetchInto(classOf[AccessEntry])
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@ package edu.uci.ics.texera.web.resource.dashboard.user.project
import edu.uci.ics.texera.web.SqlServer
import edu.uci.ics.texera.web.auth.SessionUser
import edu.uci.ics.texera.web.model.jooq.generated.Tables._
import edu.uci.ics.texera.web.model.jooq.generated.enums.{
ProjectUserAccessPrivilege,
UserFileAccessPrivilege
}
import edu.uci.ics.texera.web.model.jooq.generated.enums.ProjectUserAccessPrivilege
import edu.uci.ics.texera.web.model.jooq.generated.tables.daos.{
FileOfProjectDao,
ProjectDao,
Expand All @@ -21,7 +18,6 @@ import edu.uci.ics.texera.web.resource.dashboard.user.workflow.WorkflowResource.

import io.dropwizard.auth.Auth
import org.apache.commons.lang3.StringUtils
import org.jooq.impl.DSL.case_
import org.jooq.types.UInteger
import java.sql.Timestamp
import java.util
Expand Down Expand Up @@ -105,7 +101,7 @@ object ProjectResource {
ownerID: UInteger,
creationTime: Timestamp,
color: String,
writeAccess: Boolean
accessLevel: String
)
}

Expand Down Expand Up @@ -141,8 +137,7 @@ class ProjectResource {
PROJECT.OWNER_ID,
PROJECT.CREATION_TIME,
PROJECT.COLOR,
case_()
.when(PROJECT_USER_ACCESS.PRIVILEGE.eq(ProjectUserAccessPrivilege.WRITE), "true")
PROJECT_USER_ACCESS.PRIVILEGE
)
.from(PROJECT)
.leftJoin(PROJECT_USER_ACCESS)
Expand Down Expand Up @@ -221,7 +216,7 @@ class ProjectResource {
.map(fileRecord =>
DashboardFile(
fileRecord.into(USER).getName,
fileRecord.into(USER_FILE_ACCESS).getPrivilege == UserFileAccessPrivilege.WRITE,
fileRecord.into(USER_FILE_ACCESS).getPrivilege.toString,
fileRecord.into(FILE).into(classOf[File])
)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package edu.uci.ics.texera.web.resource.dashboard.user.workflow

import edu.uci.ics.texera.web.SqlServer
import edu.uci.ics.texera.web.auth.SessionUser
import edu.uci.ics.texera.web.model.common.AccessEntry
import edu.uci.ics.texera.web.model.jooq.generated.Tables.{
PROJECT_USER_ACCESS,
Expand All @@ -16,14 +15,9 @@ import edu.uci.ics.texera.web.model.jooq.generated.tables.daos.{
WorkflowUserAccessDao
}
import edu.uci.ics.texera.web.model.jooq.generated.tables.pojos.WorkflowUserAccess
import edu.uci.ics.texera.web.resource.dashboard.user.workflow.WorkflowAccessResource.{
context,
hasWriteAccess
}
import io.dropwizard.auth.Auth
import edu.uci.ics.texera.web.resource.dashboard.user.workflow.WorkflowAccessResource.context
import org.jooq.DSLContext
import org.jooq.types.UInteger

import java.util
import javax.annotation.security.RolesAllowed
import javax.ws.rs._
Expand Down Expand Up @@ -98,8 +92,7 @@ class WorkflowAccessResource() {
@GET
@Path("/owner/{wid}")
def getOwner(@PathParam("wid") wid: UInteger): String = {
val uid = workflowOfUserDao.fetchByWid(wid).get(0).getUid
userDao.fetchOneByUid(uid).getEmail
userDao.fetchOneByUid(workflowOfUserDao.fetchByWid(wid).get(0).getUid).getEmail
}

/**
Expand All @@ -111,8 +104,7 @@ class WorkflowAccessResource() {
@GET
@Path("/list/{wid}")
def getAccessList(
@PathParam("wid") wid: UInteger,
@Auth sessionUser: SessionUser
@PathParam("wid") wid: UInteger
): util.List[AccessEntry] = {
context
.select(
Expand All @@ -126,7 +118,7 @@ class WorkflowAccessResource() {
.where(
WORKFLOW_USER_ACCESS.WID
.eq(wid)
.and(WORKFLOW_USER_ACCESS.UID.notEqual(sessionUser.getUser.getUid))
.and(WORKFLOW_USER_ACCESS.UID.notEqual(workflowOfUserDao.fetchByWid(wid).get(0).getUid))
)
.fetchInto(classOf[AccessEntry])
}
Expand All @@ -144,12 +136,8 @@ class WorkflowAccessResource() {
def grantAccess(
@PathParam("wid") wid: UInteger,
@PathParam("email") email: String,
@PathParam("privilege") privilege: String,
@Auth user: SessionUser
@PathParam("privilege") privilege: String
): Unit = {
if (!hasWriteAccess(wid, user.getUid)) {
throw new ForbiddenException("No sufficient access privilege.")
}
workflowUserAccessDao.merge(
new WorkflowUserAccess(
userDao.fetchOneByEmail(email).getUid,
Expand All @@ -170,12 +158,8 @@ class WorkflowAccessResource() {
@Path("/revoke/{wid}/{email}")
def revokeAccess(
@PathParam("wid") wid: UInteger,
@PathParam("email") email: String,
@Auth user: SessionUser
@PathParam("email") email: String
): Unit = {
if (!hasWriteAccess(wid, user.getUid)) {
throw new ForbiddenException("No sufficient access privilege.")
}
context
.delete(WORKFLOW_USER_ACCESS)
.where(
Expand Down
Loading