Commit ba7e73cc authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Added endpoint and service for generating tar/zip archives. Moved...

Added endpoint and service for generating tar/zip archives. Moved authorization logic in dedicated service and other minor refactoring
parent 51f5c82b
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -72,6 +72,12 @@
            <artifactId>vospace-datamodel</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        
        <dependency>
            <groupId>org.kamranzafar</groupId>
            <artifactId>jtar</artifactId>
            <version>2.3</version>
        </dependency>
    </dependencies>

    <profiles>
+47 −0
Original line number Diff line number Diff line
/*
 * This file is part of vospace-file-service
 * Copyright (C) 2021 Istituto Nazionale di Astrofisica
 * SPDX-License-Identifier: GPL-3.0-or-later
 */
package it.inaf.ia2.transfer.controller;

import it.inaf.ia2.transfer.auth.TokenPrincipal;
import it.inaf.ia2.transfer.service.ArchiveJob;
import it.inaf.ia2.transfer.service.ArchiveService;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ArchiveFileController {

    @Autowired
    private ArchiveService archiveService;

    @Autowired
    private HttpServletRequest request;

    @PostMapping(value = "/tar", consumes = MediaType.APPLICATION_JSON_VALUE)
    public void createTarArchive(@RequestParam(value = "jobId", required = true) String jobId, @RequestBody List<String> vosPaths) {

        ArchiveJob job = new ArchiveJob();
        job.setPrincipal((TokenPrincipal) request.getUserPrincipal());
        job.setJobId(jobId);
        job.setType(ArchiveJob.Type.TAR);
        job.setVosPaths(vosPaths);

        startArchiveJob(job);
    }

    private void startArchiveJob(ArchiveJob job) {
        CompletableFuture.runAsync(() -> {
            archiveService.createArchive(job);
        });
    }
}
+16 −0
Original line number Diff line number Diff line
/*
 * This file is part of vospace-file-service
 * Copyright (C) 2021 Istituto Nazionale di Astrofisica
 * SPDX-License-Identifier: GPL-3.0-or-later
 */

package it.inaf.ia2.transfer.controller;

import java.util.List;

public class ArchiveRequest {

    private List<String> vosPaths;
    String jobId;
    String type;
}
+7 −31
Original line number Diff line number Diff line
@@ -5,9 +5,10 @@
 */
package it.inaf.ia2.transfer.controller;

import it.inaf.ia2.transfer.auth.GmsClient;
import it.inaf.ia2.transfer.persistence.model.FileInfo;
import it.inaf.ia2.transfer.auth.TokenPrincipal;
import it.inaf.ia2.transfer.persistence.FileDAO;
import it.inaf.ia2.transfer.service.AuthorizationService;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -37,7 +38,7 @@ public class GetFileController extends FileController {
    private FileDAO fileDAO;

    @Autowired
    private GmsClient gmsClient;
    private AuthorizationService authorizationService;

    @Autowired
    private HttpServletResponse response;
@@ -55,7 +56,7 @@ public class GetFileController extends FileController {

            FileInfo fileInfo = optFileInfo.get();

            if (!fileInfo.isIsPublic() && !privateButDownloadable(fileInfo)) {
            if (!authorizationService.isDownloadable(fileInfo, (TokenPrincipal) request.getUserPrincipal())) {
                return new ResponseEntity<>("Unauthorized", UNAUTHORIZED);
            }

@@ -65,31 +66,6 @@ public class GetFileController extends FileController {
        }
    }

    private boolean privateButDownloadable(FileInfo fileInfo) {

        TokenPrincipal principal = (TokenPrincipal) request.getUserPrincipal();

        String token = principal.getToken();
        if (token == null) {
            return false;
        }

        if (principal.getName().equals(fileInfo.getOwnerId())) {
            return true;
        }

        // TODO: configure cache
        if (fileInfo.getGroupRead() == null) {
            return false;
        }
        for (String group : fileInfo.getGroupRead()) {
            if (gmsClient.isMemberOf(token, group)) {
                return true;
            }
        }
        return false;
    }

    private ResponseEntity<?> getFileResponse(FileInfo fileInfo) {

        File file = new File(fileInfo.getOsPath());
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
 */
package it.inaf.ia2.transfer.controller;

import it.inaf.ia2.transfer.persistence.model.FileInfo;
import it.inaf.ia2.transfer.persistence.FileDAO;
import it.inaf.ia2.transfer.persistence.JobDAO;
import java.io.File;
Loading