Search in sources :

Example 6 with Permissions

use of nl.uva.cs.lobcder.auth.Permissions in project lobcder by skoulouzis.

the class Archive method getZip.

/**
 * Generates a zip archive of folder
 *
 * @param path the folder name
 * @return the stream of the archive
 */
@GET
@Path("/getzip/{name:.+}")
public Response getZip(@PathParam("name") String path) {
    class Folder {

        private String path;

        private LogicalData logicalData;

        private Folder(String path, LogicalData logicalData) {
            this.path = path;
            this.logicalData = logicalData;
        }

        /**
         * @return the path
         */
        public String getPath() {
            return path;
        }

        /**
         * @param path the path to set
         */
        public void setPath(String path) {
            this.path = path;
        }

        /**
         * @return the logicalData
         */
        public LogicalData getLogicalData() {
            return logicalData;
        }

        /**
         * @param logicalData the logicalData to set
         */
        public void setLogicalData(LogicalData logicalData) {
            this.logicalData = logicalData;
        }
    }
    final String rootPath;
    if (path.endsWith("/")) {
        rootPath = path.substring(0, path.length() - 1);
    } else {
        rootPath = path;
    }
    int index = rootPath.lastIndexOf('/');
    final String rootName;
    if (index != -1) {
        rootName = rootPath.substring(index + 1);
    } else {
        rootName = rootPath;
    }
    if (rootName.isEmpty()) {
        throw new WebApplicationException(Response.Status.NOT_ACCEPTABLE);
    }
    final MyPrincipal principal = (MyPrincipal) request.getAttribute("myprincipal");
    final JDBCatalogue catalogue = getCatalogue();
    StreamingOutput result = new StreamingOutput() {

        @Override
        public void write(OutputStream out) throws IOException, WebApplicationException {
            Stack<Folder> folders;
            try (Connection connection = catalogue.getConnection()) {
                LogicalData rootElement = catalogue.getLogicalDataByPath(io.milton.common.Path.path(rootPath), connection);
                if (rootElement == null) {
                    throw new WebApplicationException(Response.Status.NOT_FOUND);
                }
                try (ZipOutputStream zip = new ZipOutputStream(out)) {
                    ZipEntry ze;
                    folders = new Stack<>();
                    Permissions p = catalogue.getPermissions(rootElement.getUid(), rootElement.getOwner(), connection);
                    if (principal.canRead(p)) {
                        if (rootElement.isFolder()) {
                            folders.add(new Folder(rootName, rootElement));
                        } else {
                            ze = new ZipEntry(rootName);
                            zip.putNextEntry(ze);
                            List<PDRIDescr> pdris = catalogue.getPdriDescrByGroupId(rootElement.getPdriGroupId());
                            copyStream(pdris, zip);
                            zip.closeEntry();
                            getCatalogue().addViewForRes(rootElement.getUid());
                        }
                    }
                    while (!folders.isEmpty()) {
                        Folder folder = folders.pop();
                        ze = new ZipEntry(folder.getPath() + "/");
                        ze.setTime(folder.getLogicalData().getModifiedDate());
                        zip.putNextEntry(ze);
                        getCatalogue().addViewForRes(folder.getLogicalData().getUid());
                        for (LogicalData ld : catalogue.getChildrenByParentRef(folder.getLogicalData().getUid(), connection)) {
                            Permissions entry_p = catalogue.getPermissions(ld.getUid(), ld.getOwner(), connection);
                            if (principal.canRead(entry_p)) {
                                if (ld.isFolder()) {
                                    folders.push(new Folder(folder.getPath() + "/" + ld.getName(), ld));
                                } else {
                                    ze = new ZipEntry(folder.getPath() + "/" + ld.getName());
                                    ze.setTime(ld.getModifiedDate());
                                    zip.putNextEntry(ze);
                                    copyStream(catalogue.getPdriDescrByGroupId(ld.getPdriGroupId()), zip);
                                    zip.closeEntry();
                                    getCatalogue().addViewForRes(ld.getUid());
                                }
                            }
                        }
                    }
                }
            } catch (Exception e) {
                if (e instanceof WebApplicationException) {
                    throw (WebApplicationException) e;
                } else {
                    throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
                }
            }
        }
    };
    Response.ResponseBuilder response = Response.ok(result, "application/zip");
    return response.header("Content-Disposition", "attachment; filename=" + rootName + ".zip").build();
}
Also used : JDBCatalogue(nl.uva.cs.lobcder.catalogue.JDBCatalogue) WebApplicationException(javax.ws.rs.WebApplicationException) ZipOutputStream(java.util.zip.ZipOutputStream) OutputStream(java.io.OutputStream) ZipEntry(java.util.zip.ZipEntry) PDRIDescr(nl.uva.cs.lobcder.resources.PDRIDescr) Connection(java.sql.Connection) StreamingOutput(javax.ws.rs.core.StreamingOutput) SQLException(java.sql.SQLException) IOException(java.io.IOException) WebApplicationException(javax.ws.rs.WebApplicationException) Response(javax.ws.rs.core.Response) LogicalData(nl.uva.cs.lobcder.resources.LogicalData) MyPrincipal(nl.uva.cs.lobcder.auth.MyPrincipal) ZipOutputStream(java.util.zip.ZipOutputStream) Permissions(nl.uva.cs.lobcder.auth.Permissions) Path(javax.ws.rs.Path) GET(javax.ws.rs.GET)

