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

Implemented authorization checks on file downloads

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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" );
Note: See TracChangeset for help on using the changeset viewer.