def test_delete_with_read_only_status(self): self.login_as(self.user) seafile_api.set_repo_status(self.repo.id, 1) resp = self.client.delete(self.url) self.assertEqual(403, resp.status_code)
def test_delete_with_repo_only_read(self): resp = self.client.post(self.url1, {'name': 'table9', 'owner': self.user.username}) self.assertEqual(201, resp.status_code) json_resp = json.loads(resp.content) assert json_resp["table"]["name"] == 'table9' seafile_api.set_repo_status(self.workspace.repo_id, 1) data = 'name=%s' % 'table9' resp = self.client.delete(self.url2, data, 'application/x-www-form-urlencoded') self.assertEqual(403, resp.status_code)
def test_rename_repo_with_read_only_status(self): self.login_as(self.user) seafile_api.set_repo_status(self.repo.id, 1) invalid_name = '123456' data = {'repo_name': invalid_name} resp = self.client.post( reverse('api2-repo', args=[self.repo.id]) + '?op=rename', data) self.assertEqual(403, resp.status_code)
def put(self, request, repo_id, format=None): """ update a library status, transfer a library, rename a library Permission checking: 1. only admin can perform this action. """ # argument check new_status = request.data.get('status', None) if new_status: if new_status not in ('normal', 'read-only'): error_msg = 'status invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) new_repo_name = request.data.get('name', None) if new_repo_name: if not is_valid_dirent_name(new_repo_name): error_msg = 'name invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) new_owner = request.data.get('owner', None) if new_owner: if not is_valid_email(new_owner): error_msg = 'owner invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) # resource check repo = seafile_api.get_repo(repo_id) if not repo: error_msg = 'Library %s not found.' % repo_id return api_error(status.HTTP_404_NOT_FOUND, error_msg) if new_status: try: seafile_api.set_repo_status(repo_id, normalize_repo_status_str(new_status)) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) if new_repo_name: try: res = seafile_api.edit_repo(repo_id, new_repo_name, '', None) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) if res == -1: e = 'Admin rename failed: ID of library is %s, edit_repo api called failed.' % \ repo_id logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) if new_owner: try: new_owner_obj = User.objects.get(email=new_owner) except User.DoesNotExist: error_msg = 'User %s not found.' % new_owner return api_error(status.HTTP_404_NOT_FOUND, error_msg) if not new_owner_obj.permissions.can_add_repo(): error_msg = _('Transfer failed: role of %s is %s, can not add library.') % \ (new_owner, new_owner_obj.role) return api_error(status.HTTP_403_FORBIDDEN, error_msg) if MULTI_TENANCY: try: if seafile_api.get_org_id_by_repo_id(repo_id) > 0: error_msg = 'Can not transfer organization library.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) if ccnet_api.get_orgs_by_user(new_owner): error_msg = 'Can not transfer library to organization user %s' % new_owner return api_error(status.HTTP_403_FORBIDDEN, error_msg) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) repo_owner = seafile_api.get_repo_owner(repo_id) if new_owner == repo_owner: error_msg = _("Library can not be transferred to owner.") return api_error(status.HTTP_400_BAD_REQUEST, error_msg) # get repo shared to user/group list shared_users = seafile_api.list_repo_shared_to( repo_owner, repo_id) shared_groups = seafile_api.list_repo_shared_group_by_user( repo_owner, repo_id) # get all pub repos pub_repos = [] if not request.cloud_mode: pub_repos = seafile_api.list_inner_pub_repos_by_owner(repo_owner) # transfer repo seafile_api.set_repo_owner(repo_id, new_owner) # reshare repo to user for shared_user in shared_users: shared_username = shared_user.user if new_owner == shared_username: continue seafile_api.share_repo(repo_id, new_owner, shared_username, shared_user.perm) # reshare repo to group for shared_group in shared_groups: shared_group_id = shared_group.group_id if not is_group_member(shared_group_id, new_owner): continue seafile_api.set_group_repo(repo_id, shared_group_id, new_owner, shared_group.perm) # reshare repo to links try: UploadLinkShare.objects.filter(username=repo_owner, repo_id=repo_id).update(username=new_owner) FileShare.objects.filter(username=repo_owner, repo_id=repo_id).update(username=new_owner) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) # check if current repo is pub-repo # if YES, reshare current repo to public for pub_repo in pub_repos: if repo_id != pub_repo.id: continue seafile_api.add_inner_pub_repo(repo_id, pub_repo.permission) break # send admin operation log signal admin_op_detail = { "id": repo_id, "name": repo.name, "from": repo_owner, "to": new_owner, } admin_operation.send(sender=None, admin_name=request.user.username, operation=REPO_TRANSFER, detail=admin_op_detail) repo = seafile_api.get_repo(repo_id) repo_info = get_repo_info(repo) return Response(repo_info)
def migrate_repo(repo_id, orig_storage_id, dest_storage_id): api.set_repo_status(repo_id, REPO_STATUS_READ_ONLY) dtypes = ['commits', 'fs', 'blocks'] workers = [] for dtype in dtypes: obj_stores = objstore_factory.get_obj_stores(dtype) #If these storage ids passed in do not exist in conf, stop migrate this repo. if orig_storage_id not in obj_stores or dest_storage_id not in obj_stores: logging.warning( 'Storage id passed in does not exist in configuration.\n') api.set_repo_status(repo_id, REPO_STATUS_NORMAL) sys.exit() orig_store = obj_stores[orig_storage_id] dest_store = obj_stores[dest_storage_id] try: worker = ObjMigrateWorker(orig_store, dest_store, dtype, repo_id) worker.start() workers.append(worker) except: logging.warning('Failed to migrate repo %s.', repo_id) try: for w in workers: w.join() except: api.set_repo_status(repo_id, REPO_STATUS_NORMAL) sys.exit(1) for w in workers: if w.exit_code == 1: logging.warning(w.exception) api.set_repo_status(repo_id, REPO_STATUS_NORMAL) sys.exit(1) if api.update_repo_storage_id(repo_id, dest_storage_id) < 0: logging.warning('Failed to update repo [%s] storage_id.\n', repo_id) api.set_repo_status(repo_id, REPO_STATUS_NORMAL) return api.set_repo_status(repo_id, REPO_STATUS_NORMAL) logging.info('The process of migrating repo [%s] is over.\n', repo_id)