Esempio n. 1
0
    def test_execute(self):
        """
        Test the execute method.
        """

        #test invalid configuration
        connector = ElfinderConnector({})
        self.assertEqual(
            ElfinderErrorMessages.ERROR_CONF
            in connector.execute('open')['error'], True)

        connector = ElfinderConnector(
            ls.ELFINDER_CONNECTOR_OPTION_SETS['default'])
        #test invalid command
        self.assertEqual(
            ElfinderErrorMessages.ERROR_UNKNOWN_CMD
            in connector.execute('dummy')['error'], True)
        #test missing arguments
        self.assertEqual(
            ElfinderErrorMessages.ERROR_INV_PARAMS
            in connector.execute('ls')['error'], True)
        #test it is actually doing something
        self.assertEqual(
            'error' in connector.execute('open', mimes=['image'], init=True),
            False)
        #test debug keyword
        self.assertEqual('debug' in connector.execute('open', init=True),
                         False)
        self.assertEqual(
            'debug' in connector.execute('open', init=True, debug=True), True)
Esempio n. 2
0
File: views.py Progetto: atompi/OMBA
 def post(self, request, *args, **kwargs):
     """
     called in post method calls.
     It only allows for the 'upload' command
     """
     if kwargs['optionset'] == 'sftp':
         optinon_sets = self.get_optionset(**kwargs)
         optinon_sets['roots'][0]['storageKwArgs'] = {
             'host': '127.0.0.1',
             'params': settings.SFTP_CONF,
             'root_path': settings.MEDIA_ROOT+'/playbook',
             'interactive': False
         }
         self.elfinder = ElfinderConnector(optinon_sets, request.session)
     else:
         self.elfinder = ElfinderConnector(self.get_optionset(**kwargs), request.session)        
     cmd = self.get_command(request.POST)
     
     if cmd not in ['upload']:
         self.render_to_response(
             {
                 'error': self.elfinder.error(
                     ElfinderErrorMessages.ERROR_UPLOAD,
                     ElfinderErrorMessages.ERROR_UPLOAD_TOTAL_SIZE
                 )
             }
         )
     return self.output(cmd, request.POST)
Esempio n. 3
0
    def post(self, request, *args, **kwargs):
        """
        called in post method calls.
        It only allows for the 'upload' command
        """
        if kwargs['optionset'] == 'sftp':
            optinon_sets = self.get_optionset(**kwargs)
            optinon_sets['roots'][0]['storageKwArgs'] = {
                'host': '127.0.0.1',
                'params': {
                    'port': 22,
                    'username': '******',
                    'password': '******',
                    'timeout': 30
                },
                'root_path': '/',
                'interactive': False
            }
            self.elfinder = ElfinderConnector(optinon_sets, request.session)
        else:
            self.elfinder = ElfinderConnector(self.get_optionset(**kwargs),
                                              request.session)
        cmd = self.get_command(request.POST)

        if not cmd in ['upload']:
            self.render_to_response({
                'error':
                self.elfinder.error(
                    ElfinderErrorMessages.ERROR_UPLOAD,
                    ElfinderErrorMessages.ERROR_UPLOAD_TOTAL_SIZE)
            })
        return self.output(cmd, request.POST)
Esempio n. 4
0
 def get(self, request, *args, **kwargs):
     """
     used in get method calls
     """
     u_id = str(uuid.uuid4())
     if kwargs['optionset'] == 'sftp':
         kwargs['u_id'] = u_id
         server_object = get_object_or_404(ServerInfor,hostname=kwargs['start_path'])
         optinon_sets = self.get_optionset(**kwargs)
         optinon_sets['roots'][u_id][0]['alias'] = '{0}-{1}'.format(server_object.name,server_object.ip)
         key_label = "%s::%s" % (server_object.ip, server_object.credential.username)
         if server_object.credential.method == 'password':
             optinon_sets['roots'][u_id][0]['storageKwArgs'] = {'host':server_object.ip,
                                                          'params':{'port':server_object.credential.port,
                                                         'username':server_object.credential.username,
                                                         'password':server_object.credential.password,
                                                         'timeout':30},
                                                          'root_path':'/','interactive':False,
                                                                'key_label': key_label}
         else:
             optinon_sets['roots'][u_id][0]['storageKwArgs'] = {'host':server_object.ip,
                                                                      'params':{'port':server_object.credential.port,
                                                                                'username':server_object.credential.username,
                                                                     'key_filename':server_object.credential.key,
                                                                     'timeout':30},
                                                                      'root_path':'/','interactive':False,
                                                                'key_label': key_label}
         self.elfinder = ElfinderConnector(optinon_sets, u_id, request.session)
     else:
         self.elfinder = ElfinderConnector(self.get_optionset(**kwargs), u_id, request.session)
     return self.output(self.get_command(request.GET), request.GET)
Esempio n. 5
0
 def get(self, request, *args, **kwargs):
     """
     used in get method calls
     """
     self.elfinder = ElfinderConnector(self.get_optionset(**kwargs),
                                       request.session)
     return self.output(self.get_command(request.GET), request.GET)
Esempio n. 6
0
    def post(self, request, *args, **kwargs):
        """
        called in post method calls.
        It only allows for the 'upload' command
        """
        u_id = str(uuid.uuid4())
        if kwargs['optionset'] == 'sftp':
            kwargs['u_id'] = u_id
            server_object = get_object_or_404(ServerInfor,
                                              hostname=kwargs['start_path'])
            optinon_sets = self.get_optionset(**kwargs)
            optinon_sets['roots'][u_id][0]['alias'] = '{0}-{1}'.format(
                server_object.name, server_object.ip)
            key_label = "%s::%s" % (server_object.ip,
                                    server_object.credential.username)
            if server_object.credential.method == 'password':
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {
                    'host': server_object.ip,
                    'params': {
                        'port': server_object.credential.port,
                        'username': server_object.credential.username,
                        'password': server_object.credential.password,
                        'timeout': 30
                    },
                    'root_path': '/',
                    'interactive': False,
                    'key_label': key_label
                }
            else:
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {
                    'host': server_object.ip,
                    'params': {
                        'port': server_object.credential.port,
                        'username': server_object.credential.username,
                        'key_filename': server_object.credential.key,
                        'timeout': 30
                    },
                    'root_path': '/',
                    'interactive': False,
                    'key_label': key_label
                }
            self.elfinder = ElfinderConnector(optinon_sets, u_id,
                                              request.session)
        else:
            self.elfinder = ElfinderConnector(self.get_optionset(**kwargs),
                                              u_id, request.session)
        cmd = self.get_command(request.POST)

        if not cmd in ['upload']:
            self.render_to_response({
                'error':
                self.elfinder.error(
                    ElfinderErrorMessages.ERROR_UPLOAD,
                    ElfinderErrorMessages.ERROR_UPLOAD_TOTAL_SIZE)
            })
        return self.output(cmd, request.POST)
