Skip to content

Commit 9b89765

Browse files
Merge branch 'main' into pr@main/mobile-voice
2 parents 5e88bdd + 2faabbe commit 9b89765

File tree

40 files changed

+19256
-16498
lines changed

40 files changed

+19256
-16498
lines changed

apps/application/chat_pipeline/step/chat_step/impl/base_chat_step.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def event_content(response,
139139
logging.getLogger("max_kb_error").error(f'{str(e)}:{traceback.format_exc()}')
140140
all_text = 'Exception:' + str(e)
141141
write_context(step, manage, 0, 0, all_text)
142-
asker = manage.context.get('asker', None)
142+
asker = manage.context.get('form_data', {}).get('asker', None)
143143
post_response_handler.handler(chat_id, chat_record_id, paragraph_list, problem_text,
144144
all_text, manage, step, padding_problem_text, client_id, reasoning_content='',
145145
asker=asker)
@@ -307,7 +307,7 @@ def execute_block(self, message_list: List[BaseMessage],
307307
else:
308308
reasoning_content = reasoning_result.get('reasoning_content') + reasoning_result_end.get(
309309
'reasoning_content')
310-
asker = manage.context.get('asker', None)
310+
asker = manage.context.get('form_data', {}).get('asker', None)
311311
post_response_handler.handler(chat_id, chat_record_id, paragraph_list, problem_text,
312312
content, manage, self, padding_problem_text, client_id,
313313
reasoning_content=reasoning_content if reasoning_content_enable else '',
@@ -325,7 +325,7 @@ def execute_block(self, message_list: List[BaseMessage],
325325
except Exception as e:
326326
all_text = 'Exception:' + str(e)
327327
write_context(self, manage, 0, 0, all_text)
328-
asker = manage.context.get('asker', None)
328+
asker = manage.context.get('form_data', {}).get('asker', None)
329329
post_response_handler.handler(chat_id, chat_record_id, paragraph_list, problem_text,
330330
all_text, manage, self, padding_problem_text, client_id, reasoning_content='',
331331
asker=asker)

apps/application/serializers/application_serializers.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
from common.field.common import UploadedImageField, UploadedFileField
4040
from common.models.db_model_manage import DBModelManage
4141
from common.response import result
42-
from common.util.common import valid_license, password_encrypt
42+
from common.util.common import valid_license, password_encrypt, restricted_loads
4343
from common.util.field_message import ErrMessage
4444
from common.util.file_util import get_file_content
4545
from dataset.models import DataSet, Document, Image
@@ -60,6 +60,7 @@
6060

6161

6262
class MKInstance:
63+
6364
def __init__(self, application: dict, function_lib_list: List[dict], version: str):
6465
self.application = application
6566
self.function_lib_list = function_lib_list
@@ -727,7 +728,7 @@ def import_(self, with_valid=True):
727728
user_id = self.data.get('user_id')
728729
mk_instance_bytes = self.data.get('file').read()
729730
try:
730-
mk_instance = pickle.loads(mk_instance_bytes)
731+
mk_instance = restricted_loads(mk_instance_bytes)
731732
except Exception as e:
732733
raise AppApiException(1001, _("Unsupported file format"))
733734
application = mk_instance.application
@@ -813,7 +814,7 @@ def list_function_lib(self, with_valid=True):
813814
return FunctionLibSerializer.Query(
814815
data={'user_id': application.user_id, 'is_active': True,
815816
'function_type': FunctionType.PUBLIC}
816-
).list(with_valid=True)
817+
).list(with_valid=True)
817818

818819
def get_function_lib(self, function_lib_id, with_valid=True):
819820
if with_valid:
@@ -983,6 +984,7 @@ def profile(self, with_valid=True):
983984
'draggable': application_setting.draggable,
984985
'show_guide': application_setting.show_guide,
985986
'avatar': application_setting.avatar,
987+
'show_avatar': application_setting.show_avatar,
986988
'float_icon': application_setting.float_icon,
987989
'authentication': application_setting.authentication,
988990
'authentication_type': application_setting.authentication_value.get(
@@ -991,6 +993,7 @@ def profile(self, with_valid=True):
991993
'disclaimer_value': application_setting.disclaimer_value,
992994
'custom_theme': application_setting.custom_theme,
993995
'user_avatar': application_setting.user_avatar,
996+
'show_user_avatar': application_setting.show_user_avatar,
994997
'float_location': application_setting.float_location}
995998
return ApplicationSerializer.Query.reset_application(
996999
{**ApplicationSerializer.ApplicationModel(application).data,

apps/common/util/common.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import importlib
1111
import io
1212
import mimetypes
13+
import pickle
1314
import re
1415
import shutil
1516
from functools import reduce
@@ -23,6 +24,31 @@
2324
from ..exception.app_exception import AppApiException
2425
from ..models.db_model_manage import DBModelManage
2526

27+
safe_builtins = {
28+
'MKInstance'
29+
}
30+
31+
ALLOWED_CLASSES = {
32+
("builtins", "dict"),
33+
('uuid', 'UUID'),
34+
("application.serializers.application_serializers", "MKInstance"),
35+
("function_lib.serializers.function_lib_serializer", "FlibInstance")
36+
}
37+
38+
39+
class RestrictedUnpickler(pickle.Unpickler):
40+
41+
def find_class(self, module, name):
42+
if (module, name) in ALLOWED_CLASSES:
43+
return super().find_class(module, name)
44+
raise pickle.UnpicklingError("global '%s.%s' is forbidden" %
45+
(module, name))
46+
47+
48+
def restricted_loads(s):
49+
"""Helper function analogous to pickle.loads()."""
50+
return RestrictedUnpickler(io.BytesIO(s)).load()
51+
2652

2753
def encryption(message: str):
2854
"""

apps/function_lib/serializers/function_lib_serializer.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@date:2024/8/2 17:35
77
@desc:
88
"""
9+
import io
910
import json
1011
import pickle
1112
import re
@@ -22,6 +23,7 @@
2223
from common.exception.app_exception import AppApiException
2324
from common.field.common import UploadedFileField, UploadedImageField
2425
from common.response import result
26+
from common.util.common import restricted_loads
2527
from common.util.field_message import ErrMessage
2628
from common.util.function_code import FunctionExecutor
2729
from common.util.rsa_util import rsa_long_decrypt, rsa_long_encrypt
@@ -288,7 +290,7 @@ def edit(self, instance, with_valid=True):
288290
if function_lib.init_params:
289291
old_init_params = json.loads(rsa_long_decrypt(function_lib.init_params))
290292
for key in edit_dict['init_params']:
291-
if edit_dict['init_params'][key] == encryption(old_init_params[key]):
293+
if key in old_init_params and edit_dict['init_params'][key] == encryption(old_init_params[key]):
292294
edit_dict['init_params'][key] = old_init_params[key]
293295

294296
edit_dict['init_params'] = rsa_long_encrypt(json.dumps(edit_dict['init_params']))
@@ -308,7 +310,7 @@ def one(self, with_valid=True):
308310
password_fields = [i["field"] for i in function_lib.init_field_list if i.get("input_type") == "PasswordInput"]
309311
if function_lib.init_params:
310312
for k in function_lib.init_params:
311-
if k in password_fields:
313+
if k in password_fields and function_lib.init_params[k]:
312314
function_lib.init_params[k] = encryption(function_lib.init_params[k])
313315
return {**FunctionLibModelSerializer(function_lib).data, 'init_params': function_lib.init_params}
314316

@@ -338,7 +340,7 @@ def import_(self, with_valid=True):
338340
user_id = self.data.get('user_id')
339341
flib_instance_bytes = self.data.get('file').read()
340342
try:
341-
flib_instance = pickle.loads(flib_instance_bytes)
343+
flib_instance = restricted_loads(flib_instance_bytes)
342344
except Exception as e:
343345
raise AppApiException(1001, _("Unsupported file format"))
344346
function_lib = flib_instance.function_lib

0 commit comments

Comments
 (0)