Example 7 with Permissions

use of nl.uva.cs.lobcder.auth.Permissions in project lobcder by skoulouzis.

the class DRIDataResource method getLastValidationDateDate.

/**
 * Gets lastvalidationdate property for a resource in text format
 *
 * @param uid the resource's id
 * @return the date last validated in text format
 */
@Path("{uid}/lastValidationDate/")
@GET
@Produces({ MediaType.TEXT_PLAIN, MediaType.TEXT_HTML })
public String getLastValidationDateDate(@PathParam("uid") Long uid) {
    try (Connection cn = catalogue.getConnection()) {
        LogicalData res = catalogue.getLogicalDataByUid(uid, cn);
        if (res == null) {
            throw new WebApplicationException(Response.Status.NOT_FOUND);
        }
        MyPrincipal mp = (MyPrincipal) request.getAttribute("myprincipal");
        Permissions p = catalogue.getPermissions(uid, res.getOwner(), cn);
        if (!mp.canRead(p)) {
            throw new WebApplicationException(Response.Status.UNAUTHORIZED);
        }
        return new Date(res.getLastValidationDate() * 1000).toString();
    } catch (SQLException ex) {
        Logger.getLogger(DRIDataResource.class.getName()).log(Level.SEVERE, null, ex);
        throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
    }
}
Also used : LogicalData(nl.uva.cs.lobcder.resources.LogicalData) MyPrincipal(nl.uva.cs.lobcder.auth.MyPrincipal) SQLException(java.sql.SQLException) Connection(java.sql.Connection) Permissions(nl.uva.cs.lobcder.auth.Permissions) Date(java.util.Date)

Example 8 with Permissions

use of nl.uva.cs.lobcder.auth.Permissions in project lobcder by skoulouzis.

the class DRIDataResource method setLastValidationDate.

/**
 * Sets lastvalidationdate property for a resource
 *
 * @param uid the resource's id
 * @param lastValidationDate the date last validated
 */
@Path("{uid}/lastValidationDate/{lastValidationDate}/")
@PUT
public void setLastValidationDate(@PathParam("uid") Long uid, @PathParam("lastValidationDate") Long lastValidationDate) {
    try (Connection cn = catalogue.getConnection()) {
        try {
            LogicalData res = catalogue.getLogicalDataByUid(uid, cn);
            if (res == null) {
                throw new WebApplicationException(Response.Status.NOT_FOUND);
            }
            MyPrincipal mp = (MyPrincipal) request.getAttribute("myprincipal");
            Permissions p = catalogue.getPermissions(uid, res.getOwner(), cn);
            if (!mp.canWrite(p)) {
                throw new WebApplicationException(Response.Status.UNAUTHORIZED);
            }
            catalogue.setLastValidationDate(uid, lastValidationDate, cn);
            cn.commit();
        } catch (SQLException ex) {
            Logger.getLogger(DRIDataResource.class.getName()).log(Level.SEVERE, null, ex);
            cn.rollback();
            throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
        }
    } catch (SQLException ex) {
        Logger.getLogger(DRIDataResource.class.getName()).log(Level.SEVERE, null, ex);
        throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
    }
}
Also used : LogicalData(nl.uva.cs.lobcder.resources.LogicalData) MyPrincipal(nl.uva.cs.lobcder.auth.MyPrincipal) SQLException(java.sql.SQLException) Connection(java.sql.Connection) Permissions(nl.uva.cs.lobcder.auth.Permissions)

Example 9 with Permissions

