#151 New Feature: API KEY Masking

新功能:API KEY 脱敏处理。前端和API接口中,用*号代替。
This commit is contained in:
Physton
2023-07-14 17:02:12 +08:00
parent 34b4889e56
commit 845e38cae8
10 changed files with 196 additions and 44 deletions

View File

@@ -9,7 +9,7 @@ from scripts.physton_prompt.storage import Storage
from scripts.physton_prompt.get_extensions import get_extensions
from scripts.physton_prompt.get_token_counter import get_token_counter
from scripts.physton_prompt.get_i18n import get_i18n
from scripts.physton_prompt.get_translate_apis import get_translate_apis
from scripts.physton_prompt.get_translate_apis import get_translate_apis, privacy_translate_api_config, unprotected_translate_api_config
from scripts.physton_prompt.translate import translate
from scripts.physton_prompt.history import History
from scripts.physton_prompt.csv import get_csvs, get_csv
@@ -105,7 +105,9 @@ def on_app_started(_: gr.Blocks, app: FastAPI):
@app.get("/physton_prompt/get_data")
async def _get_data(key: str):
return {"data": st.get(key)}
data = st.get(key)
data = privacy_translate_api_config(key, data)
return {"data": data}
@app.get("/physton_prompt/get_datas")
async def _get_datas(keys: str):
@@ -113,6 +115,7 @@ def on_app_started(_: gr.Blocks, app: FastAPI):
datas = {}
for key in keys:
datas[key] = st.get(key)
datas[key] = privacy_translate_api_config(key, datas[key])
return {"datas": datas}
@app.post("/physton_prompt/set_data")
@@ -122,6 +125,7 @@ def on_app_started(_: gr.Blocks, app: FastAPI):
return {"success": False, "message": get_lang('is_required', {'0': 'key'})}
if 'data' not in data:
return {"success": False, "message": get_lang('is_required', {'0': 'data'})}
data['data'] = unprotected_translate_api_config(data['key'], data['data'])
st.set(data['key'], data['data'])
return {"success": True}
@@ -131,6 +135,7 @@ def on_app_started(_: gr.Blocks, app: FastAPI):
if not isinstance(data, dict):
return {"success": False, "message": get_lang('is_not_dict', {'0': 'data'})}
for key in data:
data[key] = unprotected_translate_api_config(key, data[key])
st.set(key, data[key])
return {"success": True}
@@ -288,9 +293,19 @@ def on_app_started(_: gr.Blocks, app: FastAPI):
return {"success": hi.remove_histories(data['type'])}
@app.post("/physton_prompt/translate")
async def _translate(text: str = Body(...), from_lang: str = Body(...), to_lang: str = Body(...),
api: str = Body(...), api_config: dict = Body(...)):
return translate(text, from_lang, to_lang, api, api_config)
async def _translate(request: Request):
data = await request.json()
if 'text' not in data:
return {"success": False, "message": get_lang('is_required', {'0': 'text'})}
if 'from_lang' not in data:
return {"success": False, "message": get_lang('is_required', {'0': 'from_lang'})}
if 'to_lang' not in data:
return {"success": False, "message": get_lang('is_required', {'0': 'to_lang'})}
if 'api' not in data:
return {"success": False, "message": get_lang('is_required', {'0': 'api'})}
if 'api_config' not in data:
return {"success": False, "message": get_lang('is_required', {'0': 'api_config'})}
return translate(data['text'], data['from_lang'], data['to_lang'], data['api'], data['api_config'])
@app.post("/physton_prompt/translates")
async def _translates(request: Request):

View File

@@ -1,8 +1,10 @@
from scripts.physton_prompt.get_lang import get_lang
from scripts.physton_prompt.get_translate_apis import unprotected_translate_api_config
def gen_openai(messages, api_config):
import openai
api_config = unprotected_translate_api_config('chatgpt_key', api_config)
openai.api_base = api_config.get('api_base', 'https://api.openai.com/v1')
openai.api_key = api_config.get('api_key', '')
model = api_config.get('model', 'gpt-3.5-turbo')