Esempio n. 7
0
    def test_open_startpath(self):
        """
        Test startpath option
        """

        self.opts['roots'][0]['startPath'] = 'files'
        connector = ElfinderConnector(self.opts)

        #************ init without tree ***********
        ret = connector.execute('open', target='dummy', init='1')

        #check files and cwd
        self.assertEqual(len(ret['files']), 2)
        self.assertNotEqual(ret['files'][0]['hash'], ret['files'][1]['hash'])
        self.assertEqual(ret['files'][0]['name'], '2bytes.txt')
        self.assertEqual(ret['files'][1]['name'], 'directory')
        self.assertEqual(ret['cwd']['dirs'], 1)
        self.assertEqual(ret['cwd']['name'], 'files')
        self.assertEqual(ret['cwd']['read'], 1)
        self.assertEqual(ret['cwd']['write'], 1)
        self.assertEqual(ret['cwd']['locked'], 0)
        self.assertEqual(ret['cwd']['hidden'], 0)
        self.assertEqual(ret['cwd']['size'], 'unknown')
        self.assertEqual(ret['cwd']['mime'], 'directory')
        self.assertNotIn('volumeid', ret['cwd'])
        self.assertIsInstance(ret['cwd']['ts'], float)
        self.assertGreater(len(ret['cwd']['phash']), 0)
        self.assertGreater(len(ret['cwd']['hash']), 0)

        #other response attributes
        self.assertNotIn('error', ret)
        self.assertIn('netDrivers', ret)
        self.assertEqual(ret['uplMaxSize'], 128 * 1048576)
        self.assertEqual(ret['api'], '2.1')
        self.assertEqual(ret['options']['pathUrl'],
                         '%sfiles' % settings.MEDIA_URL)
        self.assertEqual(ret['options']['tmbUrl'],
                         '%s.tmb/' % settings.MEDIA_URL)
        self.assertIn('create', ret['options']['archivers'])
        self.assertIn('extract', ret['options']['archivers'])
        self.assertEqual(ret['options']['disabled'], [])
        self.assertEqual(ret['options']['copyOverwrite'], 1)
        self.assertEqual(ret['options']['separator'], os.sep)
        self.assertEqual(ret['options']['path'],
                         '%s%sfiles' % (connector._default._root_name, os.sep))

        #********* init with tree ***********
        ret_tree = connector.execute('open',
                                     target='dummy',
                                     init='1',
                                     tree='1')
        self.check_root_tree(ret_tree, 5, connector._default._root_name)

        #cleanup startpath
        self.opts['startpath'] = ''
Esempio n. 8
0
 def get(self, request, *args, **kwargs):
     """
     used in get method calls
     """
     if kwargs['optionset'] == 'sftp':
         optinon_sets = self.get_optionset(**kwargs)
         optinon_sets['roots'][0]['storageKwArgs'] = {'host':'127.0.0.1','params':settings.SFTP_CONF,'root_path':settings.MEDIA_ROOT+'/playbook','interactive':False}
         self.elfinder = ElfinderConnector(optinon_sets, request.session)
     else:
         self.elfinder = ElfinderConnector(self.get_optionset(**kwargs), request.session)
     return self.output(self.get_command(request.GET), request.GET)
Esempio n. 9
0
    def test_open_startpath(self):
        """
        Test startpath option
        """
        
        self.opts['roots'][0]['startPath'] = 'files'
        connector = ElfinderConnector(self.opts)
        
        #************ init without tree ***********
        ret = connector.execute('open', target='dummy', init='1')

        #check files and cwd
        self.assertEqual(len(ret['files']), 2)
        self.assertNotEqual(ret['files'][0]['hash'], ret['files'][1]['hash'])
        self.assertEqual(ret['files'][0]['name'], '2bytes.txt')
        self.assertEqual(ret['files'][1]['name'], 'directory')
        self.assertEqual(ret['cwd']['dirs'], 1)
        self.assertEqual(ret['cwd']['name'], 'files')
        self.assertEqual(ret['cwd']['read'], 1)
        self.assertEqual(ret['cwd']['write'], 1)
        self.assertEqual(ret['cwd']['locked'], 0)
        self.assertEqual(ret['cwd']['hidden'], 0)
        self.assertEqual(ret['cwd']['size'], 'unknown')
        self.assertEqual(ret['cwd']['mime'], 'directory')
        self.assertNotIn('volumeid', ret['cwd'])
        self.assertIsInstance(ret['cwd']['ts'], float)
        self.assertGreater(len(ret['cwd']['phash']), 0)
        self.assertGreater(len(ret['cwd']['hash']), 0)
        
        #other response attributes
        self.assertNotIn('error', ret)
        self.assertIn('netDrivers', ret)
        self.assertEqual(ret['uplMaxSize'], 128 * 1048576)
        self.assertEqual(ret['api'], '2.0')
        self.assertEqual(ret['options']['pathUrl'], '%sfiles' % settings.MEDIA_URL)
        self.assertEqual(ret['options']['tmbUrl'], '%s.tmb/' % settings.MEDIA_URL)
        self.assertIn('create', ret['options']['archivers'])
        self.assertIn('extract', ret['options']['archivers'])
        self.assertEqual(ret['options']['disabled'], [])
        self.assertEqual(ret['options']['copyOverwrite'], 1)
        self.assertEqual(ret['options']['separator'], os.sep)
        self.assertEqual(ret['options']['path'], '%s%sfiles' % (connector._default._root_name, os.sep))
        
        #********* init with tree ***********
        ret_tree = connector.execute('open', target='dummy', init='1', tree='1')
        self.check_root_tree(ret_tree, 5, connector._default._root_name)

        #cleanup startpath
        self.opts['startpath'] = ''
Esempio n. 10
0
 def post(self, request, *args, **kwargs):
     """
     called in post method calls.
     It only allows for the 'upload' command
     """
     if kwargs['optionset'] == 'sftp':
         optinon_sets = self.get_optionset(**kwargs)
         optinon_sets['roots'][0]['storageKwArgs'] = {'host':'127.0.0.1','params':settings.SFTP_CONF,'root_path':settings.MEDIA_ROOT+'/playbook','interactive':False}
         self.elfinder = ElfinderConnector(optinon_sets, request.session)
     else:
         self.elfinder = ElfinderConnector(self.get_optionset(**kwargs), request.session)        
     cmd = self.get_command(request.POST)
     
     if not cmd in ['upload']:
         self.render_to_response({'error' : self.elfinder.error(ElfinderErrorMessages.ERROR_UPLOAD, ElfinderErrorMessages.ERROR_UPLOAD_TOTAL_SIZE)})
     return self.output(cmd, request.POST)
Esempio n. 11
0
File: views.py Progetto: atompi/OMBA
 def get(self, request, *args, **kwargs):
     """
     used in get method calls
     """
     if kwargs['optionset'] == 'sftp':
         optinon_sets = self.get_optionset(**kwargs)
         optinon_sets['roots'][0]['storageKwArgs'] = {
             'host': '127.0.0.1',
             'params': settings.SFTP_CONF,
             'root_path': settings.MEDIA_ROOT+'/playbook',
             'interactive': False
         }
         self.elfinder = ElfinderConnector(optinon_sets, request.session)
     else:
         self.elfinder = ElfinderConnector(self.get_optionset(**kwargs), request.session)
     return self.output(self.get_command(request.GET), request.GET)
Esempio n. 12
0
    def test_open_path(self):

        connector = ElfinderConnector(self.opts)

        #************ init without tree ***********
        ret = connector.execute('open',
                                target=connector._default.encode(
                                    connector._default._join_path(
                                        settings.MEDIA_ROOT,
                                        connector._default._join_path(
                                            'files', 'directory'))),
                                init='1')

        #check files and cwd
        self.assertEqual(len(ret['files']), 1)
        self.assertEqual(ret['files'][0]['name'], 'yawd-logo.png')
        self.assertNotIn('dirs', ret['cwd'])
        self.assertEqual(ret['cwd']['name'], 'directory')
        self.assertEqual(ret['cwd']['read'], 1)
        self.assertEqual(ret['cwd']['write'], 1)
        self.assertEqual(ret['cwd']['locked'], 0)
        self.assertEqual(ret['cwd']['hidden'], 0)
        self.assertEqual(ret['cwd']['size'], 'unknown')
        self.assertEqual(ret['cwd']['mime'], 'directory')
        self.assertNotIn('volumeid', ret['cwd'])
        self.assertIsInstance(ret['cwd']['ts'], float)
        self.assertGreater(len(ret['cwd']['phash']), 0)
        self.assertGreater(len(ret['cwd']['hash']), 0)

        #other response attributes
        self.assertNotIn('error', ret)
        self.assertIn('netDrivers', ret)
        self.assertEqual(ret['uplMaxSize'], 128 * 1048576)
        self.assertEqual(ret['api'], '2.1')
        self.assertEqual(ret['options']['pathUrl'],
                         '%sfiles/directory' % settings.MEDIA_URL)
        self.assertEqual(ret['options']['tmbUrl'],
                         '%s.tmb/' % settings.MEDIA_URL)
        self.assertIn('create', ret['options']['archivers'])
        self.assertIn('extract', ret['options']['archivers'])
        self.assertEqual(ret['options']['disabled'], [])
        self.assertEqual(ret['options']['copyOverwrite'], 1)
        self.assertEqual(ret['options']['separator'], os.sep)
        self.assertEqual(
            ret['options']['path'], '%s%sfiles%sdirectory' %
            (connector._default._root_name, os.sep, os.sep))
