69 lines
2.2 KiB
Plaintext
69 lines
2.2 KiB
Plaintext
from PDAPI import *
|
|
import os
|
|
from Utils.Lib import PermissionVerifier
|
|
|
|
RESOURCE_ROOT = os.path.join(os.path.abspath(os.path.join(os.getcwd(), "resource")))
|
|
|
|
|
|
def _sha1_path(sha1_hex):
|
|
return os.path.join(RESOURCE_ROOT, sha1_hex[0:2], sha1_hex[2:4], sha1_hex[4:6], sha1_hex)
|
|
|
|
|
|
__metadata__ = {
|
|
"route": "{DEFAULT_ROUTE}/<sha1>",
|
|
"methods": ["DELETE"],
|
|
"blueprint": "GERP",
|
|
"permission": 3.0,
|
|
"attributes": [],
|
|
"limit": "10 per minute",
|
|
}
|
|
|
|
def HandleRequest(_CleanedData):
|
|
current_user = UGM.GetELTUser()
|
|
if not current_user:
|
|
return {"code": 401, "msg": "未登录"}, 401
|
|
|
|
if not PermissionVerifier(3.0, ["admin:fileasset_delete"]):
|
|
return {"code": 403, "msg": "无文件资产删除权限"}, 403
|
|
|
|
sha1 = _CleanedData["params"].get("sha1", "").strip()
|
|
if not sha1 or len(sha1) != 40:
|
|
return {"code": 1, "msg": "无效的SHA1"}, 400
|
|
|
|
asset = GERPFileAsset.query.filter(GERPFileAsset.FileSHA1 == sha1).first()
|
|
if not asset:
|
|
return {"code": 404, "msg": "文件不存在"}, 404
|
|
|
|
if asset.CompanyUUID:
|
|
current_role_uuid_str = flask.request.cookies.get("CurrentRoleUUID")
|
|
if current_role_uuid_str:
|
|
try:
|
|
role_uuid_bytes = UUIDObj(current_role_uuid_str).bytes
|
|
current_role = GERPRole.query.filter(GERPRole.RoleUUID == role_uuid_bytes).first()
|
|
if not current_role or not current_role.CompanyUUID or current_role.CompanyUUID != asset.CompanyUUID:
|
|
return {"code": 403, "msg": "无权删除其他公司的文件"}, 403
|
|
except:
|
|
return {"code": 403, "msg": "无权删除此文件"}, 403
|
|
else:
|
|
return {"code": 403, "msg": "无权删除此文件"}, 403
|
|
|
|
if asset.RefCount > 0:
|
|
return {"code": 1, "msg": f"文件仍有 {asset.RefCount} 处引用,无法删除"}, 200
|
|
|
|
file_path = _sha1_path(sha1)
|
|
|
|
try:
|
|
db.session.delete(asset)
|
|
db.session.commit()
|
|
except:
|
|
db.session.rollback()
|
|
return {"code": 1, "msg": "数据库删除失败"}, 200
|
|
|
|
if os.path.exists(file_path):
|
|
try:
|
|
os.remove(file_path)
|
|
except:
|
|
pass
|
|
|
|
return {"code": 0, "msg": "删除成功"}, 200
|