View File

@@ -1,5 +1,8 @@
import os
import json
import re
from scripts.physton_prompt.storage import Storage
st = Storage()
# from scripts.physton_prompt.storage import Storage
@@ -36,3 +39,80 @@ def get_translate_apis(reload=False):
# config_item['value'] = ''
return translate_apis
def privacy_translate_api_config(data_key, data):
# 如果 data 为空或者不是 dict
if not data or not isinstance(data, dict):
return data
# 如果 data_key 是 translate_api. 开头
api = None
if data_key == 'chatgpt_key':
api = 'openai'
else:
start = 'translate_api.'
if not data_key.startswith(start):
return data
api = data_key[len(start):]
apis = get_translate_apis()
find = False
for group in apis['apis']:
for item in group['children']:
if item['key'] == api:
find = item
break
if not find:
return data
api_item = find
for config in api_item['config']:
# 如果有 privacy 的属性并且为 True
if 'privacy' in config and config['privacy'] and config['type'] == 'input':
if config['key'] in data:
# 前面6个字符可见后面的字符用 * 替换
value = data[config['key']]
if len(value) > 6:
value = value[:6] + '*' * (len(value) - 6)
data[config['key']] = value
return data
def unprotected_translate_api_config(data_key, data):
api = None
if data_key == 'chatgpt_key':
api = 'openai'
else:
start = 'translate_api.'
if not data_key.startswith(start):
return data
api = data_key[len(start):]
apis = get_translate_apis()
find = False
for group in apis['apis']:
for item in group['children']:
if item['key'] == api:
find = item
break
if not find:
return data
api_item = find
storage_data = st.get(data_key)
for config in api_item['config']:
# 如果有 privacy 的属性并且为 True
if 'privacy' in config and config['privacy'] and config['type'] == 'input':
if storage_data and config['key'] in storage_data:
if config['key'] in data:
value = data[config['key']]
# 如果包含 * 号并且前面6个字符等于 storage_data 的前面6个字符
if '*' in value and value[:6] == storage_data[config['key']][:6]:
data[config['key']] = storage_data[config['key']]
# 多个 * 替换成一个 *
# value = re.sub(r'\*+', '*', value)
# if value == '*' and storage_data and config['key'] in storage_data:
# value = storage_data[config['key']]
# data[config['key']] = value
return data

View File

@@ -53,6 +53,8 @@ class Storage:
filename = self.__get_data_filename(key)
if not os.path.exists(filename):
return None
if os.path.getsize(filename) == 0:
return None
try:
import launch
if not launch.is_installed("chardet"):
@@ -65,8 +67,12 @@ class Storage:
encoding = chardet.detect(data).get('encoding')
data = json.loads(data.decode(encoding))
except Exception as e:
print(e)
return None
try:
with open(filename, 'r') as f:
data = json.load(f)
except Exception as e:
print(e)
return None
return data
def __set(self, key, data):

View File

@@ -1,7 +1,7 @@
import json
import hashlib
from scripts.physton_prompt.get_lang import get_lang
from scripts.physton_prompt.get_translate_apis import get_translate_apis
from scripts.physton_prompt.get_translate_apis import get_translate_apis, unprotected_translate_api_config
from scripts.physton_prompt.translator.alibaba_translator import AlibabaTranslator
from scripts.physton_prompt.translator.amazon_translator import AmazonTranslator
from scripts.physton_prompt.translator.baidu_translator import BaiduTranslator
@@ -37,8 +37,7 @@ def translate(text, from_lang, to_lang, api, api_config=None):
"translated_text": translated_text,
"from_lang": from_lang,
"to_lang": to_lang,
"api": api,
"api_config": api_config
"api": api
}
def _cache_name(text):
@@ -124,7 +123,7 @@ def translate(text, from_lang, to_lang, api, api_config=None):
translator.set_from_lang(from_lang)
translator.set_to_lang(to_lang)
translator.set_api_config(api_config)
translator.set_api_config(unprotected_translate_api_config('translate_api.' + api, api_config))
if isinstance(text, list):
translate_texts = []