libushang 4 meses atrás
pai
commit
fa3102f9bd

+ 76 - 0
common/enc/emergency_expert_data.py

@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from . import mpfun
+from models import *
+from sqlalchemy.orm import Session
+from database import get_local_db
+
+# 应急专家信息表
+
+# 加密和HMAC签名
+def sign_row(db: Session, row: EmergencyExpert) -> None:
+    if row.sign != '':
+        return
+    
+    name = mpfun.base64_data(row.name) # 姓名
+    area = mpfun.base64_data(row.area) # 地区
+    type = mpfun.base64_data(row.type) # 类型
+    company = mpfun.base64_data(row.company) # 公司
+    official = mpfun.base64_data(row.official) # 职称
+    phone = mpfun.enc_data(row.phone) # 手机号码
+    longitude = str(row.longitude) # 经度
+    latitude = str(row.latitude) # 纬度
+
+    sign_data = ",".join([name, area, type, company, official, phone, longitude, latitude])
+    sign_hmac = mpfun.sign_data(sign_data)
+    # print('sign_data:', sign_data)
+    # print('sign_hmac:', sign_hmac)
+
+    row.phone = phone
+    row.sign = sign_hmac
+    
+    db.commit()
+
+# 比较字段合并字符串是否和MAC值匹配上,调用密码服务器[验证HMAC]接口
+def sign_valid_row(row: EmergencyExpert) -> bool:
+    if row.sign == '':
+        return True
+
+    # 关键字段合并字符串
+    sign_data = get_sign_str(row)
+    # print('sys_user sign_data:', sign_data)
+    
+    # 原HMACSM3数值
+    sign_hmac = row.sign
+    # print('sign_hmac:', sign_hmac)
+
+    return mpfun.hmac_verify(sign_data, sign_hmac)
+
+# 生成待签名的字符串
+def get_sign_str(row: EmergencyExpert) -> str:
+    name = mpfun.base64_data(row.name) # 姓名
+    area = mpfun.base64_data(row.area) # 地区
+    type = mpfun.base64_data(row.type) # 类型
+    company = mpfun.base64_data(row.company) # 公司
+    official = mpfun.base64_data(row.official) # 职称
+    phone = (row.phone) # 手机号码
+    longitude = str(row.longitude) # 经度
+    latitude = str(row.latitude) # 纬度
+
+    # 关键字段合并字符串
+    sign_data = ",".join([name, area, type, company, official, phone, longitude, latitude])
+    return sign_data
+
+# 生成HAMC签名值
+def get_sign_hmac(row: EmergencyExpert) -> str:
+    sign_data = get_sign_str(row)
+    return mpfun.sign_data(sign_data) 
+
+# 对所有数据进行签名
+def sign_table():
+    print('sign_emergency_expert table =====>>>')
+    with get_local_db() as db:
+        rows = db.query(EmergencyExpert).filter(EmergencyExpert.sign == '').all()
+        for row in rows:
+            sign_row(db, row)

+ 1 - 1
common/enc/govdata_disaster_info_officer_data.py

@@ -53,7 +53,7 @@ def get_sign_str(row: GovdataDisasterInfoOfficer) -> str:
     name = mpfun.base64_data(row.name) # 姓名
     gender = mpfun.base64_data(row.gender) # 性别
     work_unit = mpfun.base64_data(row.work_unit) # 工作单位
-    cellphone = mpfun.enc_data(row.cellphone) # 手机号码
+    cellphone = (row.cellphone) # 手机号码
     location = mpfun.base64_data(row.location) # 所处位置
     area = mpfun.base64_data(row.area) # 区县
     longitude = str(row.longitude) # 经度

+ 4 - 0
jobs/sign_data_job.py

@@ -13,6 +13,7 @@ from common.enc import sys_czrz_data
 from common.enc import emergency_contact_info_data
 from common.enc import three_proofing_responsible_person_data
 from common.enc import govdata_disaster_info_officer_data
+from common.enc import emergency_expert_data
 from common.enc import chemical_company_data
 from common.enc import building_project_info_data
 
@@ -61,6 +62,9 @@ def sign_data_proc():
     # 灾害信息员信息表
     govdata_disaster_info_officer_data.sign_table()
 