Esempio n. 13
0
    def post(self, request, *args, **kwargs):
        """
        called in post method calls.
        It only allows for the 'upload' command
        """
        self.elfinder = ElfinderConnector(self.get_optionset(**kwargs),
                                          request.session)
        cmd = self.get_command(request.POST)

        if not cmd in ['upload']:
            self.render_to_response({
                'error':
                self.elfinder.error(
                    ElfinderErrorMessages.ERROR_UPLOAD,
                    ElfinderErrorMessages.ERROR_UPLOAD_TOTAL_SIZE)
            })

        return self.output(cmd, request.POST)
Esempio n. 14
0
    def test_init(self):
        """
        Test the ElfinderConnector __init__ method
        """
        #fault-tolerant initialization
        connector = ElfinderConnector({})
        self.assertEqual(connector.loaded(), False)

        connector = ElfinderConnector({})
        self.assertEqual(connector.loaded(), False)

        #initialize with 'default' optionset
        connector = ElfinderConnector(
            ls.ELFINDER_CONNECTOR_OPTION_SETS['default'])
        self.assertEqual(connector.loaded(), True)
Esempio n. 15
0
    def test_open_specs(self):
        """
        Test the command compiles to the API specification
        """
        
        connector = ElfinderConnector(self.opts)

        #command accepts the specification arguments
        argslist = connector.commandArgsList('open')
        self.assertIn('target', argslist)
        self.assertIn('init', argslist)
        self.assertIn('tree', argslist)
        self.assertIn('mimes', argslist)
        
        #test invalid keyword arguments
        self.assertEqual(ElfinderErrorMessages.ERROR_INV_PARAMS in connector.execute('open')['error'], True)
        
        #test invalid target
        self.assertEqual(ElfinderErrorMessages.ERROR_OPEN in connector.execute('open', target='dummy')['error'], True)
Esempio n. 16
0
    def post(self, request, *args, **kwargs):
        """
        called in post method calls.
        It only allows for the 'upload' command
        """
        self.elfinder = ElfinderConnector(self.get_optionset(**kwargs), request.session)
        cmd = self.get_command(request.POST)
        
        if not cmd in ['upload']:
            self.render_to_response({'error' : self.elfinder.error(ElfinderErrorMessages.ERROR_UPLOAD, ElfinderErrorMessages.ERROR_UPLOAD_TOTAL_SIZE)})

        return self.output(cmd, request.POST)
Esempio n. 17
0
 def get(self, request, *args, **kwargs):
     """
     used in get method calls
     """
     if kwargs['optionset'] == 'sftp':
         optinon_sets = self.get_optionset(**kwargs)
         optinon_sets['roots'][0]['storageKwArgs'] = {
             'host': '127.0.0.1',
             'params': {
                 'port': 22,
                 'username': '******',
                 'password': '******',
                 'timeout': 30
             },
             'root_path': '/',
             'interactive': False
         }
         self.elfinder = ElfinderConnector(optinon_sets, request.session)
     else:
         self.elfinder = ElfinderConnector(self.get_optionset(**kwargs),
                                           request.session)
     return self.output(self.get_command(request.GET), request.GET)
Esempio n. 18
0
    def test_open_path(self):
        
        connector = ElfinderConnector(self.opts)
        
        #************ init without tree ***********
        ret = connector.execute('open', target=connector._default.encode(
            connector._default._join_path(settings.MEDIA_ROOT, 
                connector._default._join_path('files', 'directory'))),
            init='1')

        #check files and cwd
        self.assertEqual(len(ret['files']), 1)
        self.assertEqual(ret['files'][0]['name'], 'yawd-logo.png')
        self.assertNotIn('dirs', ret['cwd'])
        self.assertEqual(ret['cwd']['name'], 'directory')
        self.assertEqual(ret['cwd']['read'], 1)
        self.assertEqual(ret['cwd']['write'], 1)
        self.assertEqual(ret['cwd']['locked'], 0)
        self.assertEqual(ret['cwd']['hidden'], 0)
        self.assertEqual(ret['cwd']['size'], 'unknown')
        self.assertEqual(ret['cwd']['mime'], 'directory')
        self.assertNotIn('volumeid', ret['cwd'])
        self.assertIsInstance(ret['cwd']['ts'], float)
        self.assertGreater(len(ret['cwd']['phash']), 0)
        self.assertGreater(len(ret['cwd']['hash']), 0)
        
        #other response attributes
        self.assertNotIn('error', ret)
        self.assertIn('netDrivers', ret)
        self.assertEqual(ret['uplMaxSize'], 128 * 1048576)
        self.assertEqual(ret['api'], '2.0')
        self.assertEqual(ret['options']['pathUrl'], '%sfiles/directory' % settings.MEDIA_URL)
        self.assertEqual(ret['options']['tmbUrl'], '%s.tmb/' % settings.MEDIA_URL)
        self.assertIn('create', ret['options']['archivers'])
        self.assertIn('extract', ret['options']['archivers'])
        self.assertEqual(ret['options']['disabled'], [])
        self.assertEqual(ret['options']['copyOverwrite'], 1)
        self.assertEqual(ret['options']['separator'], os.sep)
        self.assertEqual(ret['options']['path'], '%s%sfiles%sdirectory' % (connector._default._root_name, os.sep, os.sep))
Esempio n. 19
0
    def test_open_specs(self):
        """
        Test the command compiles to the API specification
        """

        connector = ElfinderConnector(self.opts)

        #command accepts the specification arguments
        argslist = connector.commandArgsList('open')
        self.assertIn('target', argslist)
        self.assertIn('init', argslist)
        self.assertIn('tree', argslist)
        self.assertIn('mimes', argslist)

        #test invalid keyword arguments
        self.assertEqual(
            ElfinderErrorMessages.ERROR_INV_PARAMS
            in connector.execute('open')['error'], True)

        #test invalid target
        self.assertEqual(
            ElfinderErrorMessages.ERROR_OPEN
            in connector.execute('open', target='dummy')['error'], True)
Esempio n. 20
0
 def test_execute(self):
     """
     Test the execute method.
     """
     
     #test invalid configuration
     connector = ElfinderConnector({})
     self.assertEqual(ElfinderErrorMessages.ERROR_CONF in connector.execute('open')['error'], True)
     
     connector = ElfinderConnector(ls.ELFINDER_CONNECTOR_OPTION_SETS['default'])
     #test invalid command
     self.assertEqual(ElfinderErrorMessages.ERROR_UNKNOWN_CMD in connector.execute('dummy')['error'], True)
     #test missing arguments
     self.assertEqual(ElfinderErrorMessages.ERROR_INV_PARAMS in connector.execute('ls')['error'], True)
     #test it is actually doing something
     self.assertEqual('error' in connector.execute('open', mimes=['image'], init=True), False)
     #test debug keyword
     self.assertEqual('debug' in connector.execute('open', init=True), False)
     self.assertEqual('debug' in connector.execute('open', init=True, debug=True), True)
