Пример #1
0
    def aferMainDeleteJobDone(self, shared_folder_pool_array):
        dbo_pool_sub = DboPoolSubscriber(self.application.sql_client)

        self.to_shared_folder_metadata_array = []
        # start to process shared folder copy.
        for shared_folder_item in shared_folder_pool_array:
            update_poolid = shared_folder_item['poolid']
            pool_ownerid = shared_folder_item['ownerid']
            old_localpoolname = shared_folder_item['poolname']
            to_shared_folder_metadata_manager = MetaManager(self.application.sql_client, self.current_user, old_localpoolname)
            self.to_shared_folder_metadata_array.append(to_shared_folder_metadata_manager)
            
            if pool_ownerid == self.current_user['account']:
                # owner delete
                logging.info('user delete share folder(%d) path at:%s' % (update_poolid, to_shared_folder_metadata_manager.real_path))
                # update metadata in data.
                is_pass_check = to_shared_folder_metadata_manager.delete_metadata()
                if not is_pass_check:
                    errorMessage = "delete metadata fail"
                    errorCode = 1040
                    is_pass_check = False

                if is_pass_check:
                    if os.path.exists(self.metadata_manager.real_path):
                        tornado.ioloop.IOLoop.current().add_callback(self._deletePath,to_shared_folder_metadata_manager.real_path)

                # subscriber delete.
                dbo_pool_sub.delete_pool(update_poolid)
            else:
                # subscriber delete.
                dbo_pool_sub.unscriber(self.current_user['account'], update_poolid)
Пример #2
0
 def aferMainCopyJobDone(self, from_path, to_path,
                         from_shared_folder_pool_array):
     self.to_shared_folder_metadata_array = []
     # start to process shared folder copy.
     for shared_folder_item in from_shared_folder_pool_array:
         update_poolid = shared_folder_item['poolid']
         old_localpoolname = shared_folder_item['poolname']
         new_localpoolname = to_path + old_localpoolname[len(from_path):]
         from_shared_folder_metadata_manager = MetaManager(
             self.application.sql_client, self.current_user,
             old_localpoolname)
         to_shared_folder_metadata_manager = MetaManager(
             self.application.sql_client, self.current_user,
             new_localpoolname)
         self.to_shared_folder_metadata_array.append(
             to_shared_folder_metadata_manager)
         is_pass_check, copy_shared_folder_metadata, errorMessage = to_shared_folder_metadata_manager.copy_metadata(
             update_poolid, "")
         if is_pass_check and not copy_shared_folder_metadata is None:
             #tornado.ioloop.IOLoop.current().add_callback(self._copymove,from_shared_folder_metadata_manager.real_path, to_shared_folder_metadata_manager.real_path, self.OPERATION_COPY, to_shared_folder_metadata_manager.add_thumbnail, copy_shared_folder_metadata, False, None, None, None)
             #tornado.ioloop.IOLoop.current().spawn_callback(self._copymove,from_shared_folder_metadata_manager.real_path, to_shared_folder_metadata_manager.real_path, self.OPERATION_COPY, to_shared_folder_metadata_manager.add_thumbnail, copy_shared_folder_metadata, False, None, None, None)
             self._copymove(from_shared_folder_metadata_manager.real_path,
                            to_shared_folder_metadata_manager.real_path,
                            self.OPERATION_COPY,
                            to_shared_folder_metadata_manager.add_thumbnail,
                            copy_shared_folder_metadata, False, None, None,
                            None)
Пример #3
0
    def create_repo_pool(self, user_account):
        errorMessage = ""
        errorCode = 0

        is_root = 1
        pool_dbo = DboPool(self.application.sql_client)
        if not pool_dbo is None:
            # each time claim, reset old data.
            pool_dbo.empty()

        # TOOD: here should begin trans. and able to rollback.
        is_pass_check, poolid = pool_dbo.add(user_account, is_root)
        if is_pass_check:
            if poolid > 0:
                localpoolname = ""
                can_edit = 1
                status = dbconst.POOL_STATUS_OWNER

                pool_subscriber_dbo = DboPoolSubscriber(
                    self.application.sql_client)
                is_pass_check = pool_subscriber_dbo.add(
                    user_account, poolid, localpoolname, can_edit, status)
                if not is_pass_check:
                    errorMessage = "Add new pool_subscriber fail"
                    errorCode = 1032
            else:
                is_pass_check = False
                errorMessage = "poolid is wrong"
                errorCode = 1031
        else:
            errorMessage = "Add new pool fail"
            errorCode = 1030

        if is_pass_check:
            if poolid > 0:
                user_home = u'%s/storagepool/%s' % (
                    options.storage_access_point, poolid)
                self._mkdir_recursive(user_home)

                from app.controller.meta_manager import MetaManager
                user_dict = {'account': user_account, 'poolid': poolid}
                metadata_manager = MetaManager(self.application.sql_client,
                                               user_dict, "")
                is_pass_check, query_result, errorMessage = metadata_manager.add_metadata(
                    is_dir=1)
                #print "query_result", query_result
                if not is_pass_check:
                    errorMessage = "add metadata in database fail"
                    errorCode = 1040

                # set server claimed.
                self.application.claimed = True

        return is_pass_check, errorMessage, errorCode
Пример #4
0
    def post(self):
        self.set_header('Content-Type', 'application/json')

        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        used = 0
        if is_pass_check:
            self.metadata_manager = MetaManager(self.application.sql_client,
                                                self.current_user, "")
            used = self.metadata_manager.count_usage()

        free = self.get_free_space(options.storage_access_point)
        allocated = used + free

        if is_pass_check:
            self.set_status(200)
            dict_usage = {'used': used, 'trash': 0, 'allocated': allocated}
            #print dict_usage
            self.write(dict_usage)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
Пример #5
0
class AccountUsageHandler(BaseHandler):
    metadata_manager = None

    def get(self):
        return self.post()

    def post(self):
        self.set_header('Content-Type', 'application/json')

        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        used = 0
        if is_pass_check:
            self.metadata_manager = MetaManager(self.application.sql_client,
                                                self.current_user, "")
            used = self.metadata_manager.count_usage()

        free = self.get_free_space(options.storage_access_point)
        allocated = used + free

        if is_pass_check:
            self.set_status(200)
            dict_usage = {'used': used, 'trash': 0, 'allocated': allocated}
            #print dict_usage
            self.write(dict_usage)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))

    def get_free_space(self, path):
        import os
        s = os.statvfs(path)
        f = (s.f_bavail * s.f_frsize)
        return f
Пример #6
0
    def get_not_conflict_poolname(self, account, path):
        ret = False
        new_path = path
        pool_dbo = DboPool(self.application.sql_client)
        current_user = {
            'account': account,
            'poolid': pool_dbo.get_root_pool(account)
        }
        metadata_manager = MetaManager(self.application.sql_client,
                                       current_user, new_path)
        if not metadata_manager.get_path() is None:
            for i in range(100000):
                new_path = "%s(%d)" % (path, i)
                metadata_manager.init_with_path(current_user, new_path)
                if metadata_manager.get_path() is None:
                    #bingo
                    ret = True
                    break
        else:
            #bingo
            ret = True

        return ret, new_path