use of nl.uva.cs.lobcder.auth.Permissions in project lobcder by skoulouzis.

the class DRIDataResource method getLastValidationDate.

/**
 * Gets lastvalidationdate property for a resource
 *
 * @param uid the resource's id
 * @return the date last validated
 */
@Path("{uid}/lastValidationDate/")
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public JAXBElement<Long> getLastValidationDate(@PathParam("uid") Long uid) {
    try (Connection cn = catalogue.getConnection()) {
        LogicalData res = catalogue.getLogicalDataByUid(uid, cn);
        if (res == null) {
            throw new WebApplicationException(Response.Status.NOT_FOUND);
        }
        MyPrincipal mp = (MyPrincipal) request.getAttribute("myprincipal");
        Permissions p = catalogue.getPermissions(uid, res.getOwner(), cn);
        if (!mp.canRead(p)) {
            throw new WebApplicationException(Response.Status.UNAUTHORIZED);
        }
        return new JAXBElement<Long>(new QName("lastValidationDate"), Long.class, res.getLastValidationDate());
    } catch (SQLException ex) {
        Logger.getLogger(DRIDataResource.class.getName()).log(Level.SEVERE, null, ex);
        throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
    }
}
Also used : LogicalData(nl.uva.cs.lobcder.resources.LogicalData) MyPrincipal(nl.uva.cs.lobcder.auth.MyPrincipal) SQLException(java.sql.SQLException) QName(javax.xml.namespace.QName) Connection(java.sql.Connection) Permissions(nl.uva.cs.lobcder.auth.Permissions) JAXBElement(javax.xml.bind.JAXBElement)

Example 10 with Permissions

use of nl.uva.cs.lobcder.auth.Permissions in project lobcder by skoulouzis.

the class DRIDataResource method getChecksum.

/**
 * Gets checksum property for an item.
 *
 * @param uid the resource's id
 * @return the checksum. This value is not check if it's correct by lobcder
 */
@Path("{uid}/checksum/")
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public JAXBElement<String> getChecksum(@PathParam("uid") Long uid) {
    try (Connection cn = catalogue.getConnection()) {
        LogicalData res = catalogue.getLogicalDataByUid(uid, cn);
        if (res == null) {
            throw new WebApplicationException(Response.Status.NOT_FOUND);
        }
        MyPrincipal mp = (MyPrincipal) request.getAttribute("myprincipal");
        Permissions p = catalogue.getPermissions(uid, res.getOwner(), cn);
        if (!mp.canRead(p)) {
            throw new WebApplicationException(Response.Status.UNAUTHORIZED);
        }
        return new JAXBElement<String>(new QName("checksum"), String.class, res.getChecksum());
    } catch (SQLException ex) {
        Logger.getLogger(DRIDataResource.class.getName()).log(Level.SEVERE, null, ex);
        throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
    }
}
Also used : LogicalData(nl.uva.cs.lobcder.resources.LogicalData) MyPrincipal(nl.uva.cs.lobcder.auth.MyPrincipal) SQLException(java.sql.SQLException) QName(javax.xml.namespace.QName) Connection(java.sql.Connection) Permissions(nl.uva.cs.lobcder.auth.Permissions) JAXBElement(javax.xml.bind.JAXBElement)

Aggregations

Permissions (nl.uva.cs.lobcder.auth.Permissions)40 LogicalData (nl.uva.cs.lobcder.resources.LogicalData)29 SQLException (java.sql.SQLException)23 Connection (java.sql.Connection)22 MyPrincipal (nl.uva.cs.lobcder.auth.MyPrincipal)21 ArrayList (java.util.ArrayList)7 BadRequestException (io.milton.http.exceptions.BadRequestException)6 NotAuthorizedException (io.milton.http.exceptions.NotAuthorizedException)6 PDRIDescr (nl.uva.cs.lobcder.resources.PDRIDescr)5 PreparedStatement (java.sql.PreparedStatement)4 ResultSet (java.sql.ResultSet)4 Stack (java.util.Stack)4 Path (io.milton.common.Path)3 Path (javax.ws.rs.Path)3 JAXBElement (javax.xml.bind.JAXBElement)3 QName (javax.xml.namespace.QName)3 LogicalDataWrapped (nl.uva.cs.lobcder.rest.wrappers.LogicalDataWrapped)3 ConflictException (io.milton.http.exceptions.ConflictException)2 IOException (java.io.IOException)2 URISyntaxException (java.net.URISyntaxException)2