Esempio n. 21
0
 def test_init(self):
     """
     Test the ElfinderConnector __init__ method
     """
     #fault-tolerant initialization
     connector = ElfinderConnector({})
     self.assertEqual(connector.loaded(), False)
     
     connector = ElfinderConnector({})
     self.assertEqual(connector.loaded(), False)
     
     #initialize with 'default' optionset
     connector = ElfinderConnector(ls.ELFINDER_CONNECTOR_OPTION_SETS['default'])
     self.assertEqual(connector.loaded(), True)
Esempio n. 22
0
class ElfinderConnectorView(View):
    """
    Default elfinder backend view
    """
    
    def render_to_response(self, context, **kwargs):
        """
        It returns a json-encoded response, unless it was otherwise requested
        by the command operation
        """
        
        if not settings.DEBUG and not self.request.is_ajax():
            raise Http404

        kwargs = {}
        additional_headers = {}
        #create response headers
        if 'header' in context:
            for key in context['header']:
                if key == 'Content-Type':
                    kwargs['content_type'] = context['header'][key]
                elif key.lower() == 'status':
                    kwargs['status'] = context['header'][key]
                else:
                    additional_headers[key] = context['header'][key]
            del context['header']
        
        #return json if not header
        if not 'content_type' in kwargs:
            kwargs['content_type'] = 'application/json'
            
        if 'pointer' in context: #return file
            context['pointer'].seek(0)
            kwargs['content'] = context['pointer'].read()
            context['volume'].close(context['pointer'], context['info']['hash'])
        elif 'raw' in context and context['raw'] and 'error' in context and context['error']: #raw error, return only the error list
            kwargs['content'] = context['error']
        elif kwargs['content_type'] == 'application/json': #return json
            kwargs['content'] = json.dumps(context)
        else: #return context as is!
            kwargs['content'] = context
        
        response = HttpResponse(**kwargs)
        for key, value in additional_headers.items():
            response[key] = value

        return response
    
    def output(self, cmd, src):
        """
        Collect command arguments, operate and return self.render_to_response()
        """
        args = {}

        for name in self.elfinder.commandArgsList(cmd):
            if name == 'request':
                args['request'] = self.request
            elif name == 'FILES':
                args['FILES'] = self.request.FILES
            elif name == 'targets':
                args[name] = src.getlist('targets[]')
            else:
                arg = name
                if name.endswith('_'):
                    name = name[:-1]
                if name in src: 
                    try:
                        args[arg] = src.get(name).strip()
                    except:
                        args[arg] = src.get(name)
        args['debug'] = src['debug'] if 'debug' in src else False

        return self.render_to_response(self.elfinder.execute(cmd, **args))
    
    def get_command(self, src):
        """
        Get requested command
        """
        try:
            return src['cmd']
        except KeyError:
            return 'open'
        
    def get_optionset(self, **kwargs):
        set_ = ls.ELFINDER_CONNECTOR_OPTION_SETS[kwargs['optionset']].copy()
        if kwargs['start_path'] != 'default':
            for root in set_['roots']:
                root['startPath'] = kwargs['start_path']
        return set_
    
    @method_decorator(staff_member_required)
    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        if not kwargs['optionset'] in ls.ELFINDER_CONNECTOR_OPTION_SETS:
            raise Http404
        return super(ElfinderConnectorView, self).dispatch(*args, **kwargs)

    def get(self, request, *args, **kwargs):
        """
        used in get method calls
        """
        self.elfinder = ElfinderConnector(self.get_optionset(**kwargs), request.session)
        return self.output(self.get_command(request.GET), request.GET)

    def post(self, request, *args, **kwargs):
        """
        called in post method calls.
        It only allows for the 'upload' command
        """
        self.elfinder = ElfinderConnector(self.get_optionset(**kwargs), request.session)
        cmd = self.get_command(request.POST)
        
        if not cmd in ['upload']:
            self.render_to_response({'error' : self.elfinder.error(ElfinderErrorMessages.ERROR_UPLOAD, ElfinderErrorMessages.ERROR_UPLOAD_TOTAL_SIZE)})

        return self.output(cmd, request.POST)
Esempio n. 23
0
 def get(self, request, *args, **kwargs):
     """
     used in get method calls
     """
     self.elfinder = ElfinderConnector(self.get_optionset(**kwargs), request.session)
     return self.output(self.get_command(request.GET), request.GET)
Esempio n. 24
0
    def test_open_default(self):
        """
        Test the default optionset
        """
        
        connector = ElfinderConnector(self.opts)
        
        #************ init without tree ***********
        ret = connector.execute('open', target='dummy', init='1')

        #check files and cwd
        self.assertEqual(len(ret['files']), 2)
        self.assertNotEqual(ret['files'][0]['hash'], ret['files'][1]['hash'])
        self.assertEqual(ret['files'][0]['name'], 'files')
        self.assertEqual(ret['files'][1]['name'], 'test')
        self.assertEqual(ret['cwd']['dirs'], 1)
        self.assertEqual(ret['cwd']['name'], connector._default._root_name)
        self.assertEqual(ret['cwd']['read'], 1)
        self.assertEqual(ret['cwd']['write'], 1)
        self.assertEqual(ret['cwd']['locked'], 1)
        self.assertEqual(ret['cwd']['hidden'], 0)
        self.assertEqual(ret['cwd']['size'], 'unknown')
        self.assertEqual(ret['cwd']['mime'], 'directory')
        self.assertEqual(ret['cwd']['volumeid'], 'llff_')
        self.assertIsInstance(ret['cwd']['ts'], float)
        self.assertNotIn('phash', ret['cwd'])
        self.assertGreater(len(ret['cwd']['hash']), 0)
        
        #other response attributes
        self.assertNotIn('error', ret)
        self.assertIn('netDrivers', ret)
        self.assertEqual(ret['uplMaxSize'], 128 * 1048576)
        self.assertEqual(ret['api'], '2.0')
        self.assertEqual(ret['options']['pathUrl'], settings.MEDIA_URL)
        self.assertEqual(ret['options']['tmbUrl'], '%s.tmb/' % settings.MEDIA_URL)
        self.assertIn('create', ret['options']['archivers'])
        self.assertIn('extract', ret['options']['archivers'])
        self.assertEqual(ret['options']['disabled'], [])
        self.assertEqual(ret['options']['copyOverwrite'], 1)
        self.assertEqual(ret['options']['separator'], os.sep)
        self.assertEqual(ret['options']['path'], connector._default._root_name)
        
        
        #********* init with tree ***********
        ret_tree = connector.execute('open', target='dummy', init='1', tree='1')
        self.check_root_tree(ret_tree, 3, connector._default._root_name)
        
        ret['files'][:0] = [ret['cwd']]
        self.assertEqual(ret, ret_tree)
        
        #******** init with tree and debug *******
        ret_tree_debug = connector.execute('open', target='dummy', init='1', tree='1', debug='1')
        
        self.assertEqual(ret_tree_debug['debug']['connector'], 'yawd-elfinder')
        self.assertEqual(ret_tree_debug['debug']['mountErrors'], [])
        self.assertEqual(ret_tree_debug['debug']['upload'], '')
        self.assertEqual(ret_tree_debug['debug']['volumes'], [{'id': 'llff_', 'name': 'localfilesystem'}])
        self.assertIsInstance(ret_tree_debug['debug']['time'], float)
        
        del ret_tree_debug['debug']
        self.assertEqual(ret_tree, ret_tree_debug)
