diff --git a/backend/apps/datasource/api/datasource.py b/backend/apps/datasource/api/datasource.py index cdc5aa9e..49155de5 100644 --- a/backend/apps/datasource/api/datasource.py +++ b/backend/apps/datasource/api/datasource.py @@ -10,8 +10,8 @@ def datasource_list(session: SessionDep): return get_datasource_list(session=session) @router.post("/check") -def check(session: SessionDep, conf: DatasourceConf): - return check_status(session, conf) +def check(session: SessionDep, ds: CoreDatasource): + return check_status(session, ds) @router.post("/add", response_model=CoreDatasource) def add(session: SessionDep, ds: CoreDatasource): diff --git a/backend/apps/datasource/crud/datasource.py b/backend/apps/datasource/crud/datasource.py index 3a2a3519..960aee90 100644 --- a/backend/apps/datasource/crud/datasource.py +++ b/backend/apps/datasource/crud/datasource.py @@ -3,13 +3,17 @@ from ..models.datasource import CoreDatasource, DatasourceConf import pyodbc import datetime from common.core.deps import SessionDep +import json +from ..utils.utils import aes_decrypt + def get_datasource_list(session: SessionDep) -> CoreDatasource: statement = select(CoreDatasource).order_by(CoreDatasource.create_time.desc()) datasource_list = session.exec(statement).fetchall() return datasource_list -def check_status(session: SessionDep, conf: DatasourceConf): +def check_status(session: SessionDep, ds: CoreDatasource): + conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration))) conn_str = ( "DRIVER={MySQL ODBC 9.3 Unicode Driver};" # todo driver config f"SERVER={conf.host};" @@ -32,20 +36,20 @@ def check_status(session: SessionDep, conf: DatasourceConf): conn.close() def create_ds(session: SessionDep, ds: CoreDatasource): + ds.create_time = datetime.datetime.now() + ds.status = "Success" # todo check status record = CoreDatasource(**ds.model_dump()) - record.create_time = datetime.datetime.now() - record.status = "Success" # todo check status session.add(record) session.commit() - return record + return ds def update_ds(session: SessionDep, ds: CoreDatasource): ds.id = int(ds.id) - term = session.exec(select(CoreDatasource).where(CoreDatasource.id == ds.id)).first() + record = session.exec(select(CoreDatasource).where(CoreDatasource.id == ds.id)).first() update_data = ds.model_dump(exclude_unset=True) for field, value in update_data.items(): - setattr(term, field, value) - session.add(term) + setattr(record, field, value) + session.add(record) session.commit() return ds diff --git a/backend/apps/datasource/utils/__init__.py b/backend/apps/datasource/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/datasource/utils/utils.py b/backend/apps/datasource/utils/utils.py new file mode 100644 index 00000000..993e6dce --- /dev/null +++ b/backend/apps/datasource/utils/utils.py @@ -0,0 +1,19 @@ +from Crypto.Cipher import AES +from Crypto.Util.Padding import unpad, pad +import base64 + +key = b'SQLBot1234567890' + +def aes_encrypt(data): + data = bytes(data,'utf-8') + cipher = AES.new(key, AES.MODE_ECB) + data = pad(data, AES.block_size) + encrypt = cipher.encrypt(data) + return base64.b64encode(encrypt) + +def aes_decrypt(encrypted_data): + encrypted_data = base64.b64decode(encrypted_data) + cipher = AES.new(key, AES.MODE_ECB) + text = cipher.decrypt(encrypted_data) + decrypted_text = unpad(text, AES.block_size) + return decrypted_text.decode('utf-8') diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 76404dcd..db86a481 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -19,6 +19,7 @@ dependencies = [ "sentry-sdk[fastapi]<2.0.0,>=1.40.6", "pyjwt<3.0.0,>=2.8.0", "pyodbc (>=5.2.0,<5.2.1)", + "pycryptodome (>=3.22.0,<4.0.0)", ] [[tool.uv.index]] url = "https://pypi.tuna.tsinghua.edu.cn/simple" diff --git a/frontend/package.json b/frontend/package.json index 96a24441..7cc1e1a9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,6 +19,7 @@ "@vitejs/plugin-vue": "^5.2.2", "@vue/tsconfig": "^0.7.0", "axios": "^1.8.4", + "crypto-js": "^4.2.0", "element-plus": "^2.9.7", "less": "^4.3.0", "pinia": "^3.0.2", diff --git a/frontend/src/views/ds/form.vue b/frontend/src/views/ds/form.vue index ae280112..b9b9f69e 100644 --- a/frontend/src/views/ds/form.vue +++ b/frontend/src/views/ds/form.vue @@ -22,19 +22,19 @@ - + - + - + - + - +
@@ -48,6 +48,7 @@ \ No newline at end of file +./js/aes \ No newline at end of file diff --git a/frontend/src/views/ds/index.vue b/frontend/src/views/ds/index.vue index 6666446e..aa282766 100644 --- a/frontend/src/views/ds/index.vue +++ b/frontend/src/views/ds/index.vue @@ -14,7 +14,7 @@
- Add Datasource + Add Datasource
@@ -28,7 +28,7 @@
{{ ds.name }}
{{ ds.type }}
-
{{ ds.host }}
+
{{ ds.description }}
{{ datetimeFormat(ds.create_time) }}
{{ ds.status }}
@@ -82,7 +82,7 @@ const list = () => { }) } -const editDs = (item: any = {}) => { +const editDs = (item: any) => { dsForm.value.open(item) } diff --git a/frontend/src/views/ds/js/aes.ts b/frontend/src/views/ds/js/aes.ts new file mode 100644 index 00000000..94ad7eb3 --- /dev/null +++ b/frontend/src/views/ds/js/aes.ts @@ -0,0 +1,18 @@ +import CryptoJS from 'crypto-js' + +const key = CryptoJS.enc.Utf8.parse('SQLBot1234567890') + +export const encrypted = (str:string) => { + return CryptoJS.AES.encrypt(str, key, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }).toString() +} + +export const decrypted = (str:string) => { + const bytes = CryptoJS.AES.decrypt(str, key, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }) + return bytes.toString(CryptoJS.enc.Utf8) +} \ No newline at end of file