Пример #7
0
    def post(self):
        #self.set_header('Content-Type','application/json')

        dbo_temp_link = DboTempLink(self.application.sql_client)

        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        _body = None
        if is_pass_check:
            #logging.info('%s' % (str(self.request.body)))
            is_pass_check = False
            try:
                _body = json.loads(self.request.body)
                is_pass_check = True
            except Exception:
                errorMessage = "wrong json format"
                errorCode = 1001
                pass

        path = None
        if is_pass_check:
            is_pass_check = False
            #logging.info('%s' % (str(_body)))
            if _body:
                try:
                    if 'path' in _body:
                        path = _body['path']
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1002

        if is_pass_check:
            if path == "/":
                #PS: dropbox not all path='/''
                path = ""

            ret, errorMessage = self.check_path(path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if len(path) == 0:
                errorMessage = "path is empty"
                errorCode = 1011
                is_pass_check = False

        if is_pass_check:
            #logging.info('path %s' % (path))
            self.metadata_manager = MetaManager(self.application.sql_client,
                                                self.current_user, path)

            if not self.metadata_manager.real_path is None:
                if not os.path.isfile(self.metadata_manager.real_path):
                    errorMessage = "path on server not found"
                    errorCode = 1020
                    is_pass_check = False

        query_result = None
        if is_pass_check:
            query_result = self.metadata_manager.get_path()
            if query_result is None:
                errorMessage = "metadata not found"
                errorCode = 1021
                is_pass_check = False

        temp_link = None
        if is_pass_check:
            temp_link = "%ss-%s-%s" % (utils.get_token(),
                                       query_result['content_hash'],
                                       utils.get_token())
            while dbo_temp_link.pk_exist(temp_link):
                temp_link = "%ss-%-%s" % (utils.get_token(),
                                          query_result['content_hash'],
                                          utils.get_token())
            ret = False
            for i in range(3):
                # may conflict...
                ret = dbo_temp_link.add(temp_link,
                                        self.metadata_manager.poolid,
                                        query_result['id'],
                                        query_result['content_hash'],
                                        self.current_user['account'])
                if ret:
                    break
            if not ret:
                errorMessage = "add temp_link into database fail."
                errorCode = 1022
                is_pass_check = False

        ret_dict = {
            'metadata': query_result,
            'link': temp_link,
            'port': options.streaming_port
        }
        self.set_header('Content-Type', 'application/json')
        if is_pass_check:
            self.write(ret_dict)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
Пример #8
0
    def post(self):
        self.set_header('Content-Type', 'application/json')
        auth_dbo = self.db_account

        errorMessage = ""
        errorCode = 0
        is_pass_check = True

        if auth_dbo is None:
            errorMessage = "database return null"
            errorCode = 1001
            is_pass_check = False

        #logging.info("body:"+self.request.body)
        _body = None
        if is_pass_check:
            is_pass_check = False
            try:
                _body = json.loads(self.request.body)
                is_pass_check = True
            except Exception:
                #raise BadRequestError('Wrong JSON', 3009)
                errorMessage = "wrong json format"
                errorCode = 1003
                pass

        path = None
        if is_pass_check:
            is_pass_check = False
            if _body:
                try:
                    if 'path' in _body:
                        path = _body['path']
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1004
                    pass

        if is_pass_check:
            ret, errorMessage = self.check_path(path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if path == "/":
                path = ""

            if len(path) == 0:
                # empty is not allow in this API.
                errorMessage = "path is empty"
                errorCode = 1013
                is_pass_check = False

        if is_pass_check:
            if self.current_user['poolid'] is None:
                errorMessage = "no unshare permission"
                errorCode = 1015
                is_pass_check = False

        old_real_path = None
        old_poolid = None
        if is_pass_check:
            self.metadata_manager = MetaManager(self.application.sql_client,
                                                self.current_user, path)

            old_real_path = self.metadata_manager.real_path
            old_poolid = self.metadata_manager.poolid
            if not old_real_path is None:
                if not os.path.exists(old_real_path):
                    # path not exist
                    errorMessage = "real path is not exist"
                    errorCode = 1020
                    is_pass_check = False
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        new_real_path = None
        new_poolid = None
        to_metadata_manager = None
        if is_pass_check:
            to_metadata_manager = MetaManager(self.application.sql_client,
                                              self.current_user, "")
            to_metadata_manager.init_with_path(self.current_user,
                                               path,
                                               check_shared_pool=False)

            new_real_path = to_metadata_manager.real_path
            new_poolid = to_metadata_manager.poolid
            if not new_real_path is None:
                if os.path.exists(new_real_path):
                    # path exist, conflict, @_@; delete or not?
                    self._deletePath(new_real_path)
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        if is_pass_check:
            is_pass_check, errorMessage, errorCode = self._revokeShareCode(
                old_poolid)

        if is_pass_check:
            current_metadata = None
            is_pass_check, current_metadata, errorMessage = to_metadata_manager.move_metadata(
                self.metadata_manager.poolid, self.metadata_manager.db_path)

        if is_pass_check:
            is_pass_check = self.move_shared_folder_back(
                old_poolid, new_real_path)
            if not is_pass_check:
                errorMessage = "pool folder not exist or target folder conflict"
                errorCode = 1040
                is_pass_check = False

        if is_pass_check:
            is_pass_check, current_metadata, errorMessage = self.remove_shared_folder_pool(
                old_poolid)

        ret_dict = {'path': path}

        if is_pass_check:
            # every thing is correct
            self.write(ret_dict)

            folder_id = 0
            current_metadata = to_metadata_manager.get_path()
            if not current_metadata is None:
                folder_id = current_metadata["id"]
            self.set_header("oid", folder_id)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
            logging.error(
                '%s' %
                (str(dict(error=dict(message=errorMessage, code=errorCode)))))
Пример #9
0
    def post(self):
        self.set_header('Content-Type', 'application/json')
        folder_sharing_dbo = DboFolderSharing(self.application.sql_client)
        auth_dbo = self.db_account

        errorMessage = ""
        errorCode = 0
        is_pass_check = True

        if folder_sharing_dbo is None:
            errorMessage = "database return null"
            errorCode = 1001
            is_pass_check = False

        #logging.info("body:"+self.request.body)
        _body = None
        if is_pass_check:
            is_pass_check = False
            try:
                _body = json.loads(self.request.body)
                is_pass_check = True
            except Exception:
                #raise BadRequestError('Wrong JSON', 3009)
                errorMessage = "wrong json format"
                errorCode = 1003
                pass

        password = None
        path = None
        can_edit = 0
        if is_pass_check:
            is_pass_check = False
            if _body:
                try:
                    if 'password' in _body:
                        password = _body['password']
                    if 'path' in _body:
                        path = _body['path']
                    if 'can_edit' in _body:
                        if _body['can_edit']:
                            can_edit = 1
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1004
                    pass

        if is_pass_check:
            if password is None:
                password = ""
            else:
                if len(str(password)) < 4 and len(str(password)) > 0:
                    errorMessage = "password too short"
                    errorCode = 1005

        if is_pass_check:
            ret, errorMessage = self.check_path(path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if path == "/":
                path = ""

            if len(path) == 0:
                errorMessage = "path is empty"
                errorCode = 1013
                is_pass_check = False

        if is_pass_check:
            if self.current_user['poolid'] is None:
                errorMessage = "no share permission"
                errorCode = 1015
                is_pass_check = False

        old_real_path = None
        old_poolid = None
        if is_pass_check:
            self.metadata_manager = MetaManager(self.application.sql_client,
                                                self.current_user, path)

            old_real_path = self.metadata_manager.real_path
            old_poolid = self.metadata_manager.poolid
            if not old_real_path is None:
                if not os.path.exists(old_real_path):
                    # path not exist
                    errorMessage = "real path is not exist"
                    errorCode = 1020
                    is_pass_check = False
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        shared_folder_pool_array = []
        if is_pass_check:
            dbo_pool_sub = DboPoolSubscriber(self.application.sql_client)
            user_account = self.current_user['account']
            shared_folder_pool_array = dbo_pool_sub.contain_share_poolid(
                user_account, path)
            #print "shared_folder_pool_array",  shared_folder_pool_array
            if len(shared_folder_pool_array) > 0:
                errorMessage = "unable to create share folder which contain share folder"
                errorCode = 1031
                is_pass_check = False

        if is_pass_check:
            if self.current_user['poolid'] != old_poolid:
                errorMessage = "unable to share folder under share folder"
                errorCode = 1032
                is_pass_check = False

        ret_dict = {}
        ret_dict['password'] = password
        if is_pass_check:
            # start check on public server.
            is_pass_check = False

            http_code, json_obj = self.call_folder_sharing_reg_api()
            if http_code > 0:
                if http_code == 200 and not json_obj is None:
                    #print "json:", json_obj
                    share_code = json_obj.get('share_code', '')
                    share_code = share_code.lower()
                    if len(share_code) > 0:
                        user_account = self.current_user['account']
                        is_pass_check, new_poolid, errorMessage, errorCode = self.create_shared_folder_pool(
                            user_account, path)
                        if not is_pass_check:
                            errorMessage = "create new pool to database fail"
                            errorCode = 1042

                        if is_pass_check:
                            old_poolid = self.current_user['poolid']
                            self.metadata_manager = MetaManager(
                                self.application.sql_client, self.current_user,
                                path)
                            is_pass_check, current_metadata, errorMessage = self.metadata_manager.move_metadata(
                                old_poolid, path)
                            if is_pass_check:
                                parent_node, poolname = os.path.split(path)
                                poolname = "/" + poolname
                                is_pass_check = folder_sharing_dbo.add(
                                    share_code, password, new_poolid, poolname,
                                    can_edit)
                                if not is_pass_check:
                                    errorMessage = "insert new folder sharing info to database fail"
                                    errorCode = 1043
                            if is_pass_check:
                                # move direct
                                is_pass_check = self.move_shared_folder_to_pool(
                                    new_poolid, old_real_path)
                                if not is_pass_check:
                                    errorMessage = "move folder to new path fail"
                                    errorCode = 1044
                    else:
                        errorMessage = "share_code return empty"
                        errorCode = 1041

                    if is_pass_check:
                        if len(password) > 0:
                            share_code = share_code + "1"
                        ret_dict['share_code'] = share_code

                if http_code >= 400 and http_code <= 403 and not json_obj is None:
                    # by pass the error message
                    is_pass_check = False
                    error_json = json_obj.get('error', None)
                    if not error_json is None:
                        errorMessage = error_json.get('message', '')
                        errorCode = error_json.get('code', 0)
            else:
                errorMessage = "login server is not able to connect."
                errorCode = 1040

        if is_pass_check:
            # every thing is correct
            self.write(ret_dict)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
Пример #10
0
class UploadHandler(BaseHandler):
    metadata_manager = None

    @tornado.web.asynchronous
    def post(self):
        self.set_header('Content-Type', 'application/json')

        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        apiArg = self.request.headers.get("Dropboxlike-API-Arg")
        #logging.info('apiArg:%s ', apiArg)

        if is_pass_check:
            if apiArg is None:
                is_pass_check = False
                errorMessage = "wrong json format"
                errorCode = 1001

        _body = None
        if is_pass_check:
            is_pass_check = False
            try:
                _body = json.loads(apiArg)
                is_pass_check = True
            except Exception:
                errorMessage = "wrong json format"
                errorCode = 1001
                pass

        path = None
        mode = None
        autorename = None
        client_modified = None
        mute = None
        if is_pass_check:
            is_pass_check = False
            #logging.info('%s' % (str(_body)))
            if _body:
                try:
                    if 'path' in _body:
                        path = _body['path']
                    if 'mode' in _body:
                        mode = _body['mode']
                    if 'autorename' in _body:
                        autorename = _body['autorename']
                    if 'client_modified' in _body:
                        client_modified = _body['client_modified']
                    if 'mute' in _body:
                        mute = _body['mute']
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1002

        if is_pass_check:
            ret, errorMessage = self.check_path(path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if len(path) == 0:
                errorMessage = "path is empty"
                errorCode = 1013
                is_pass_check = False

        if is_pass_check:
            self.metadata_manager = MetaManager(self.application.sql_client,
                                                self.current_user, path)

        if is_pass_check:
            if not self.metadata_manager.can_edit:
                errorMessage = "no write premission"
                errorCode = 1020
                is_pass_check = False

        if is_pass_check:
            logging.info(u'Upload to real path at:%s' %
                         (self.metadata_manager.real_path))
            is_pass_check = self._saveFile(self.metadata_manager.real_path,
                                           self.request.body)

            # update metadata. (owner)
            if not self.metadata_manager.real_path is None:
                if os.path.isfile(self.metadata_manager.real_path):
                    if not client_modified is None:
                        is_pass_check, errorMessage = self._updateMtimeToFile(
                            self.metadata_manager.real_path, client_modified)
                        if not is_pass_check:
                            errorCode = 1022
                else:
                    errorMessage = "save file to server fail"
                    errorCode = 1023
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        query_result = None
        if is_pass_check:
            is_pass_check, query_result, errorMessage = self.metadata_manager.add_metadata_from_file(
            )
            if not is_pass_check:
                errorMessage = "add metadata in database fail"
                errorCode = 1024

        if is_pass_check:
            self.write(query_result)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
            #logging.error('%s' % (str(dict(error=dict(message=errorMessage,code=errorCode)))))
        self.finish()

    def _createFolder(self, directory_name):
        if not os.path.exists(directory_name):
            try:
                os.makedirs(directory_name)
            except OSError as exc:
                pass

    def _updateMtimeToFile(self, real_path, client_modified):
        # update access and modify time.
        #<Modified time#Created time#Accessed time>
        is_pass_check = False
        errorMessage = ""
        try:
            # update modify time.
            #st = os.stat(real_path)
            #atime = st[ST_ATIME]
            atime = utils.get_timestamp()
            if client_modified is None:
                client_modified = atime
            os.utime(real_path, (atime, client_modified))
            is_pass_check = True
        except Exception as error:
            errorMessage = "{}".format(error)
            logging.error(errorMessage)
            pass
        return is_pass_check, errorMessage

    def _saveFile(self, real_path, f_data):
        parent_node, item_name = os.path.split(real_path)
        # ensure parent exist.
        self._createFolder(parent_node)

        #f_type = path.splitext(path)[-1]
        ret, message = data_file.save(real_path, f_data)

        return ret
Пример #11
0
    def post(self):
        self.set_header('Content-Type', 'application/json')

        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        if is_pass_check:
            is_pass_check = False
            try:
                _body = json.loads(self.request.body)
                is_pass_check = True
            except Exception:
                errorMessage = "wrong json format"
                errorCode = 1001
                pass

        from_path = None
        to_path = None
        allow_shared_folder = None
        autorename = False

        if is_pass_check:
            is_pass_check = False
            #logging.info('%s' % (str(_body)))
            if _body:
                try:
                    if 'from_path' in _body:
                        from_path = _body['from_path']
                    if 'to_path' in _body:
                        to_path = _body['to_path']
                    if 'allow_shared_folder' in _body:
                        allow_shared_folder = _body['allow_shared_folder']
                    if 'autorename' in _body:
                        autorename = _body['autorename']
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1002

        if is_pass_check:
            ret, errorMessage = self.check_path(from_path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if len(from_path) == 0:
                errorMessage = "from_path is empty"
                errorCode = 1011
                is_pass_check = False

        if is_pass_check:
            ret, errorMessage = self.check_path(to_path)
            if not ret:
                is_pass_check = False
                errorCode = 1012

        if is_pass_check:
            if len(to_path) == 0:
                errorMessage = "to_path is empty"
                errorCode = 1013
                is_pass_check = False

        if is_pass_check:
            if to_path == from_path:
                errorMessage = "conflict"
                errorCode = 1014
                is_pass_check = False

        if is_pass_check:
            if to_path.startswith(from_path + '/'):
                errorMessage = "duplicated_or_nested_paths"
                errorCode = 1014
                is_pass_check = False

        if is_pass_check:
            self.from_metadata_manager = MetaManager(
                self.application.sql_client, self.current_user, from_path)

            if not self.from_metadata_manager.real_path is None:
                if not os.path.exists(self.from_metadata_manager.real_path):
                    # [TODO]:
                    # create real folders from database.
                    #pass
                    # path not exist
                    errorMessage = "from_path:%s is not exist" % (from_path, )
                    errorCode = 1020
                    is_pass_check = False
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        if is_pass_check:
            self.to_metadata_manager = MetaManager(self.application.sql_client,
                                                   self.current_user, to_path)

            if not self.to_metadata_manager.real_path is None:
                if os.path.exists(self.to_metadata_manager.real_path):
                    # [TODO]:
                    # apply autorenename rule.
                    #pass
                    # path exist
                    if not autorename:
                        errorMessage = "conflict"
                        errorCode = 1021
                        is_pass_check = False
                    else:
                        # start auto rename
                        pass
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        if is_pass_check:
            if not self.to_metadata_manager.can_edit:
                errorMessage = "to_path no write permission"
                errorCode = 1022
                is_pass_check = False

        if is_pass_check:
            if self.operation is self.OPERATION_MOVE:
                if not self.from_metadata_manager.can_edit:
                    errorMessage = "from_path no write permission"
                    errorCode = 1023
                    is_pass_check = False

        query_result = None
        if is_pass_check:
            query_result = self.from_metadata_manager.get_path()
            if query_result is None:
                errorMessage = "from_path metadata not found"
                errorCode = 1024
                is_pass_check = False

        # handle special case: when database & storage is not synced!
        # real file deleted on server, but metadata exist.
        # for now, just delete server side metadata.
        current_metadata = None
        if is_pass_check:
            current_metadata = self.to_metadata_manager.get_path()
            if not current_metadata is None:
                # delete to_path metadata.
                is_pass_check = self.to_metadata_manager.delete_metadata()
                if not is_pass_check:
                    errorMessage = "delete to_path metadata in database fail"
                    errorCode = 1025
                    is_pass_check = False

        from_shared_folder_pool_array = []
        if is_pass_check:
            self.from_metadata_manager.contain_pool_array()

        #print "from_shared_folder_pool_array", from_shared_folder_pool_array
        #self.application.sql_client.isolation_level = None
        if is_pass_check:
            # rename shared folder under from_path
            if self.operation is self.OPERATION_MOVE:
                if len(from_shared_folder_pool_array) > 0:
                    is_pass_check = False
                    if not self.to_metadata_manager.poolname is None:
                        if len(self.to_metadata_manager.poolname) == 0:
                            # ONLY is allowed in this case.
                            is_pass_check = True
                    else:
                        # unkonw error
                        pass

                    if not is_pass_check:
                        errorMessage = "unable to move share folder under share folder"
                        errorCode = 1026
                        print errorMessage, errorCode

        # PS: need roolback, don't move variable into sub block.
        dbo_pool_sub = DboPoolSubscriber(self.application.sql_client)
        if self.operation is self.OPERATION_MOVE:
            if is_pass_check:
                user_account = self.current_user['account']

                for shared_folder_item in from_shared_folder_pool_array:
                    update_poolid = shared_folder_item['poolid']
                    old_localpoolname = shared_folder_item['poolname']
                    new_localpoolname = to_path + old_localpoolname[
                        len(from_path):]
                    #print "from [%s] to [%s]" % (shared_folder_item['poolname'], new_localpoolname)
                    dbo_pool_sub.update_localpoolname(user_account,
                                                      update_poolid,
                                                      new_localpoolname,
                                                      autocommit=False)

        if is_pass_check:
            logging.info(
                '%s real path from:%s' %
                (self.operation, self.from_metadata_manager.real_path))
            logging.info('%s real path to:%s' %
                         (self.operation, self.to_metadata_manager.real_path))

            # update metadata. (owner)
            if self.operation is self.OPERATION_COPY:
                if len(self.from_metadata_manager.db_path) > 0:
                    is_pass_check, current_metadata, errorMessage = self.to_metadata_manager.copy_metadata(
                        self.from_metadata_manager.poolid,
                        self.from_metadata_manager.db_path)
                    if current_metadata is None:
                        errorMessage = "metadata not found"
                        errorCode = 1040
                        is_pass_check = False
                else:
                    # shared folder root
                    pass
                current_metadata = self.to_metadata_manager.get_path()

                #self.to_metadata_manager.copy(from_path, to_path, is_dir=is_dir)
            if self.operation is self.OPERATION_MOVE:
                if len(self.from_metadata_manager.db_path) > 0:
                    is_pass_check, current_metadata, errorMessage = self.to_metadata_manager.move_metadata(
                        self.from_metadata_manager.poolid,
                        self.from_metadata_manager.db_path)
                    if current_metadata is None:
                        errorMessage = "metadata not found"
                        errorCode = 1040
                        is_pass_check = False
                else:
                    # shared folder root
                    pass
                current_metadata = self.to_metadata_manager.get_path()

        if self.operation is self.OPERATION_MOVE:
            if is_pass_check:
                # make sure all things are correct, start to write to database.
                dbo_pool_sub.conn.commit()
            else:
                dbo_pool_sub.conn.rollback()

        if is_pass_check:
            # must everyday is done, thus to move files.
            #self._copymove(self.from_metadata_manager.real_path,self.to_metadata_manager.real_path,self.operation)
            if not current_metadata is None:
                if self.operation is self.OPERATION_COPY:
                    tornado.ioloop.IOLoop.current().add_callback(
                        self._copymove, self.from_metadata_manager.real_path,
                        self.to_metadata_manager.real_path, self.operation,
                        self.to_metadata_manager.add_thumbnail,
                        current_metadata, True, from_path, to_path,
                        from_shared_folder_pool_array)
                    #tornado.ioloop.IOLoop.current().spawn_callback(self._copymove, self.from_metadata_manager.real_path, self.to_metadata_manager.real_path, self.operation, self.to_metadata_manager.add_thumbnail, current_metadata, True, from_path, to_path, from_shared_folder_pool_array)

                if self.operation is self.OPERATION_MOVE:
                    if len(self.from_metadata_manager.db_path) > 0:
                        tornado.ioloop.IOLoop.current().add_callback(
                            self._copymove,
                            self.from_metadata_manager.real_path,
                            self.to_metadata_manager.real_path, self.operation,
                            self.to_metadata_manager.add_thumbnail,
                            current_metadata, False, None, None, None)
                        #tornado.ioloop.IOLoop.current().spawn_callback(self._copymove, self.from_metadata_manager.real_path, self.to_metadata_manager.real_path, self.operation, self.to_metadata_manager.add_thumbnail, current_metadata, False, None, None, None)
                    else:
                        # shared folder root
                        pass

        if is_pass_check:
            if not current_metadata is None:
                self.set_header("oid", current_metadata["id"])
                self.write(current_metadata)
                logging.info(current_metadata)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
            logging.error(
                '%s' %
                (str(dict(error=dict(message=errorMessage, code=errorCode)))))
        self.finish()
Пример #12
0
class FileCopyMoveHandler(BaseHandler):
    from_metadata_manager = None
    to_metadata_manager = None
    to_shared_folder_metadata_array = []
    operation = None
    OPERATION_COPY = "FileCopy"
    OPERATION_MOVE = "FileMove"

    @tornado.web.asynchronous
    def post(self):
        self.set_header('Content-Type', 'application/json')

        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        if is_pass_check:
            is_pass_check = False
            try:
                _body = json.loads(self.request.body)
                is_pass_check = True
            except Exception:
                errorMessage = "wrong json format"
                errorCode = 1001
                pass

        from_path = None
        to_path = None
        allow_shared_folder = None
        autorename = False

        if is_pass_check:
            is_pass_check = False
            #logging.info('%s' % (str(_body)))
            if _body:
                try:
                    if 'from_path' in _body:
                        from_path = _body['from_path']
                    if 'to_path' in _body:
                        to_path = _body['to_path']
                    if 'allow_shared_folder' in _body:
                        allow_shared_folder = _body['allow_shared_folder']
                    if 'autorename' in _body:
                        autorename = _body['autorename']
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1002

        if is_pass_check:
            ret, errorMessage = self.check_path(from_path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if len(from_path) == 0:
                errorMessage = "from_path is empty"
                errorCode = 1011
                is_pass_check = False

        if is_pass_check:
            ret, errorMessage = self.check_path(to_path)
            if not ret:
                is_pass_check = False
                errorCode = 1012

        if is_pass_check:
            if len(to_path) == 0:
                errorMessage = "to_path is empty"
                errorCode = 1013
                is_pass_check = False

        if is_pass_check:
            if to_path == from_path:
                errorMessage = "conflict"
                errorCode = 1014
                is_pass_check = False

        if is_pass_check:
            if to_path.startswith(from_path + '/'):
                errorMessage = "duplicated_or_nested_paths"
                errorCode = 1014
                is_pass_check = False

        if is_pass_check:
            self.from_metadata_manager = MetaManager(
                self.application.sql_client, self.current_user, from_path)

            if not self.from_metadata_manager.real_path is None:
                if not os.path.exists(self.from_metadata_manager.real_path):
                    # [TODO]:
                    # create real folders from database.
                    #pass
                    # path not exist
                    errorMessage = "from_path:%s is not exist" % (from_path, )
                    errorCode = 1020
                    is_pass_check = False
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        if is_pass_check:
            self.to_metadata_manager = MetaManager(self.application.sql_client,
                                                   self.current_user, to_path)

            if not self.to_metadata_manager.real_path is None:
                if os.path.exists(self.to_metadata_manager.real_path):
                    # [TODO]:
                    # apply autorenename rule.
                    #pass
                    # path exist
                    if not autorename:
                        errorMessage = "conflict"
                        errorCode = 1021
                        is_pass_check = False
                    else:
                        # start auto rename
                        pass
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        if is_pass_check:
            if not self.to_metadata_manager.can_edit:
                errorMessage = "to_path no write permission"
                errorCode = 1022
                is_pass_check = False

        if is_pass_check:
            if self.operation is self.OPERATION_MOVE:
                if not self.from_metadata_manager.can_edit:
                    errorMessage = "from_path no write permission"
                    errorCode = 1023
                    is_pass_check = False

        query_result = None
        if is_pass_check:
            query_result = self.from_metadata_manager.get_path()
            if query_result is None:
                errorMessage = "from_path metadata not found"
                errorCode = 1024
                is_pass_check = False

        # handle special case: when database & storage is not synced!
        # real file deleted on server, but metadata exist.
        # for now, just delete server side metadata.
        current_metadata = None
        if is_pass_check:
            current_metadata = self.to_metadata_manager.get_path()
            if not current_metadata is None:
                # delete to_path metadata.
                is_pass_check = self.to_metadata_manager.delete_metadata()
                if not is_pass_check:
                    errorMessage = "delete to_path metadata in database fail"
                    errorCode = 1025
                    is_pass_check = False

        from_shared_folder_pool_array = []
        if is_pass_check:
            self.from_metadata_manager.contain_pool_array()

        #print "from_shared_folder_pool_array", from_shared_folder_pool_array
        #self.application.sql_client.isolation_level = None
        if is_pass_check:
            # rename shared folder under from_path
            if self.operation is self.OPERATION_MOVE:
                if len(from_shared_folder_pool_array) > 0:
                    is_pass_check = False
                    if not self.to_metadata_manager.poolname is None:
                        if len(self.to_metadata_manager.poolname) == 0:
                            # ONLY is allowed in this case.
                            is_pass_check = True
                    else:
                        # unkonw error
                        pass

                    if not is_pass_check:
                        errorMessage = "unable to move share folder under share folder"
                        errorCode = 1026
                        print errorMessage, errorCode

        # PS: need roolback, don't move variable into sub block.
        dbo_pool_sub = DboPoolSubscriber(self.application.sql_client)
        if self.operation is self.OPERATION_MOVE:
            if is_pass_check:
                user_account = self.current_user['account']

                for shared_folder_item in from_shared_folder_pool_array:
                    update_poolid = shared_folder_item['poolid']
                    old_localpoolname = shared_folder_item['poolname']
                    new_localpoolname = to_path + old_localpoolname[
                        len(from_path):]
                    #print "from [%s] to [%s]" % (shared_folder_item['poolname'], new_localpoolname)
                    dbo_pool_sub.update_localpoolname(user_account,
                                                      update_poolid,
                                                      new_localpoolname,
                                                      autocommit=False)

        if is_pass_check:
            logging.info(
                '%s real path from:%s' %
                (self.operation, self.from_metadata_manager.real_path))
            logging.info('%s real path to:%s' %
                         (self.operation, self.to_metadata_manager.real_path))

            # update metadata. (owner)
            if self.operation is self.OPERATION_COPY:
                if len(self.from_metadata_manager.db_path) > 0:
                    is_pass_check, current_metadata, errorMessage = self.to_metadata_manager.copy_metadata(
                        self.from_metadata_manager.poolid,
                        self.from_metadata_manager.db_path)
                    if current_metadata is None:
                        errorMessage = "metadata not found"
                        errorCode = 1040
                        is_pass_check = False
                else:
                    # shared folder root
                    pass
                current_metadata = self.to_metadata_manager.get_path()

                #self.to_metadata_manager.copy(from_path, to_path, is_dir=is_dir)
            if self.operation is self.OPERATION_MOVE:
                if len(self.from_metadata_manager.db_path) > 0:
                    is_pass_check, current_metadata, errorMessage = self.to_metadata_manager.move_metadata(
                        self.from_metadata_manager.poolid,
                        self.from_metadata_manager.db_path)
                    if current_metadata is None:
                        errorMessage = "metadata not found"
                        errorCode = 1040
                        is_pass_check = False
                else:
                    # shared folder root
                    pass
                current_metadata = self.to_metadata_manager.get_path()

        if self.operation is self.OPERATION_MOVE:
            if is_pass_check:
                # make sure all things are correct, start to write to database.
                dbo_pool_sub.conn.commit()
            else:
                dbo_pool_sub.conn.rollback()

        if is_pass_check:
            # must everyday is done, thus to move files.
            #self._copymove(self.from_metadata_manager.real_path,self.to_metadata_manager.real_path,self.operation)
            if not current_metadata is None:
                if self.operation is self.OPERATION_COPY:
                    tornado.ioloop.IOLoop.current().add_callback(
                        self._copymove, self.from_metadata_manager.real_path,
                        self.to_metadata_manager.real_path, self.operation,
                        self.to_metadata_manager.add_thumbnail,
                        current_metadata, True, from_path, to_path,
                        from_shared_folder_pool_array)
                    #tornado.ioloop.IOLoop.current().spawn_callback(self._copymove, self.from_metadata_manager.real_path, self.to_metadata_manager.real_path, self.operation, self.to_metadata_manager.add_thumbnail, current_metadata, True, from_path, to_path, from_shared_folder_pool_array)

                if self.operation is self.OPERATION_MOVE:
                    if len(self.from_metadata_manager.db_path) > 0:
                        tornado.ioloop.IOLoop.current().add_callback(
                            self._copymove,
                            self.from_metadata_manager.real_path,
                            self.to_metadata_manager.real_path, self.operation,
                            self.to_metadata_manager.add_thumbnail,
                            current_metadata, False, None, None, None)
                        #tornado.ioloop.IOLoop.current().spawn_callback(self._copymove, self.from_metadata_manager.real_path, self.to_metadata_manager.real_path, self.operation, self.to_metadata_manager.add_thumbnail, current_metadata, False, None, None, None)
                    else:
                        # shared folder root
                        pass

        if is_pass_check:
            if not current_metadata is None:
                self.set_header("oid", current_metadata["id"])
                self.write(current_metadata)
                logging.info(current_metadata)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
            logging.error(
                '%s' %
                (str(dict(error=dict(message=errorMessage, code=errorCode)))))
        self.finish()

    #@gen.coroutine
    def aferMainCopyJobDone(self, from_path, to_path,
                            from_shared_folder_pool_array):
        self.to_shared_folder_metadata_array = []
        # start to process shared folder copy.
        for shared_folder_item in from_shared_folder_pool_array:
            update_poolid = shared_folder_item['poolid']
            old_localpoolname = shared_folder_item['poolname']
            new_localpoolname = to_path + old_localpoolname[len(from_path):]
            from_shared_folder_metadata_manager = MetaManager(
                self.application.sql_client, self.current_user,
                old_localpoolname)
            to_shared_folder_metadata_manager = MetaManager(
                self.application.sql_client, self.current_user,
                new_localpoolname)
            self.to_shared_folder_metadata_array.append(
                to_shared_folder_metadata_manager)
            is_pass_check, copy_shared_folder_metadata, errorMessage = to_shared_folder_metadata_manager.copy_metadata(
                update_poolid, "")
            if is_pass_check and not copy_shared_folder_metadata is None:
                #tornado.ioloop.IOLoop.current().add_callback(self._copymove,from_shared_folder_metadata_manager.real_path, to_shared_folder_metadata_manager.real_path, self.OPERATION_COPY, to_shared_folder_metadata_manager.add_thumbnail, copy_shared_folder_metadata, False, None, None, None)
                #tornado.ioloop.IOLoop.current().spawn_callback(self._copymove,from_shared_folder_metadata_manager.real_path, to_shared_folder_metadata_manager.real_path, self.OPERATION_COPY, to_shared_folder_metadata_manager.add_thumbnail, copy_shared_folder_metadata, False, None, None, None)
                self._copymove(from_shared_folder_metadata_manager.real_path,
                               to_shared_folder_metadata_manager.real_path,
                               self.OPERATION_COPY,
                               to_shared_folder_metadata_manager.add_thumbnail,
                               copy_shared_folder_metadata, False, None, None,
                               None)

    def _createFolder(self, directory_name):
        if not os.path.exists(directory_name):
            try:
                os.makedirs(directory_name)
            except OSError as exc:
                pass

    #@gen.coroutine
    def _copymove(self, src, dst, operation, thumbnail_callback,
                  current_metadata, is_call_shared_folder_job, from_path,
                  to_path, from_shared_folder_pool_array):
        #yield gen.moment
        if os.path.isfile(src):
            # file to file copy/move
            head, tail = os.path.split(dst)
            self._createFolder(head)
            if operation is self.OPERATION_COPY:
                shutil.copy(src, dst)
                # no matter file or folder should scan sub-folder.
                #tornado.ioloop.IOLoop.current().add_callback(thumbnail_callback,current_metadata)
                #tornado.ioloop.IOLoop.current().spawn_callback(thumbnail_callback,current_metadata)
                thumbnail_callback(current_metadata)
            elif operation is self.OPERATION_MOVE:
                shutil.move(src, dst)
        else:
            # folder to folder copy/move.
            #logging.info("%s sub-folder from %s to %s.", operation, src, dst)
            if operation is self.OPERATION_COPY:
                self.copyrecursively(src, dst)
                # no matter file or folder should scan sub-folder.
                #tornado.ioloop.IOLoop.current().add_callback(thumbnail_callback,current_metadata)
                #tornado.ioloop.IOLoop.current().spawn_callback(thumbnail_callback,current_metadata)
                thumbnail_callback(current_metadata)

                if is_call_shared_folder_job:
                    if not from_shared_folder_pool_array is None:
                        if len(from_shared_folder_pool_array) > 0:
                            #tornado.ioloop.IOLoop.instance().add_callback(self.aferMainCopyJobDone,from_path, to_path, from_shared_folder_pool_array)
                            self.aferMainCopyJobDone(
                                from_path, to_path,
                                from_shared_folder_pool_array)
            elif operation is self.OPERATION_MOVE:
                shutil.move(src, dst)

    def copyrecursively(self, root_src_dir, root_target_dir):
        logging.info("copy from %s to %s.", root_src_dir, root_target_dir)
        for src_dir, dirs, files in os.walk(root_src_dir):
            db_path = os.path.abspath(
                src_dir)[len(os.path.abspath(root_src_dir)) + 1:]
            #print "db_path", db_path
            #dst_dir = src_dir.replace(root_src_dir, root_target_dir)
            dst_dir = os.path.join(root_target_dir, db_path)
            #print "dst_dir", dst_dir
            if not os.path.exists(dst_dir):
                self._createFolder(dst_dir)

            files = [self.decodeName(f) for f in files]
            for file_ in files:
                src_file = os.path.join(src_dir, file_)
                dst_file = os.path.join(dst_dir, file_)
                if os.path.exists(dst_file):
                    os.remove(dst_file)
                if os.path.exists(src_file):
                    shutil.copy(src_file, dst_dir)
                else:
                    logging.error(src_file)

    def decodeName(self, name):
        if type(name) == str:  # leave unicode ones alone
            try:
                name = name.decode('utf8')
            except:
                name = name.decode('windows-1252')
        return name
Пример #13
0
    def post(self):
        self.set_header('Content-Type', 'application/json')

        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        if is_pass_check:
            is_pass_check = False
            try:
                _body = json.loads(self.request.body)
                is_pass_check = True
            except Exception:
                errorMessage = "wrong json format"
                errorCode = 1001
                pass

        path = None
        if is_pass_check:
            is_pass_check = False
            #logging.info('%s' % (str(_body)))
            if _body:
                try:
                    if 'path' in _body:
                        path = _body['path']
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1002

        if is_pass_check:
            ret, errorMessage = self.check_path(path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if len(path) == 0:
                errorMessage = "path is empty"
                errorCode = 1013
                is_pass_check = False

        if is_pass_check:
            self.metadata_manager = MetaManager(self.application.sql_client,
                                                self.current_user, path)

            if not self.metadata_manager.real_path is None:
                if os.path.exists(self.metadata_manager.real_path):
                    # path exist
                    errorMessage = "path is exist"
                    errorCode = 1020
                    is_pass_check = False
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        current_metadata = None
        if is_pass_check:
            current_metadata = self.metadata_manager.get_path()
            if not current_metadata is None:
                errorMessage = "metadata exist"
                errorCode = 1021
                is_pass_check = False

                # handle special case: when database & storage is not synced!
                # [TODO]: create server side folders but not files!
                pass

        if is_pass_check:
            logging.info('Create real path at:%s' %
                         (self.metadata_manager.real_path))
            self._createFolder(self.metadata_manager.real_path)

            # update metadata. (owner)
            is_pass_check, current_metadata, errorMessage = self.metadata_manager.add_metadata(
                is_dir=1)
            if not is_pass_check:
                #errorMessage = "add metadata in database fail"
                errorCode = 1022

        if is_pass_check:
            if not current_metadata is None:
                self.set_header("oid", current_metadata["id"])
                self.write(current_metadata)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
Пример #14
0
    def post(self):
        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        apiArg = self.request.headers.get("Dropboxlike-API-Arg")
        #logging.info('apiArg:%s ', apiArg)

        if is_pass_check:
            if apiArg is None:
                is_pass_check = False
                errorMessage = "wrong json format"
                errorCode = 1001

        _body = None
        if is_pass_check:
            is_pass_check = False
            try:
                _body = json.loads(apiArg)
                is_pass_check = True
            except Exception:
                errorMessage = "wrong json format"
                errorCode = 1001
                pass

        path = None
        format = None
        size = "w64h64"
        start = None
        length = None
        rev = None
        if is_pass_check:
            is_pass_check = False
            #logging.info('%s' % (str(_body)))
            if _body:
                try:
                    if 'path' in _body:
                        path = _body['path']
                    if 'start' in _body:
                        start = _body['start']
                    if 'length' in _body:
                        length = _body['length']
                    if 'rev' in _body:
                        rev = _body['rev']

                    # for thumbnail.
                    if 'format' in _body:
                        format = _body['format']
                    if 'size' in _body:
                        size = _body['size']

                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1002

        if is_pass_check:
            ret, errorMessage = self.check_path(path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if len(path) == 0:
                errorMessage = "path is empty"
                errorCode = 1013
                is_pass_check = False

        if is_pass_check:
            self.metadata_manager = MetaManager(self.application.sql_client,
                                                self.current_user, path)

        if is_pass_check:
            logging.info('download %s from real path at:%s' %
                         (self.mode, self.metadata_manager.real_path))

            if not self.metadata_manager.real_path is None:
                if not os.path.exists(self.metadata_manager.real_path):
                    errorMessage = "not_found"
                    errorCode = 1020
                    is_pass_check = False
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        query_result = None

        if is_pass_check:
            query_result = self.metadata_manager.get_path()
            if query_result is None:
                #[TODO]: handle special case: file exist, BUT metadata not found!
                errorMessage = "not_found"
                errorCode = 1020
                is_pass_check = False

        if is_pass_check:
            #self.write(query_result)
            head, filename = os.path.split(self.metadata_manager.real_path)
            download_path = self.metadata_manager.real_path
            if self.mode == "THUMBNAIL":
                doc_id = query_result['id']
                download_path = thumbnail._getThumbnailPath(
                    doc_id, size,
                    os.path.splitext(filename)[-1])

            is_pass_check = self._downloadData(download_path, filename)
            if not is_pass_check:
                for i in range(0):
                    logging.info(
                        "waiting thumbnail file to ready(%d): %s ... " %
                        (i, download_path))
                    #yield gen.sleep(2)
                    is_pass_check = self._downloadData(download_path, filename)
                    if is_pass_check:
                        break

            if not is_pass_check:
                errorMessage = "file not found"
                errorCode = 1030
                is_pass_check = False

        if is_pass_check:
            pass
        else:
            self.set_header('Content-Type', 'application/json')
            if errorCode != 1030:
                self.set_status(400)
            else:
                # only this case return 404.
                self.set_status(404)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
            logging.error(
                '%s' %
                (str(dict(error=dict(message=errorMessage, code=errorCode)))))
        self.finish()
Пример #15
0
    def post(self):
        self.set_header('Content-Type','application/json')

        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        if is_pass_check:
            is_pass_check = False
            try :
                _body = json.loads(self.request.body)
                is_pass_check = True
            except Exception:
                errorMessage = "wrong json format"
                errorCode = 1001
                pass

        path = None
        if is_pass_check:
            is_pass_check = False
            #logging.info('%s' % (str(_body)))
            if _body:
                try :
                    if 'path' in _body:
                        path = _body['path']
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1002

        if is_pass_check:
            ret, errorMessage = self.check_path(path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if len(path)==0:
                # not allow to do this action.
                errorMessage = "path is empty"
                errorCode = 1013
                is_pass_check = False
                    
        if is_pass_check:
            self.metadata_manager = MetaManager(self.application.sql_client, self.current_user, path)

            if not self.metadata_manager.real_path is None:
                if not os.path.exists(self.metadata_manager.real_path):
                    # ignore
                    pass
                    # path exist
                    #errorMessage = "path is not exist"
                    #errorCode = 1020
                    #is_pass_check = False
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        if is_pass_check:
            if not self.metadata_manager.can_edit:
                errorMessage = "no write premission"
                errorCode = 1020
                is_pass_check = False

        current_metadata = None
        if is_pass_check:
            current_metadata = self.metadata_manager.get_path()
            if current_metadata is None:
                errorMessage = "metadata not found"
                errorCode = 1021
                is_pass_check = False
        
        

        shared_folder_pool_array = self.metadata_manager.contain_pool_array()
        print "shared_folder_pool_array", shared_folder_pool_array
            
        #errorMessage = "test to breck"
        #errorCode = 1099
        #is_pass_check = False

        if is_pass_check:
            if len(self.metadata_manager.db_path) > 0:
                logging.info('user delete real path at:%s' % (self.metadata_manager.real_path))
                # update metadata in data.
                is_pass_check = self.metadata_manager.delete_metadata(current_metadata=current_metadata)
                if not is_pass_check:
                    errorMessage = "delete metadata fail"
                    errorCode = 1040
                    is_pass_check = False

                if is_pass_check:
                    if os.path.exists(self.metadata_manager.real_path):
                        tornado.ioloop.IOLoop.current().add_callback(self._deletePath,self.metadata_manager.real_path)
            else:
                # shared folder.
                pass

        if is_pass_check:
            if len(shared_folder_pool_array) > 0:
                tornado.ioloop.IOLoop.current().add_callback(self.aferMainDeleteJobDone,shared_folder_pool_array)

        if is_pass_check:
            if not current_metadata is None:
                self.set_header("oid",current_metadata["id"])
                self.write(current_metadata)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage,code=errorCode)))
            logging.error('%s' % (str(dict(error=dict(message=errorMessage,code=errorCode)))))
        self.finish()
Пример #16
0
class MetadataHandler(BaseHandler):
    mode = 'FILE'
    metadata_manager = None

    def post(self):
        self.set_header('Content-Type', 'application/json')

        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        _body = None
        if is_pass_check:
            #logging.info('%s' % (str(self.request.body)))
            is_pass_check = False
            try:
                _body = json.loads(self.request.body)
                is_pass_check = True
            except Exception:
                errorMessage = "wrong json format"
                errorCode = 1001
                pass

        path = None
        if is_pass_check:
            is_pass_check = False
            #logging.info('%s' % (str(_body)))
            if _body:
                try:
                    if 'path' in _body:
                        path = _body['path']
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1002

        if is_pass_check:
            if path == "/":
                #PS: dropbox not all path='/''
                path = ""

            ret, errorMessage = self.check_path(path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if self.mode == "FILE":
            if is_pass_check:
                if len(path) == 0:
                    errorMessage = "path is empty"
                    errorCode = 1011
                    is_pass_check = False

        if is_pass_check:
            #logging.info('path %s' % (path))
            self.metadata_manager = MetaManager(self.application.sql_client,
                                                self.current_user, path)

            if not self.metadata_manager.real_path is None:
                if not os.path.exists(self.metadata_manager.real_path):
                    pass
                    #[TODO]: rebuild path on server side from database?
                    #errorMessage = "path on server not found"
                    #errorCode = 1020
                    #is_pass_check = False

        query_result = None
        if is_pass_check:
            # start to get metadata (owner)
            if self.mode == "FILE":
                query_result = self.metadata_manager.get_path()
            else:
                folder_id = 0
                current_metadata = self.metadata_manager.get_path()
                if not current_metadata is None:
                    folder_id = current_metadata["id"]
                self.set_header("oid", folder_id)

                query_result = self.metadata_manager.list_folder(
                    show_share_folder=True)

            if query_result is None:
                errorMessage = "metadata not found"
                errorCode = 1021
                is_pass_check = False

                # [TODO]:
                # real path exist, but database not exist.
                # reture error or sync database from real path.
                pass

        if is_pass_check:
            self.write(query_result)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
Пример #17
0
class FolderShareCreateHandler(BaseHandler):
    def post(self):
        self.set_header('Content-Type', 'application/json')
        folder_sharing_dbo = DboFolderSharing(self.application.sql_client)
        auth_dbo = self.db_account

        errorMessage = ""
        errorCode = 0
        is_pass_check = True

        if folder_sharing_dbo is None:
            errorMessage = "database return null"
            errorCode = 1001
            is_pass_check = False

        #logging.info("body:"+self.request.body)
        _body = None
        if is_pass_check:
            is_pass_check = False
            try:
                _body = json.loads(self.request.body)
                is_pass_check = True
            except Exception:
                #raise BadRequestError('Wrong JSON', 3009)
                errorMessage = "wrong json format"
                errorCode = 1003
                pass

        password = None
        path = None
        can_edit = 0
        if is_pass_check:
            is_pass_check = False
            if _body:
                try:
                    if 'password' in _body:
                        password = _body['password']
                    if 'path' in _body:
                        path = _body['path']
                    if 'can_edit' in _body:
                        if _body['can_edit']:
                            can_edit = 1
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1004
                    pass

        if is_pass_check:
            if password is None:
                password = ""
            else:
                if len(str(password)) < 4 and len(str(password)) > 0:
                    errorMessage = "password too short"
                    errorCode = 1005

        if is_pass_check:
            ret, errorMessage = self.check_path(path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if path == "/":
                path = ""

            if len(path) == 0:
                errorMessage = "path is empty"
                errorCode = 1013
                is_pass_check = False

        if is_pass_check:
            if self.current_user['poolid'] is None:
                errorMessage = "no share permission"
                errorCode = 1015
                is_pass_check = False

        old_real_path = None
        old_poolid = None
        if is_pass_check:
            self.metadata_manager = MetaManager(self.application.sql_client,
                                                self.current_user, path)

            old_real_path = self.metadata_manager.real_path
            old_poolid = self.metadata_manager.poolid
            if not old_real_path is None:
                if not os.path.exists(old_real_path):
                    # path not exist
                    errorMessage = "real path is not exist"
                    errorCode = 1020
                    is_pass_check = False
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        shared_folder_pool_array = []
        if is_pass_check:
            dbo_pool_sub = DboPoolSubscriber(self.application.sql_client)
            user_account = self.current_user['account']
            shared_folder_pool_array = dbo_pool_sub.contain_share_poolid(
                user_account, path)
            #print "shared_folder_pool_array",  shared_folder_pool_array
            if len(shared_folder_pool_array) > 0:
                errorMessage = "unable to create share folder which contain share folder"
                errorCode = 1031
                is_pass_check = False

        if is_pass_check:
            if self.current_user['poolid'] != old_poolid:
                errorMessage = "unable to share folder under share folder"
                errorCode = 1032
                is_pass_check = False

        ret_dict = {}
        ret_dict['password'] = password
        if is_pass_check:
            # start check on public server.
            is_pass_check = False

            http_code, json_obj = self.call_folder_sharing_reg_api()
            if http_code > 0:
                if http_code == 200 and not json_obj is None:
                    #print "json:", json_obj
                    share_code = json_obj.get('share_code', '')
                    share_code = share_code.lower()
                    if len(share_code) > 0:
                        user_account = self.current_user['account']
                        is_pass_check, new_poolid, errorMessage, errorCode = self.create_shared_folder_pool(
                            user_account, path)
                        if not is_pass_check:
                            errorMessage = "create new pool to database fail"
                            errorCode = 1042

                        if is_pass_check:
                            old_poolid = self.current_user['poolid']
                            self.metadata_manager = MetaManager(
                                self.application.sql_client, self.current_user,
                                path)
                            is_pass_check, current_metadata, errorMessage = self.metadata_manager.move_metadata(
                                old_poolid, path)
                            if is_pass_check:
                                parent_node, poolname = os.path.split(path)
                                poolname = "/" + poolname
                                is_pass_check = folder_sharing_dbo.add(
                                    share_code, password, new_poolid, poolname,
                                    can_edit)
                                if not is_pass_check:
                                    errorMessage = "insert new folder sharing info to database fail"
                                    errorCode = 1043
                            if is_pass_check:
                                # move direct
                                is_pass_check = self.move_shared_folder_to_pool(
                                    new_poolid, old_real_path)
                                if not is_pass_check:
                                    errorMessage = "move folder to new path fail"
                                    errorCode = 1044
                    else:
                        errorMessage = "share_code return empty"
                        errorCode = 1041

                    if is_pass_check:
                        if len(password) > 0:
                            share_code = share_code + "1"
                        ret_dict['share_code'] = share_code

                if http_code >= 400 and http_code <= 403 and not json_obj is None:
                    # by pass the error message
                    is_pass_check = False
                    error_json = json_obj.get('error', None)
                    if not error_json is None:
                        errorMessage = error_json.get('message', '')
                        errorCode = error_json.get('code', 0)
            else:
                errorMessage = "login server is not able to connect."
                errorCode = 1040

        if is_pass_check:
            # every thing is correct
            self.write(ret_dict)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
            #logging.error('%s' % (str(dict(error=dict(message=errorMessage,code=errorCode)))))

    def move_shared_folder_to_pool(self, poolid, old_real_path):
        ret = False
        if poolid > 0:
            pool_home = '%s/storagepool/%s' % (options.storage_access_point,
                                               poolid)
            if not os.path.exists(pool_home):
                import shutil
                shutil.move(old_real_path, pool_home)
                ret = True
            else:
                # error
                pass
        return ret

    def create_shared_folder_pool(self, user_account, localpoolname):
        errorMessage = ""
        errorCode = 0

        is_root = 0
        pool_dbo = DboPool(self.application.sql_client)

        # TOOD: here should begin trans. and able to rollback.
        is_pass_check, poolid = pool_dbo.add(user_account, is_root)
        if is_pass_check:
            if poolid > 0:
                #localpoolname = path
                can_edit = 1
                status = dbconst.POOL_STATUS_SHARED

                pool_subscriber_dbo = DboPoolSubscriber(
                    self.application.sql_client)
                is_pass_check = pool_subscriber_dbo.add(
                    user_account, poolid, localpoolname, can_edit, status)
                if not is_pass_check:
                    errorMessage = "Add new pool_subscriber fail"
                    errorCode = 1032
            else:
                is_pass_check = False
                errorMessage = "poolid is wrong"
                errorCode = 1031
        else:
            errorMessage = "Add new pool fail"
            errorCode = 1030

        return is_pass_check, poolid, errorMessage, errorCode

    def call_folder_sharing_reg_api(self):
        api_reg_pattern = "1/repo/share/reg_folder"
        api_url = "https://%s/%s" % (options.api_hostname, api_reg_pattern)

        send_dict = {}
        repo_dbo = DboRepo(self.application.sql_client)
        repo_dict = repo_dbo.first()
        if not repo_dict is None:
            send_dict['repo_token'] = repo_dict['repo_token']
        json_body = json.dumps(send_dict)
        #print "json_body", json_body

        http_obj = libHttp.Http()
        (new_html_string,
         http_code) = http_obj.get_http_response_core(api_url, data=json_body)
        json_obj = None
        if http_code >= 200 and http_code <= 403:
            # direct read the string to json.
            try:
                json_obj = json.loads(new_html_string)
            except Exception, err:
                # not is json format.
                pass
        else:
Пример #18
0
    def post(self):
        self.set_header('Content-Type', 'application/json')

        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        apiArg = self.request.headers.get("Dropboxlike-API-Arg")
        #logging.info('apiArg:%s ', apiArg)

        if is_pass_check:
            if apiArg is None:
                is_pass_check = False
                errorMessage = "wrong json format"
                errorCode = 1001

        _body = None
        if is_pass_check:
            is_pass_check = False
            try:
                _body = json.loads(apiArg)
                is_pass_check = True
            except Exception:
                errorMessage = "wrong json format"
                errorCode = 1001
                pass

        path = None
        mode = None
        autorename = None
        client_modified = None
        mute = None
        if is_pass_check:
            is_pass_check = False
            #logging.info('%s' % (str(_body)))
            if _body:
                try:
                    if 'path' in _body:
                        path = _body['path']
                    if 'mode' in _body:
                        mode = _body['mode']
                    if 'autorename' in _body:
                        autorename = _body['autorename']
                    if 'client_modified' in _body:
                        client_modified = _body['client_modified']
                    if 'mute' in _body:
                        mute = _body['mute']
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1002

        if is_pass_check:
            ret, errorMessage = self.check_path(path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if len(path) == 0:
                errorMessage = "path is empty"
                errorCode = 1013
                is_pass_check = False

        if is_pass_check:
            self.metadata_manager = MetaManager(self.application.sql_client,
                                                self.current_user, path)

        if is_pass_check:
            if not self.metadata_manager.can_edit:
                errorMessage = "no write premission"
                errorCode = 1020
                is_pass_check = False

        if is_pass_check:
            logging.info(u'Upload to real path at:%s' %
                         (self.metadata_manager.real_path))
            is_pass_check = self._saveFile(self.metadata_manager.real_path,
                                           self.request.body)

            # update metadata. (owner)
            if not self.metadata_manager.real_path is None:
                if os.path.isfile(self.metadata_manager.real_path):
                    if not client_modified is None:
                        is_pass_check, errorMessage = self._updateMtimeToFile(
                            self.metadata_manager.real_path, client_modified)
                        if not is_pass_check:
                            errorCode = 1022
                else:
                    errorMessage = "save file to server fail"
                    errorCode = 1023
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        query_result = None
        if is_pass_check:
            is_pass_check, query_result, errorMessage = self.metadata_manager.add_metadata_from_file(
            )
            if not is_pass_check:
                errorMessage = "add metadata in database fail"
                errorCode = 1024

        if is_pass_check:
            self.write(query_result)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage, code=errorCode)))
            #logging.error('%s' % (str(dict(error=dict(message=errorMessage,code=errorCode)))))
        self.finish()
Пример #19
0
class FileDeleteHandler(BaseHandler):
    metadata_manager = None
    to_shared_folder_metadata_array = []

    @tornado.web.asynchronous
    def post(self):
        self.set_header('Content-Type','application/json')

        is_pass_check = True
        errorMessage = ""
        errorCode = 0

        if is_pass_check:
            is_pass_check = False
            try :
                _body = json.loads(self.request.body)
                is_pass_check = True
            except Exception:
                errorMessage = "wrong json format"
                errorCode = 1001
                pass

        path = None
        if is_pass_check:
            is_pass_check = False
            #logging.info('%s' % (str(_body)))
            if _body:
                try :
                    if 'path' in _body:
                        path = _body['path']
                    is_pass_check = True
                except Exception:
                    errorMessage = "parse json fail"
                    errorCode = 1002

        if is_pass_check:
            ret, errorMessage = self.check_path(path)
            if not ret:
                is_pass_check = False
                errorCode = 1010

        if is_pass_check:
            if len(path)==0:
                # not allow to do this action.
                errorMessage = "path is empty"
                errorCode = 1013
                is_pass_check = False
                    
        if is_pass_check:
            self.metadata_manager = MetaManager(self.application.sql_client, self.current_user, path)

            if not self.metadata_manager.real_path is None:
                if not os.path.exists(self.metadata_manager.real_path):
                    # ignore
                    pass
                    # path exist
                    #errorMessage = "path is not exist"
                    #errorCode = 1020
                    #is_pass_check = False
            else:
                errorMessage = "no permission"
                errorCode = 1030
                is_pass_check = False

        if is_pass_check:
            if not self.metadata_manager.can_edit:
                errorMessage = "no write premission"
                errorCode = 1020
                is_pass_check = False

        current_metadata = None
        if is_pass_check:
            current_metadata = self.metadata_manager.get_path()
            if current_metadata is None:
                errorMessage = "metadata not found"
                errorCode = 1021
                is_pass_check = False
        
        

        shared_folder_pool_array = self.metadata_manager.contain_pool_array()
        print "shared_folder_pool_array", shared_folder_pool_array
            
        #errorMessage = "test to breck"
        #errorCode = 1099
        #is_pass_check = False

        if is_pass_check:
            if len(self.metadata_manager.db_path) > 0:
                logging.info('user delete real path at:%s' % (self.metadata_manager.real_path))
                # update metadata in data.
                is_pass_check = self.metadata_manager.delete_metadata(current_metadata=current_metadata)
                if not is_pass_check:
                    errorMessage = "delete metadata fail"
                    errorCode = 1040
                    is_pass_check = False

                if is_pass_check:
                    if os.path.exists(self.metadata_manager.real_path):
                        tornado.ioloop.IOLoop.current().add_callback(self._deletePath,self.metadata_manager.real_path)
            else:
                # shared folder.
                pass

        if is_pass_check:
            if len(shared_folder_pool_array) > 0:
                tornado.ioloop.IOLoop.current().add_callback(self.aferMainDeleteJobDone,shared_folder_pool_array)

        if is_pass_check:
            if not current_metadata is None:
                self.set_header("oid",current_metadata["id"])
                self.write(current_metadata)
        else:
            self.set_status(400)
            self.write(dict(error=dict(message=errorMessage,code=errorCode)))
            logging.error('%s' % (str(dict(error=dict(message=errorMessage,code=errorCode)))))
        self.finish()
            
    # [TODO]:
    # delete fail, but file locked.
    @gen.coroutine
    def _deletePath(self, real_path):
        import shutil
        if os.path.exists(real_path):
            if os.path.isfile(real_path):
                try:
                    os.unlink(real_path)
                except Exception as error:
                    errorMessage = "{}".format(error)
                    logging.error(errorMessage)
                    pass
            else:
                for root, dirs, files in os.walk(real_path):
                    yield gen.moment
                    for f in files:
                        os.unlink(os.path.join(root, f))
                    for d in dirs:
                        shutil.rmtree(os.path.join(root, d))
                shutil.rmtree(real_path)

    #@gen.coroutine
    def aferMainDeleteJobDone(self, shared_folder_pool_array):
        dbo_pool_sub = DboPoolSubscriber(self.application.sql_client)

        self.to_shared_folder_metadata_array = []
        # start to process shared folder copy.
        for shared_folder_item in shared_folder_pool_array:
            update_poolid = shared_folder_item['poolid']
            pool_ownerid = shared_folder_item['ownerid']
            old_localpoolname = shared_folder_item['poolname']
            to_shared_folder_metadata_manager = MetaManager(self.application.sql_client, self.current_user, old_localpoolname)
            self.to_shared_folder_metadata_array.append(to_shared_folder_metadata_manager)
            
            if pool_ownerid == self.current_user['account']:
                # owner delete
                logging.info('user delete share folder(%d) path at:%s' % (update_poolid, to_shared_folder_metadata_manager.real_path))
                # update metadata in data.
                is_pass_check = to_shared_folder_metadata_manager.delete_metadata()
                if not is_pass_check:
                    errorMessage = "delete metadata fail"
                    errorCode = 1040
                    is_pass_check = False

                if is_pass_check:
                    if os.path.exists(self.metadata_manager.real_path):
                        tornado.ioloop.IOLoop.current().add_callback(self._deletePath,to_shared_folder_metadata_manager.real_path)

                # subscriber delete.
                dbo_pool_sub.delete_pool(update_poolid)
            else:
                # subscriber delete.
                dbo_pool_sub.unscriber(self.current_user['account'], update_poolid)