Esempio n. 25
0
    def test_open_default(self):
        """
        Test the default optionset
        """

        connector = ElfinderConnector(self.opts)

        #************ init without tree ***********
        ret = connector.execute('open', target='dummy', init='1')

        #check files and cwd
        self.assertEqual(len(ret['files']), 2)
        self.assertNotEqual(ret['files'][0]['hash'], ret['files'][1]['hash'])
        self.assertEqual(ret['files'][0]['name'], 'files')
        self.assertEqual(ret['files'][1]['name'], 'test')
        self.assertEqual(ret['cwd']['dirs'], 1)
        self.assertEqual(ret['cwd']['name'], connector._default._root_name)
        self.assertEqual(ret['cwd']['read'], 1)
        self.assertEqual(ret['cwd']['write'], 1)
        self.assertEqual(ret['cwd']['locked'], 1)
        self.assertEqual(ret['cwd']['hidden'], 0)
        self.assertEqual(ret['cwd']['size'], 'unknown')
        self.assertEqual(ret['cwd']['mime'], 'directory')
        self.assertEqual(ret['cwd']['volumeid'], 'llff_')
        self.assertIsInstance(ret['cwd']['ts'], float)
        self.assertNotIn('phash', ret['cwd'])
        self.assertGreater(len(ret['cwd']['hash']), 0)

        #other response attributes
        self.assertNotIn('error', ret)
        self.assertIn('netDrivers', ret)
        self.assertEqual(ret['uplMaxSize'], 128 * 1048576)
        self.assertEqual(ret['api'], '2.1')
        self.assertEqual(ret['options']['pathUrl'], settings.MEDIA_URL)
        self.assertEqual(ret['options']['tmbUrl'],
                         '%s.tmb/' % settings.MEDIA_URL)
        self.assertIn('create', ret['options']['archivers'])
        self.assertIn('extract', ret['options']['archivers'])
        self.assertEqual(ret['options']['disabled'], [])
        self.assertEqual(ret['options']['copyOverwrite'], 1)
        self.assertEqual(ret['options']['separator'], os.sep)
        self.assertEqual(ret['options']['path'], connector._default._root_name)

        #********* init with tree ***********
        ret_tree = connector.execute('open',
                                     target='dummy',
                                     init='1',
                                     tree='1')
        self.check_root_tree(ret_tree, 3, connector._default._root_name)

        ret['files'][:0] = [ret['cwd']]
        self.assertEqual(ret, ret_tree)

        #******** init with tree and debug *******
        ret_tree_debug = connector.execute('open',
                                           target='dummy',
                                           init='1',
                                           tree='1',
                                           debug='1')

        self.assertEqual(ret_tree_debug['debug']['connector'], 'yawd-elfinder')
        self.assertEqual(ret_tree_debug['debug']['mountErrors'], [])
        self.assertEqual(ret_tree_debug['debug']['upload'], '')
        self.assertEqual(ret_tree_debug['debug']['volumes'],
                         [{
                             'id': 'llff_',
                             'name': 'localfilesystem'
                         }])
        self.assertIsInstance(ret_tree_debug['debug']['time'], float)

        del ret_tree_debug['debug']
        self.assertEqual(ret_tree, ret_tree_debug)
