Skip to content

Commit

Permalink
#151 New Feature: API KEY Masking
Browse files Browse the repository at this point in the history
新功能:API KEY 脱敏处理。前端和API接口中,用*号代替。
  • Loading branch information
Physton committed Jul 14, 2023
1 parent 34b4889 commit 845e38c
Show file tree
Hide file tree
Showing 10 changed files with 196 additions and 44 deletions.
2 changes: 1 addition & 1 deletion javascript/main.entry.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion javascript/main.entry.js.map

Large diffs are not rendered by default.

25 changes: 20 additions & 5 deletions scripts/on_app_started.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
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
Expand Down Expand Up @@ -105,14 +105,17 @@ async def _token_counter(request: Request):

@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):
keys = keys.split(',')
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")
Expand All @@ -122,6 +125,7 @@ async def _set_data(request: Request):
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}

Expand All @@ -131,6 +135,7 @@ async def _set_datas(request: Request):
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}

Expand Down Expand Up @@ -288,9 +293,19 @@ async def _delete_histories(request: Request):
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):
Expand Down
2 changes: 2 additions & 0 deletions scripts/physton_prompt/gen_openai.py
Original file line number Diff line number Diff line change
@@ -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')
Expand Down
80 changes: 80 additions & 0 deletions scripts/physton_prompt/get_translate_apis.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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
10 changes: 8 additions & 2 deletions scripts/physton_prompt/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ def __get(self, key):
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"):
Expand All @@ -65,8 +67,12 @@ def __get(self, key):
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):
Expand Down
7 changes: 3 additions & 4 deletions scripts/physton_prompt/translate.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -37,8 +37,7 @@ def _translate_result(success, message, translated_text):
"translated_text": translated_text,
"from_lang": from_lang,
"to_lang": to_lang,
"api": api,
"api_config": api_config
"api": api
}

def _cache_name(text):
Expand Down Expand Up @@ -124,7 +123,7 @@ def _cache_name(text):

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 = []
Expand Down
11 changes: 6 additions & 5 deletions src/src/components/chatgptPrompt.vue
Original file line number Diff line number Diff line change
Expand Up @@ -154,15 +154,16 @@ export default {
configs[item.key] = res.chatgpt_key[item.key] || item.default || ''
}
} else {
if (res['translate_api.openai'] && res['translate_api.openai'].api_key) {
/*if (res['translate_api.openai'] && res['translate_api.openai'].api_key) {
for (const item of api.config) {
configs[item.key] = res['translate_api.openai'][item.key] || item.default || ''
}
} else {
for (const item of api.config) {
configs[item.key] = item.default || ''
}
} else {*/
for (const item of api.config) {
configs[item.key] = item.default || ''
}
/*}*/
// this.gradioAPI.setData('chatgpt_key', configs)
}
if (!configs['api_key']) {
this.hidePanels['api'] = false
Expand Down
23 changes: 23 additions & 0 deletions tests/privacy_api_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
from scripts.physton_prompt.storage import Storage
from scripts.physton_prompt.get_translate_apis import privacy_translate_api_config, unprotected_translate_api_config
st = Storage()
key = 'translate_api.volcengine'
data = st.get(key)
data = privacy_translate_api_config(key, data)
print(data)
data = unprotected_translate_api_config(key, data)
print(data)

data = {
'key': 'translate_api.volcengine',
'data': {
'access_key_id': 'AKLTYz*****************************************',
'access_key_secret': 'TWpVNV******************************************************',
'region': 'cn-north-1',
}
}
data['data'] = unprotected_translate_api_config(data['key'], data['data'])
print(data)
Loading

0 comments on commit 845e38c

Please sign in to comment.