+    # 应急专家信息表
+    emergency_expert_data.sign_table()
+
     # 危化企业信息表
     chemical_company_data.sign_table()
 

+ 21 - 1
models/city_base.py

@@ -56,4 +56,24 @@ class GovdataDisasterInfoOfficer(Base):
     sign = Column(String, server_default='', default='', comment='HMACSM3数值')
 
     class Config:
-        orm_mode = True
+        orm_mode = True
+
+class EmergencyExpert(Base):
+    __tablename__ = 'emergency_expert'
+
+    id = Column(Integer, primary_key=True, autoincrement=True)
+    name = Column(String, server_default='', default='', comment='姓名')
+    area = Column(String, server_default='', default='', comment='地区')
+    type = Column(String, server_default='', default='', comment='类型')
+    company = Column(String, server_default='', default='', comment='所属公司')
+    official = Column(String, server_default='', default='', comment='职称')
+    phone = Column(String, server_default='', default='', comment='手机号码')
+    tjsj = Column(DateTime, default=datetime.now, comment='数据创建时间')
+    gxsj = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='数据更新时间')
+    longitude = Column(Float,  comment='经度')
+    latitude = Column(Float,  comment='纬度')
+    sign = Column(String, server_default='', default='', comment='HMACSM3数值')
+
+    class Config:
+        orm_mode = True
+    

+ 49 - 5
routers/api/gateway/sign_api.py

@@ -6,12 +6,54 @@ from database import get_db, get_share_db
 from sqlalchemy.orm import Session
 from utils import *
 from models import *
-from common.enc import mpfun, govdata_disaster_info_officer_data, chemical_company_data, building_project_info_data
+from common.enc import mpfun, govdata_disaster_info_officer_data, chemical_company_data, building_project_info_data, emergency_expert_data
 from exceptions import HmacException
-
+import traceback
 
 router = APIRouter()
 
+#应急专家详情
+@router.post('/v2/get_point_info_emergency_expert')
+async def getEmergencyExpertDetails(
+    request: Request,
+    body = Depends(remove_xss_json),
+    db: Session = Depends(get_db)
+):
+    try:
+        id = body['query']['id']
+        row = db.query(EmergencyExpert).filter(EmergencyExpert.id == id).first()
+        if emergency_expert_data.sign_valid_row(row) == False:
+            raise HmacException(500, "应急专家信息表验证异常,已被非法篡改")
+        
+        data = {
+            "name": row.name,
+            "area": row.area,
+            "type": row.type,
+            "company": row.company,
+            "official": row.official,
+            "phone": mpfun.dec_data(row.phone)
+        }
+
+        return {
+            'code': 0,
+            'msg': 'success',
+            'rows': [data]
+        }
+    
+    except HmacException as e:
+        return {
+            'code': 500,
+            'msg': e.msg
+        }
+
+    except Exception as e:
+        traceback.print_exc()
+
+        return {
+            'code': 410,
+            'msg': '接口对应数据库暂不支持'
+        }
+
 # 灾害信息员详情
 @router.post('/v2/get_point_info_emergency_disaster_info_officer')
 async def getEmergencyDisasterInfoOfficerDetails(
@@ -22,12 +64,12 @@ async def getEmergencyDisasterInfoOfficerDetails(
     try:
         id = body['query']['id']
         row = db.query(GovdataDisasterInfoOfficer).filter(GovdataDisasterInfoOfficer.id == id).first()
+        if govdata_disaster_info_officer_data.sign_valid_row(row) == False:
+            raise HmacException(500, "灾害信息员信息表验证异常,已被非法篡改")
+        
         info = get_model_dict(row)
         info['cellphone'] = mpfun.dec_data(info['cellphone'])
 
-        if govdata_disaster_info_officer_data.sign_valid_row(row) == False:
-            raise HmacException(500, "应急预案人员信息表验证异常,已被非法篡改")
-        
         return {
             'code': 0,
             'msg': 'success',
@@ -41,6 +83,8 @@ async def getEmergencyDisasterInfoOfficerDetails(
         }
 
     except Exception as e:
+        traceback.print_exc()
+
         return {
             'code': 410,
             'msg': '接口对应数据库暂不支持'