Esempio n. 26
0
class ElfinderConnectorView(LoginRequiredMixin, PermissionRequiredMixin, View):
    """
    Default elfinder backend view
    """
    permission_required = 'common.can_filemanage_serverinfo'
    raise_exception = True

    def render_to_response(self, context, **kwargs):
        """
        It returns a json-encoded response, unless it was otherwise requested
        by the command operation
        """
        kwargs = {}
        additional_headers = {}
        # create response headers
        if 'header' in context:
            for key in context['header']:
                if key == 'Content-Type':
                    kwargs['content_type'] = context['header'][key]
                elif key.lower() == 'status':
                    kwargs['status'] = context['header'][key]
                else:
                    additional_headers[key] = context['header'][key]
            del context['header']

        # return json if not header
        if not 'content_type' in kwargs:
            kwargs['content_type'] = 'application/json'

        if 'pointer' in context:  # return file
            if context['volume']._options.has_key('storage') and isinstance(
                    context['volume']._options['storage'], SFTPStorage):
                # stream sftp file download
                def file_iterator(file_name, chunk_size=32768):
                    while True:
                        c = file_name.read(chunk_size)
                        if c:
                            yield c
                        else:
                            context['volume'].close(context['pointer'],
                                                    context['info']['hash'])
                            # fix sftp open transfer not close session bug
                            if context['volume']._options.has_key(
                                    'storage') and isinstance(
                                        context['volume']._options['storage'],
                                        SFTPStorage):
                                context['volume']._options[
                                    'storage'].sftp.close()
                            break

                the_file_name = additional_headers["Content-Location"]
                response = StreamingHttpResponse(
                    file_iterator(context['pointer']))
                response['Content-Type'] = 'application/octet-stream'
                response[
                    'Content-Disposition'] = 'attachment;filename="{0}"'.format(
                        the_file_name)
                return response
            else:
                context['pointer'].seek(0)
                kwargs['content'] = context['pointer'].read()
                context['volume'].close(context['pointer'],
                                        context['info']['hash'])
        # raw error, return only the error list
        elif 'raw' in context and context[
                'raw'] and 'error' in context and context['error']:
            kwargs['content'] = context['error']
        elif kwargs['content_type'] == 'application/json':  # return json
            kwargs['content'] = json.dumps(context)
        else:  # return context as is!
            kwargs['content'] = context

        response = HttpResponse(**kwargs)
        for key, value in additional_headers.items():
            response[key] = value

        return response

    @staticmethod
    def handler_chunk(src, args):
        """
        handler chunk parameter
        """
        if "chunk" in src:
            args['chunk_name'] = re.findall(r'(.*?).\d+_\d+.part$',
                                            src['chunk'])[0]
            first_chunk_flag = re.findall(r'.*?.(\d+)_\d+.part$',
                                          src['chunk'])[0]
            if int(first_chunk_flag) == 0:
                args['is_first_chunk'] = True
            else:
                args['is_first_chunk'] = False
        else:
            args['chunk_name'] = False
            args['is_first_chunk'] = False

    def output(self, cmd, src):
        """
        Collect command arguments, operate and return self.render_to_response()
        """
        args = {}
        cmd_args = self.elfinder.commandArgsList(cmd)
        for name in cmd_args:
            if name == 'request':
                args['request'] = self.request
            elif name == 'FILES':
                args['FILES'] = self.request.FILES
            elif name == 'targets':
                args[name] = src.getlist('targets[]')
            else:
                arg = name
                if name.endswith('_'):
                    name = name[:-1]
                if name in src:
                    try:
                        args[arg] = src.get(name).strip()
                    except:
                        args[arg] = src.get(name)
        if cmd == 'mkdir':
            args['name'] = src.getlist(
                'dirs[]') if 'dirs[]' in src else src.getlist('name')
        elif cmd == "upload":
            if 'upload_path[]' in src:
                dir_path = src.getlist('upload_path[]')
                if len(list(
                        set(dir_path))) == 1 and dir_path[0] == args['target']:
                    args['upload_path'] = False
                    self.handler_chunk(src, args)
                else:
                    args['upload_path'] = dir_path
                    self.handler_chunk(src, args)
            else:
                args['upload_path'] = False
                self.handler_chunk(src, args)
        elif cmd == "size":
            args['targets'] = src.getlist('targets[0]')
        args['debug'] = src['debug'] if 'debug' in src else False
        return self.render_to_response(self.elfinder.execute(cmd, **args))

    def get_command(self, src):
        """
        Get requested command
        """
        try:
            return src['cmd']
        except KeyError:
            return 'open'

    def get_optionset(self, **kwargs):
        set_ = ls.ELFINDER_CONNECTOR_OPTION_SETS[kwargs['optionset']]
        if kwargs['start_path'] != 'default':
            for root in set_['roots']:
                root['startPath'] = kwargs['start_path']
        temp_dict = copy.deepcopy(set_)
        u_id_dict = {
            'debug': temp_dict['debug'],
            'roots': {
                kwargs['u_id']: temp_dict['roots']
            }
        }
        return u_id_dict

    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        if not kwargs['optionset'] in ls.ELFINDER_CONNECTOR_OPTION_SETS:
            raise Http404
        return super(ElfinderConnectorView, self).dispatch(*args, **kwargs)

    def get(self, request, *args, **kwargs):
        """
        used in get method calls
        """
        u_id = str(uuid.uuid4())
        kwargs['u_id'] = u_id
        if kwargs['optionset'] == 'sftp':
            server_object = get_object_or_404(ServerInfor,
                                              id=kwargs['start_path'])
            optinon_sets = self.get_optionset(**kwargs)
            optinon_sets['roots'][u_id][0]['alias'] = '{0}-{1}'.format(
                server_object.name, server_object.ip)
            key_label = "%s::%s" % (server_object.ip,
                                    server_object.credential.username)
            if server_object.credential.method == 'password':
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {
                    'host': server_object.ip,
                    'params': {
                        'port': server_object.credential.port,
                        'username': server_object.credential.username,
                        'password': server_object.credential.password,
                        'timeout': 30
                    },
                    'root_path': '/',
                    'interactive': False,
                    'key_label': key_label
                }
            else:
                private_key = StringIO.StringIO(server_object.credential.key)
                key = server_object.credential.key
                if 'RSA' in key:
                    private_key = paramiko.RSAKey.from_private_key(private_key)
                elif 'DSA' in key:
                    private_key = paramiko.DSSKey.from_private_key(private_key)
                elif 'EC' in key:
                    private_key = paramiko.ECDSAKey.from_private_key(
                        private_key)
                elif 'OPENSSH' in key:
                    private_key = paramiko.Ed25519Key.from_private_key(
                        private_key)
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {
                    'host': server_object.ip,
                    'params': {
                        'port': server_object.credential.port,
                        'username': server_object.credential.username,
                        'pkey': private_key,
                        'timeout': 30
                    },
                    'root_path': '/',
                    'interactive': False,
                    'key_label': key_label
                }
            self.elfinder = ElfinderConnector(optinon_sets, u_id,
                                              request.session)
        else:
            optinon_sets = self.get_optionset(**kwargs)
            optinon_sets['roots'][u_id][0]['alias'] = '{0}_tmp_dir'.format(
                request.user.username)
            optinon_sets['roots'][u_id][0]['path'] = os.path.join(
                settings.MEDIA_ROOT, request.user.username, 'Download')
            optinon_sets['roots'][u_id][0]['URL'] = '{0}{1}/{2}/'.format(
                settings.MEDIA_URL, request.user.username, 'Download')
            mkdir_p(os.path.join(settings.MEDIA_ROOT, request.user.username))
            self.elfinder = ElfinderConnector(optinon_sets, u_id,
                                              request.session)
        return self.output(self.get_command(request.GET), request.GET)

    def post(self, request, *args, **kwargs):
        """
        called in post method calls.
        It only allows for the 'upload' command
        """
        u_id = str(uuid.uuid4())
        kwargs['u_id'] = u_id
        if kwargs['optionset'] == 'sftp':
            server_object = get_object_or_404(ServerInfor,
                                              id=kwargs['start_path'])
            optinon_sets = self.get_optionset(**kwargs)
            optinon_sets['roots'][u_id][0]['alias'] = '{0}-{1}'.format(
                server_object.name, server_object.ip)
            key_label = "%s::%s" % (server_object.ip,
                                    server_object.credential.username)
            if server_object.credential.method == 'password':
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {
                    'host': server_object.ip,
                    'params': {
                        'port': server_object.credential.port,
                        'username': server_object.credential.username,
                        'password': server_object.credential.password,
                        'timeout': 30
                    },
                    'root_path': '/',
                    'interactive': False,
                    'key_label': key_label
                }
            else:
                private_key = StringIO.StringIO(server_object.credential.key)
                key = server_object.credential.key
                if 'RSA' in key:
                    private_key = paramiko.RSAKey.from_private_key(private_key)
                elif 'DSA' in key:
                    private_key = paramiko.DSSKey.from_private_key(private_key)
                elif 'EC' in key:
                    private_key = paramiko.ECDSAKey.from_private_key(
                        private_key)
                elif 'OPENSSH' in key:
                    private_key = paramiko.Ed25519Key.from_private_key(
                        private_key)
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {
                    'host': server_object.ip,
                    'params': {
                        'port': server_object.credential.port,
                        'username': server_object.credential.username,
                        'pkey': private_key,
                        'timeout': 30
                    },
                    'root_path': '/',
                    'interactive': False,
                    'key_label': key_label
                }
            self.elfinder = ElfinderConnector(optinon_sets, u_id,
                                              request.session)
        else:
            optinon_sets = self.get_optionset(**kwargs)
            optinon_sets['roots'][u_id][0]['alias'] = '{0}_tmp_dir'.format(
                request.user.username)
            optinon_sets['roots'][u_id][0]['path'] = os.path.join(
                settings.MEDIA_ROOT, request.user.username, 'Download')
            optinon_sets['roots'][u_id][0]['URL'] = '{0}{1}/{2}/'.format(
                settings.MEDIA_URL, request.user.username, 'Download')
            self.elfinder = ElfinderConnector(optinon_sets, u_id,
                                              request.session)
        cmd = self.get_command(request.POST)

        if not cmd in ['upload']:
            self.render_to_response({
                'error':
                self.elfinder.error(
                    ElfinderErrorMessages.ERROR_UPLOAD,
                    ElfinderErrorMessages.ERROR_UPLOAD_TOTAL_SIZE)
            })
        return self.output(cmd, request.POST)
Esempio n. 27
0
 def set_elfinder(self, hostid, optinon_sets):
     if hostid not in self.elfinder_sftps:
         self.elfinder_sftps[hostid] = ElfinderConnector(optinon_sets)
         cache.set('elfinder_%s' % hostid, 1, timeout=self.sftp_timeout)
     return self.elfinder_sftps[hostid]
