Changeset 22


Ignore:
Timestamp:
Mar 22, 2011, 3:49:47 PM (8 years ago)
Author:
robert@…
Message:

Implemented authorization checks on file downloads

Location:
trunk/grails-app
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/conf/BootStrap.groovy

    r7 r22  
     1import nl.tno.metagenomics.auth.*;
     2
    13class BootStrap {       
    24        def trashService
     
    68                if( !trashService.giveTrashcan() )
    79                        trashService.createTrashcan();
     10               
     11                // Create authorization for the trashcan, if needed
     12                def admin = User.findByUsername( "admin" );
     13                if( admin ) {
     14                        def trash = trashService.giveTrashcan();
     15                        if( !trash.canRead( admin ) ) {
     16                                trashService.setupAuthorization( trash, admin );
     17                        }
     18                }
    819    }
    920    def destroy = {
  • trunk/grails-app/controllers/nl/tno/metagenomics/files/FileController.groovy

    r2 r22  
    1515package nl.tno.metagenomics.files
    1616
     17import nl.tno.metagenomics.*;
     18
    1719import org.codehaus.groovy.grails.commons.ConfigurationHolder
    1820import grails.converters.*
     
    2830         */
    2931        def get = {
     32                // Remove all old files from the upload directory, so the user
     33                // can't retrieve any old file that were left behind
     34                fileService.cleanDirectory();
     35               
    3036                retrieveFile( params, fileService.getUploadDir() );
    3137        }
     
    3844                File directory = fileService.getUploadDir()
    3945                String filename = checkFile( params, directory );
     46               
     47                response.contentType = "text/plain"
    4048               
    4149                try {
     
    5361         */
    5462        def getPermanent  = {
    55                 retrieveFile( params, fileService.absolutePath( ConfigurationHolder.config.metagenomics.fileDir ) );
     63                if( checkPermissions( params, fileService.absolutePath( ConfigurationHolder.config.metagenomics.fileDir ) ) ) {
     64                        retrieveFile( params, fileService.absolutePath( ConfigurationHolder.config.metagenomics.fileDir ) );
     65                } else {
     66                        render 'No access';
     67                }
     68        }
     69       
     70        /**
     71         * Checks whether the user is allowed to access this file. He is only allowed to
     72         * if he has access to the study this file belongs to.
     73         *
     74         * The file could be pointed to in several locations:
     75         *   - SequenceData.sequenceFile
     76         *   - SequenceData.qualityFile
     77         *   - Run.parameterFile
     78         *   
     79         * If the file is not mentioned in any of these locations, it should not be returned by this system and
     80         * a 404 error is given. If the user doesn't have access to the file, a 403 is given.
     81         *
     82         * @param params        HTTP request parameters
     83         * @param directory     File object representing the directory to search in
     84         */
     85        private boolean checkPermissions( params, directory ) {
     86                String filename = checkFile( params, directory );
     87               
     88                if( !filename )
     89                        return;
     90               
     91                // Search for the file in the sequenceData file fields
     92                def sd = SequenceData.findBySequenceFileOrQualityFile( filename, filename );
     93                if( sd ) {
     94                        if( sd.sample?.sample?.study?.canRead( session.user ) ) {
     95                                return true;
     96                        } else {
     97                                response.setStatus( 403, "Not authorized to access this file" );
     98                                return false;
     99                        }
     100                }
     101               
     102                // Search for the file in run file fields. If the file is found in that spot
     103                // it is freely accessible by any logged in user
     104                def run = Run.findByParameterFile( filename );
     105                if( run ) {
     106                        if( session.user ) {
     107                                return true;
     108                        } else {
     109                                response.setStatus( 403, "Not authorized to access this file" );
     110                                return false;
     111                        }
     112                }
     113               
     114                // Otherwise, the file should not be accessed this way
     115                response.setStatus( 404, "File not found" );
     116                return false;
    56117        }
    57118
     
    77138
    78139                if( !filename ) {
     140                        response.contentType = "text/plain"
    79141                        response.status = 404;
    80142                        render( "File not found" );
     
    84146                // Security check to prevent accessing files in other directories
    85147                if( filename.contains( '..' ) ) {
     148                        response.contentType = "text/plain"
    86149                        response.status = 500;
    87150                        render "Invalid filename given";
     
    95158                }
    96159                if( !filename || !fileExists ) {
     160                        response.contentType = "text/plain"
    97161                        response.status = 404;
    98162                        render( "File not found" );
  • trunk/grails-app/services/nl/tno/metagenomics/integration/TrashService.groovy

    r20 r22  
    22
    33import nl.tno.metagenomics.*
     4import nl.tno.metagenomics.auth.Auth;
     5
    46
    57class TrashService {
     
    327329                def study = new Study( name: "Trashcan", studyToken: "trash", trashcan: true )
    328330                study.save();
     331        }
     332       
     333        /**
     334         * Sets up authorization for the trashcan study
     335         */
     336        def setupAuthorization = { study, admin ->
     337                if( study && admin ) {
     338                        def a = Auth.createAuth(study, admin);
     339                        a.canRead = true;
     340                        a.canWrite = true;
     341                        a.isOwner = true;
     342                        a.save();
     343                }
    329344        }
    330345
Note: See TracChangeset for help on using the changeset viewer.