- 新增图像生成接口,支持试用、积分和自定义API Key模式 - 实现生成图片结果异步上传至MinIO存储,带重试机制 - 优化积分预扣除和异常退还逻辑,保障用户积分准确 - 添加获取生成历史记录接口,支持时间范围和分页 - 提供本地字典配置接口,支持模型、比例、提示模板和尺寸 - 实现图片批量上传接口,支持S3兼容对象存储 feat(admin): 增加管理员角色管理与权限分配接口 - 实现角色列表查询、角色创建、更新及删除功能 - 增加权限列表查询接口 - 实现用户角色分配接口,便于统一管理用户权限 - 增加系统字典增删查改接口,支持分类过滤和排序 - 权限控制全面覆盖管理接口,保证安全访问 feat(auth): 完善用户登录注册及权限相关接口与页面 - 实现手机号验证码发送及校验功能,保障注册安全 - 支持手机号注册、登录及退出接口,集成日志记录 - 增加修改密码功能,验证原密码后更新 - 提供动态导航菜单接口,基于权限展示不同菜单 - 实现管理界面路由及日志、角色、字典管理页面访问权限控制 - 添加系统日志查询接口,支持关键词和等级筛选 feat(app): 初始化Flask应用并配置蓝图与数据库 - 创建应用程序工厂,加载配置,初始化数据库和Redis客户端 - 注册认证、API及管理员蓝图,整合路由 - 根路由渲染主页模板 - 应用上下文中自动创建数据库表,保证运行环境准备完毕 feat(database): 提供数据库创建与迁移支持脚本 - 新增数据库创建脚本,支持自动检测是否已存在 - 添加数据库表初始化脚本,支持创建和删除所有表 - 实现RBAC权限初始化,包含基础权限和角色创建 - 新增字段手动修复脚本,添加用户API Key和积分字段 - 强制迁移脚本支持清理连接和修复表结构,初始化默认数据及角色分配 feat(config): 新增系统配置参数 - 配置数据库、Redis、Session和MinIO相关参数 - 添加AI接口地址及试用Key配置 - 集成阿里云短信服务配置及开发模式相关参数 feat(extensions): 初始化数据库、Redis和MinIO客户端 - 创建全局SQLAlchemy数据库实例和Redis客户端 - 配置基于boto3的MinIO兼容S3客户端 chore(logs): 添加示例系统日志文件 - 记录用户请求、验证码发送成功与失败的日志信息
188 lines
5.6 KiB
Python
188 lines
5.6 KiB
Python
from .error import VerificationError
|
|
|
|
class CffiOp(object):
|
|
def __init__(self, op, arg):
|
|
self.op = op
|
|
self.arg = arg
|
|
|
|
def as_c_expr(self):
|
|
if self.op is None:
|
|
assert isinstance(self.arg, str)
|
|
return '(_cffi_opcode_t)(%s)' % (self.arg,)
|
|
classname = CLASS_NAME[self.op]
|
|
return '_CFFI_OP(_CFFI_OP_%s, %s)' % (classname, self.arg)
|
|
|
|
def as_python_bytes(self):
|
|
if self.op is None and self.arg.isdigit():
|
|
value = int(self.arg) # non-negative: '-' not in self.arg
|
|
if value >= 2**31:
|
|
raise OverflowError("cannot emit %r: limited to 2**31-1"
|
|
% (self.arg,))
|
|
return format_four_bytes(value)
|
|
if isinstance(self.arg, str):
|
|
raise VerificationError("cannot emit to Python: %r" % (self.arg,))
|
|
return format_four_bytes((self.arg << 8) | self.op)
|
|
|
|
def __str__(self):
|
|
classname = CLASS_NAME.get(self.op, self.op)
|
|
return '(%s %s)' % (classname, self.arg)
|
|
|
|
def format_four_bytes(num):
|
|
return '\\x%02X\\x%02X\\x%02X\\x%02X' % (
|
|
(num >> 24) & 0xFF,
|
|
(num >> 16) & 0xFF,
|
|
(num >> 8) & 0xFF,
|
|
(num ) & 0xFF)
|
|
|
|
OP_PRIMITIVE = 1
|
|
OP_POINTER = 3
|
|
OP_ARRAY = 5
|
|
OP_OPEN_ARRAY = 7
|
|
OP_STRUCT_UNION = 9
|
|
OP_ENUM = 11
|
|
OP_FUNCTION = 13
|
|
OP_FUNCTION_END = 15
|
|
OP_NOOP = 17
|
|
OP_BITFIELD = 19
|
|
OP_TYPENAME = 21
|
|
OP_CPYTHON_BLTN_V = 23 # varargs
|
|
OP_CPYTHON_BLTN_N = 25 # noargs
|
|
OP_CPYTHON_BLTN_O = 27 # O (i.e. a single arg)
|
|
OP_CONSTANT = 29
|
|
OP_CONSTANT_INT = 31
|
|
OP_GLOBAL_VAR = 33
|
|
OP_DLOPEN_FUNC = 35
|
|
OP_DLOPEN_CONST = 37
|
|
OP_GLOBAL_VAR_F = 39
|
|
OP_EXTERN_PYTHON = 41
|
|
|
|
PRIM_VOID = 0
|
|
PRIM_BOOL = 1
|
|
PRIM_CHAR = 2
|
|
PRIM_SCHAR = 3
|
|
PRIM_UCHAR = 4
|
|
PRIM_SHORT = 5
|
|
PRIM_USHORT = 6
|
|
PRIM_INT = 7
|
|
PRIM_UINT = 8
|
|
PRIM_LONG = 9
|
|
PRIM_ULONG = 10
|
|
PRIM_LONGLONG = 11
|
|
PRIM_ULONGLONG = 12
|
|
PRIM_FLOAT = 13
|
|
PRIM_DOUBLE = 14
|
|
PRIM_LONGDOUBLE = 15
|
|
|
|
PRIM_WCHAR = 16
|
|
PRIM_INT8 = 17
|
|
PRIM_UINT8 = 18
|
|
PRIM_INT16 = 19
|
|
PRIM_UINT16 = 20
|
|
PRIM_INT32 = 21
|
|
PRIM_UINT32 = 22
|
|
PRIM_INT64 = 23
|
|
PRIM_UINT64 = 24
|
|
PRIM_INTPTR = 25
|
|
PRIM_UINTPTR = 26
|
|
PRIM_PTRDIFF = 27
|
|
PRIM_SIZE = 28
|
|
PRIM_SSIZE = 29
|
|
PRIM_INT_LEAST8 = 30
|
|
PRIM_UINT_LEAST8 = 31
|
|
PRIM_INT_LEAST16 = 32
|
|
PRIM_UINT_LEAST16 = 33
|
|
PRIM_INT_LEAST32 = 34
|
|
PRIM_UINT_LEAST32 = 35
|
|
PRIM_INT_LEAST64 = 36
|
|
PRIM_UINT_LEAST64 = 37
|
|
PRIM_INT_FAST8 = 38
|
|
PRIM_UINT_FAST8 = 39
|
|
PRIM_INT_FAST16 = 40
|
|
PRIM_UINT_FAST16 = 41
|
|
PRIM_INT_FAST32 = 42
|
|
PRIM_UINT_FAST32 = 43
|
|
PRIM_INT_FAST64 = 44
|
|
PRIM_UINT_FAST64 = 45
|
|
PRIM_INTMAX = 46
|
|
PRIM_UINTMAX = 47
|
|
PRIM_FLOATCOMPLEX = 48
|
|
PRIM_DOUBLECOMPLEX = 49
|
|
PRIM_CHAR16 = 50
|
|
PRIM_CHAR32 = 51
|
|
|
|
_NUM_PRIM = 52
|
|
_UNKNOWN_PRIM = -1
|
|
_UNKNOWN_FLOAT_PRIM = -2
|
|
_UNKNOWN_LONG_DOUBLE = -3
|
|
|
|
_IO_FILE_STRUCT = -1
|
|
|
|
PRIMITIVE_TO_INDEX = {
|
|
'char': PRIM_CHAR,
|
|
'short': PRIM_SHORT,
|
|
'int': PRIM_INT,
|
|
'long': PRIM_LONG,
|
|
'long long': PRIM_LONGLONG,
|
|
'signed char': PRIM_SCHAR,
|
|
'unsigned char': PRIM_UCHAR,
|
|
'unsigned short': PRIM_USHORT,
|
|
'unsigned int': PRIM_UINT,
|
|
'unsigned long': PRIM_ULONG,
|
|
'unsigned long long': PRIM_ULONGLONG,
|
|
'float': PRIM_FLOAT,
|
|
'double': PRIM_DOUBLE,
|
|
'long double': PRIM_LONGDOUBLE,
|
|
'_cffi_float_complex_t': PRIM_FLOATCOMPLEX,
|
|
'_cffi_double_complex_t': PRIM_DOUBLECOMPLEX,
|
|
'_Bool': PRIM_BOOL,
|
|
'wchar_t': PRIM_WCHAR,
|
|
'char16_t': PRIM_CHAR16,
|
|
'char32_t': PRIM_CHAR32,
|
|
'int8_t': PRIM_INT8,
|
|
'uint8_t': PRIM_UINT8,
|
|
'int16_t': PRIM_INT16,
|
|
'uint16_t': PRIM_UINT16,
|
|
'int32_t': PRIM_INT32,
|
|
'uint32_t': PRIM_UINT32,
|
|
'int64_t': PRIM_INT64,
|
|
'uint64_t': PRIM_UINT64,
|
|
'intptr_t': PRIM_INTPTR,
|
|
'uintptr_t': PRIM_UINTPTR,
|
|
'ptrdiff_t': PRIM_PTRDIFF,
|
|
'size_t': PRIM_SIZE,
|
|
'ssize_t': PRIM_SSIZE,
|
|
'int_least8_t': PRIM_INT_LEAST8,
|
|
'uint_least8_t': PRIM_UINT_LEAST8,
|
|
'int_least16_t': PRIM_INT_LEAST16,
|
|
'uint_least16_t': PRIM_UINT_LEAST16,
|
|
'int_least32_t': PRIM_INT_LEAST32,
|
|
'uint_least32_t': PRIM_UINT_LEAST32,
|
|
'int_least64_t': PRIM_INT_LEAST64,
|
|
'uint_least64_t': PRIM_UINT_LEAST64,
|
|
'int_fast8_t': PRIM_INT_FAST8,
|
|
'uint_fast8_t': PRIM_UINT_FAST8,
|
|
'int_fast16_t': PRIM_INT_FAST16,
|
|
'uint_fast16_t': PRIM_UINT_FAST16,
|
|
'int_fast32_t': PRIM_INT_FAST32,
|
|
'uint_fast32_t': PRIM_UINT_FAST32,
|
|
'int_fast64_t': PRIM_INT_FAST64,
|
|
'uint_fast64_t': PRIM_UINT_FAST64,
|
|
'intmax_t': PRIM_INTMAX,
|
|
'uintmax_t': PRIM_UINTMAX,
|
|
}
|
|
|
|
F_UNION = 0x01
|
|
F_CHECK_FIELDS = 0x02
|
|
F_PACKED = 0x04
|
|
F_EXTERNAL = 0x08
|
|
F_OPAQUE = 0x10
|
|
|
|
G_FLAGS = dict([('_CFFI_' + _key, globals()[_key])
|
|
for _key in ['F_UNION', 'F_CHECK_FIELDS', 'F_PACKED',
|
|
'F_EXTERNAL', 'F_OPAQUE']])
|
|
|
|
CLASS_NAME = {}
|
|
for _name, _value in list(globals().items()):
|
|
if _name.startswith('OP_') and isinstance(_value, int):
|
|
CLASS_NAME[_value] = _name[3:]
|