Esempio n. 28
0
 def get(self, request, *args, **kwargs):
     """
     used in get method calls
     """
     u_id = str(uuid.uuid4())
     kwargs['u_id'] = u_id
     if kwargs['optionset'] == 'sftp':
         server_object = get_object_or_404(ServerInfor,
                                           id=kwargs['start_path'])
         optinon_sets = self.get_optionset(**kwargs)
         optinon_sets['roots'][u_id][0]['alias'] = '{0}-{1}'.format(
             server_object.name, server_object.ip)
         key_label = "%s::%s" % (server_object.ip,
                                 server_object.credential.username)
         if server_object.credential.method == 'password':
             optinon_sets['roots'][u_id][0]['storageKwArgs'] = {
                 'host': server_object.ip,
                 'params': {
                     'port': server_object.credential.port,
                     'username': server_object.credential.username,
                     'password': server_object.credential.password,
                     'timeout': 30
                 },
                 'root_path': '/',
                 'interactive': False,
                 'key_label': key_label
             }
         else:
             private_key = StringIO(server_object.credential.key)
             key = server_object.credential.key
             if 'RSA' in key:
                 private_key = paramiko.RSAKey.from_private_key(private_key)
             elif 'DSA' in key:
                 private_key = paramiko.DSSKey.from_private_key(private_key)
             elif 'EC' in key:
                 private_key = paramiko.ECDSAKey.from_private_key(
                     private_key)
             elif 'OPENSSH' in key:
                 private_key = paramiko.Ed25519Key.from_private_key(
                     private_key)
             optinon_sets['roots'][u_id][0]['storageKwArgs'] = {
                 'host': server_object.ip,
                 'params': {
                     'port': server_object.credential.port,
                     'username': server_object.credential.username,
                     'pkey': private_key,
                     'timeout': 30
                 },
                 'root_path': '/',
                 'interactive': False,
                 'key_label': key_label
             }
         self.elfinder = ElfinderConnector(optinon_sets, u_id,
                                           request.session)
     else:
         optinon_sets = self.get_optionset(**kwargs)
         optinon_sets['roots'][u_id][0]['alias'] = '{0}_tmp_dir'.format(
             request.user.username)
         optinon_sets['roots'][u_id][0]['path'] = os.path.join(
             settings.MEDIA_ROOT, request.user.username, 'Download')
         optinon_sets['roots'][u_id][0]['URL'] = '{0}{1}/{2}/'.format(
             settings.MEDIA_URL, request.user.username, 'Download')
         mkdir_p(os.path.join(settings.MEDIA_ROOT, request.user.username))
         self.elfinder = ElfinderConnector(optinon_sets, u_id,
                                           request.session)
     return self.output(self.get_command(request.GET), request.GET)
Esempio n. 29
0
class ElfinderConnectorView(View):
    """
    Default elfinder backend view
    """
    def render_to_response(self, context, **kwargs):
        """
        It returns a json-encoded response, unless it was otherwise requested
        by the command operation
        """

        if not settings.DEBUG and not self.request.is_ajax():
            raise Http404

        kwargs = {}
        additional_headers = {}
        #create response headers
        if 'header' in context:
            for key in context['header']:
                if key == 'Content-Type':
                    kwargs['content_type'] = context['header'][key]
                elif key.lower() == 'status':
                    kwargs['status'] = context['header'][key]
                else:
                    additional_headers[key] = context['header'][key]
            del context['header']

        #return json if not header
        if not 'content_type' in kwargs:
            kwargs['content_type'] = 'application/json'

        if 'pointer' in context:  #return file
            context['pointer'].seek(0)
            kwargs['content'] = context['pointer'].read()
            context['volume'].close(context['pointer'],
                                    context['info']['hash'])
        elif 'raw' in context and context[
                'raw'] and 'error' in context and context[
                    'error']:  #raw error, return only the error list
            kwargs['content'] = context['error']
        elif kwargs['content_type'] == 'application/json':  #return json
            kwargs['content'] = json.dumps(context)
        else:  #return context as is!
            kwargs['content'] = context

        response = HttpResponse(**kwargs)
        for key, value in additional_headers.items():
            response[key] = value

        return response

    def output(self, cmd, src):
        """
        Collect command arguments, operate and return self.render_to_response()
        """
        args = {}

        for name in self.elfinder.commandArgsList(cmd):
            if name == 'request':
                args['request'] = self.request
            elif name == 'FILES':
                args['FILES'] = self.request.FILES
            elif name == 'targets':
                args[name] = src.getlist('targets[]')
            else:
                arg = name
                if name.endswith('_'):
                    name = name[:-1]
                if name in src:
                    try:
                        args[arg] = src.get(name).strip()
                    except:
                        args[arg] = src.get(name)
        args['debug'] = src['debug'] if 'debug' in src else False

        return self.render_to_response(self.elfinder.execute(cmd, **args))

    def get_command(self, src):
        """
        Get requested command
        """
        try:
            return src['cmd']
        except KeyError:
            return 'open'

    def get_optionset(self, **kwargs):
        set_ = ls.ELFINDER_CONNECTOR_OPTION_SETS[kwargs['optionset']]
        if kwargs['start_path'] != 'default':
            for root in set_['roots']:
                root['startPath'] = kwargs['start_path']
        return set_

    @method_decorator(staff_member_required)
    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        if not kwargs['optionset'] in ls.ELFINDER_CONNECTOR_OPTION_SETS:
            raise Http404
        return super(ElfinderConnectorView, self).dispatch(*args, **kwargs)

    def get(self, request, *args, **kwargs):
        """
        used in get method calls
        """
        self.elfinder = ElfinderConnector(self.get_optionset(**kwargs),
                                          request.session)
        return self.output(self.get_command(request.GET), request.GET)

    def post(self, request, *args, **kwargs):
        """
        called in post method calls.
        It only allows for the 'upload' command
        """
        self.elfinder = ElfinderConnector(self.get_optionset(**kwargs),
                                          request.session)
        cmd = self.get_command(request.POST)

        if not cmd in ['upload']:
            self.render_to_response({
                'error':
                self.elfinder.error(
                    ElfinderErrorMessages.ERROR_UPLOAD,
                    ElfinderErrorMessages.ERROR_UPLOAD_TOTAL_SIZE)
            })

        return self.output(cmd, request.POST)
Esempio n. 30
0
    def post(self, request, *args, **kwargs):
        """
        called in post method calls.
        It only allows for the 'upload' command
        """
        u_id = str(uuid.uuid4())
        kwargs['u_id'] = u_id
        if kwargs['optionset'] == 'sftp':
            server_object = get_object_or_404(ServerInfor,
                                              id=kwargs['start_path'])
            optinon_sets = self.get_optionset(**kwargs)
            optinon_sets['roots'][u_id][0]['alias'] = '{0}-{1}'.format(
                server_object.name, server_object.ip)
            key_label = "%s::%s" % (server_object.ip,
                                    server_object.credential.username)
            if server_object.credential.method == 'password':
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {
                    'host': server_object.ip,
                    'params': {
                        'port': server_object.credential.port,
                        'username': server_object.credential.username,
                        'password': server_object.credential.password,
                        'timeout': 30
                    },
                    'root_path': '/',
                    'interactive': False,
                    'key_label': key_label
                }
            else:
                private_key = StringIO.StringIO(server_object.credential.key)
                key = server_object.credential.key
                if 'RSA' in key:
                    private_key = paramiko.RSAKey.from_private_key(private_key)
                elif 'DSA' in key:
                    private_key = paramiko.DSSKey.from_private_key(private_key)
                elif 'EC' in key:
                    private_key = paramiko.ECDSAKey.from_private_key(
                        private_key)
                elif 'OPENSSH' in key:
                    private_key = paramiko.Ed25519Key.from_private_key(
                        private_key)
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {
                    'host': server_object.ip,
                    'params': {
                        'port': server_object.credential.port,
                        'username': server_object.credential.username,
                        'pkey': private_key,
                        'timeout': 30
                    },
                    'root_path': '/',
                    'interactive': False,
                    'key_label': key_label
                }
            self.elfinder = ElfinderConnector(optinon_sets, u_id,
                                              request.session)
        else:
            optinon_sets = self.get_optionset(**kwargs)
            optinon_sets['roots'][u_id][0]['alias'] = '{0}_tmp_dir'.format(
                request.user.username)
            optinon_sets['roots'][u_id][0]['path'] = os.path.join(
                settings.MEDIA_ROOT, request.user.username, 'Download')
            optinon_sets['roots'][u_id][0]['URL'] = '{0}{1}/{2}/'.format(
                settings.MEDIA_URL, request.user.username, 'Download')
            self.elfinder = ElfinderConnector(optinon_sets, u_id,
                                              request.session)
        cmd = self.get_command(request.POST)

        if not cmd in ['upload']:
            self.render_to_response({
                'error':
                self.elfinder.error(
                    ElfinderErrorMessages.ERROR_UPLOAD,
                    ElfinderErrorMessages.ERROR_UPLOAD_TOTAL_SIZE)
            })
        return self.output(cmd, request.POST)
Esempio n. 31
0
class ElfinderConnectorView(View):
    """
    Default elfinder backend view
    """
    
    def render_to_response(self, context, **kwargs):
        """
        It returns a json-encoded response, unless it was otherwise requested
        by the command operation
        """
        kwargs = {}
        additional_headers = {}
        #create response headers
        if 'header' in context:
            for key in context['header']:
                if key == 'Content-Type':
                    kwargs['content_type'] = context['header'][key]
                elif key.lower() == 'status':
                    kwargs['status'] = context['header'][key]
                else:
                    additional_headers[key] = context['header'][key]
            del context['header']
        
        #return json if not header
        if not 'content_type' in kwargs:
            kwargs['content_type'] = 'application/json'
            
        if 'pointer' in context: #return file
            context['pointer'].seek(0)
            kwargs['content'] = context['pointer'].read()
            context['volume'].close(context['pointer'], context['info']['hash'])
        elif 'raw' in context and context['raw'] and 'error' in context and context['error']: #raw error, return only the error list
            kwargs['content'] = context['error']
        elif kwargs['content_type'] == 'application/json': #return json
            kwargs['content'] = json.dumps(context)
        else: #return context as is!
            kwargs['content'] = context
        
        response = HttpResponse(**kwargs)
        for key, value in additional_headers.items():
            response[key] = value

        return response

    @staticmethod
    def handler_chunk(src, args):
        """
        handler chunk parameter
        """
        if "chunk" in src:
            args['chunk_name'] = re.findall(r'(.*?).\d+_\d+.part$', src['chunk'])[0]
            first_chunk_flag = re.findall(r'.*?.(\d+)_\d+.part$', src['chunk'])[0]
            if int(first_chunk_flag) == 0:
                args['is_first_chunk'] = True
            else:
                args['is_first_chunk'] = False
        else:
            args['chunk_name'] = False
            args['is_first_chunk'] = False

    def output(self, cmd, src):
        """
        Collect command arguments, operate and return self.render_to_response()
        """
        args = {}
        cmd_args = self.elfinder.commandArgsList(cmd)
        for name in cmd_args:
            if name == 'request':
                args['request'] = self.request
            elif name == 'FILES':
                args['FILES'] = self.request.FILES
            elif name == 'targets':
                args[name] = src.getlist('targets[]')
            else:
                arg = name
                if name.endswith('_'):
                    name = name[:-1]
                if name in src: 
                    try:
                        args[arg] = src.get(name).strip()
                    except:
                        args[arg] = src.get(name)
        if cmd == 'mkdir':
            args['name'] = src.getlist('dirs[]') if 'dirs[]' in src else src.getlist('name')
        elif cmd == "upload":
            if 'upload_path[]' in src:
                dir_path = src.getlist('upload_path[]')
                if len(list(set(dir_path))) == 1 and dir_path[0] == args['target']:
                    args['upload_path'] = False
                    self.handler_chunk(src, args)
                else:
                    args['upload_path'] = dir_path
                    self.handler_chunk(src, args)
            else:
                args['upload_path'] = False
                self.handler_chunk(src, args)
        elif cmd == "size":
            args['targets'] = src.getlist('targets[0]')
        args['debug'] = src['debug'] if 'debug' in src else False
        return self.render_to_response(self.elfinder.execute(cmd, **args))
    
    def get_command(self, src):
        """
        Get requested command
        """
        try:
            return src['cmd']
        except KeyError:
            return 'open'
        
    def get_optionset(self, **kwargs):
        set_ = ls.ELFINDER_CONNECTOR_OPTION_SETS[kwargs['optionset']]
        if kwargs['start_path'] != 'default':
            for root in set_['roots']:
                root['startPath'] = kwargs['start_path']
        temp_dict = copy.deepcopy(set_)
        u_id_dict = {'debug': temp_dict['debug'], 'roots': {kwargs['u_id']: temp_dict['roots']}}
        return u_id_dict
    
    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        if not kwargs['optionset'] in ls.ELFINDER_CONNECTOR_OPTION_SETS:
            raise Http404
        return super(ElfinderConnectorView, self).dispatch(*args, **kwargs)

    def get(self, request, *args, **kwargs):
        """
        used in get method calls
        """
        u_id = str(uuid.uuid4())
        if kwargs['optionset'] == 'sftp':
            kwargs['u_id'] = u_id
            server_object = get_object_or_404(ServerInfor,hostname=kwargs['start_path'])
            optinon_sets = self.get_optionset(**kwargs)
            optinon_sets['roots'][u_id][0]['alias'] = '{0}-{1}'.format(server_object.name,server_object.ip)
            key_label = "%s::%s" % (server_object.ip, server_object.credential.username)
            if server_object.credential.method == 'password':
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {'host':server_object.ip,
                                                             'params':{'port':server_object.credential.port,
                                                            'username':server_object.credential.username,
                                                            'password':server_object.credential.password,
                                                            'timeout':30},
                                                             'root_path':'/','interactive':False,
                                                                   'key_label': key_label}
            else:
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {'host':server_object.ip,
                                                                         'params':{'port':server_object.credential.port,
                                                                                   'username':server_object.credential.username,
                                                                        'key_filename':server_object.credential.key,
                                                                        'timeout':30},
                                                                         'root_path':'/','interactive':False,
                                                                   'key_label': key_label}
            self.elfinder = ElfinderConnector(optinon_sets, u_id, request.session)
        else:
            self.elfinder = ElfinderConnector(self.get_optionset(**kwargs), u_id, request.session)
        return self.output(self.get_command(request.GET), request.GET)

    def post(self, request, *args, **kwargs):
        """
        called in post method calls.
        It only allows for the 'upload' command
        """
        u_id = str(uuid.uuid4())
        if kwargs['optionset'] == 'sftp':
            kwargs['u_id'] = u_id
            server_object = get_object_or_404(ServerInfor,hostname=kwargs['start_path'])
            optinon_sets = self.get_optionset(**kwargs)
            optinon_sets['roots'][u_id][0]['alias'] = '{0}-{1}'.format(server_object.name,server_object.ip)
            key_label = "%s::%s" % (server_object.ip, server_object.credential.username)
            if server_object.credential.method == 'password':
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {'host':server_object.ip,
                                                             'params':{'port':server_object.credential.port,
                                                            'username':server_object.credential.username,
                                                            'password':server_object.credential.password,
                                                            'timeout':30},
                                                             'root_path':'/','interactive':False,
                                                            'key_label': key_label}
            else:
                optinon_sets['roots'][u_id][0]['storageKwArgs'] = {'host':server_object.ip,
                                                                         'params':{'port':server_object.credential.port,
                                                                                   'username':server_object.credential.username,
                                                                        'key_filename':server_object.credential.key,
                                                                        'timeout':30},
                                                                         'root_path':'/','interactive':False,
                                                                   'key_label': key_label}
            self.elfinder = ElfinderConnector(optinon_sets, u_id, request.session)
        else:
            self.elfinder = ElfinderConnector(self.get_optionset(**kwargs), u_id, request.session)
        cmd = self.get_command(request.POST)
        
        if not cmd in ['upload']:
            self.render_to_response({'error' : self.elfinder.error(ElfinderErrorMessages.ERROR_UPLOAD, ElfinderErrorMessages.ERROR_UPLOAD_TOTAL_SIZE)})
        return self.output(cmd, request.POST)