|
@@ -17,7 +17,7 @@ from Functions import utils , DataComputer as DataComputer , ipcall , flaskDBUti
|
|
|
from Functions.DButilsFunction import flightDB , judge_bc as Judge_bc , initFlightDatabase as InitFlightDatabase , \
|
|
|
insertTaskDataToTable , sortFlighttime , sortFlighttime2 , checkTFUairplane , \
|
|
|
createWorkloadtablesFromPg as CreateWorkloadtablesFromPg , \
|
|
|
- checkFlightAlert , dingdingDelete_flight , dingdingFlightsts , dingdinginfoget , calledChecked as CalledChecked , \
|
|
|
+ checkFlightAlert , calledChecked as CalledChecked , \
|
|
|
infoConfirm as InfoConfirm , infoConfirm3 as InfoConfirm3 , infoConfirm2 as InfoConfirm2 , \
|
|
|
maintainAuthCheck as MaintainAuthCheck , \
|
|
|
checkLoadSingal as CheckLoadSingal , changepassword as Changepassword , postgresql_local , \
|
|
@@ -113,7 +113,7 @@ VinB2="328"
|
|
|
VinB3="328"
|
|
|
|
|
|
SIGNATURE_KEY=b"secret-key-neverout" # 用于请求签名的密钥
|
|
|
-REQUEST_VALID_DURATION = 10 # 请求有效期(秒)
|
|
|
+REQUEST_VALID_DURATION = 30 # 请求有效期(秒)
|
|
|
# 获取本地IP地址
|
|
|
def get_local_ip():
|
|
|
try:
|
|
@@ -125,7 +125,31 @@ def get_local_ip():
|
|
|
except:
|
|
|
return socket.gethostbyname(socket.gethostname())
|
|
|
|
|
|
+def generate_signature() :
|
|
|
+ """
|
|
|
+ 生成请求签名
|
|
|
+ :param data: 请求的JSON数据
|
|
|
+ :return: (时间戳, 签名)
|
|
|
+ """
|
|
|
+
|
|
|
+ # 1. 获取当前Unix时间戳(秒级)
|
|
|
+ timestamp = str(int(time.time()))
|
|
|
+ data = { "timestamp" : timestamp }
|
|
|
+ # 2. 对数据进行JSON序列化,确保排序一致
|
|
|
+ # sort_keys=True 保证键的顺序一致,否则签名会不匹配
|
|
|
+ data_str = json.dumps(data , sort_keys = True).encode('utf-8')
|
|
|
+
|
|
|
+ # 3. 组合数据:数据字符串 + | + 时间戳
|
|
|
+ signature_base = f"{data_str.decode('utf-8')}|{timestamp}".encode('utf-8')
|
|
|
|
|
|
+ # 4. 使用HMAC-SHA256算法生成签名
|
|
|
+ signature = hmac.new(
|
|
|
+ SIGNATURE_KEY ,
|
|
|
+ signature_base ,
|
|
|
+ hashlib.sha256
|
|
|
+ ).hexdigest()
|
|
|
+
|
|
|
+ return timestamp , signature
|
|
|
def verify_request(timestamp , signature , data) :
|
|
|
"""验证请求的合法性"""
|
|
|
try :
|
|
@@ -160,8 +184,14 @@ def verify_request(timestamp , signature , data) :
|
|
|
def check_a_availability():
|
|
|
"""检查A服务器的可用性"""
|
|
|
try:
|
|
|
- ip = "http://" + mainseverip + ":5001/static/health"
|
|
|
- response = requests.get(ip, timeout=5)
|
|
|
+ timestamp, signature = generate_signature()
|
|
|
+ header = {'Content-Type' : 'application/json',
|
|
|
+ 'X-Timestamp' : timestamp,
|
|
|
+ 'X-Signature' : signature,
|
|
|
+ }
|
|
|
+ response = requests.get("http://" + mainseverip + ':5001/static/health' , headers = header)
|
|
|
+ #ip = "http://" + mainseverip + ":5001/static/health"
|
|
|
+ #response = requests.get(ip, timeout=5)
|
|
|
return response.status_code != 200 #看是否连接成功
|
|
|
except Exception as e:
|
|
|
return True #出问题了
|
|
@@ -306,15 +336,20 @@ def get_access_token():
|
|
|
'''
|
|
|
|
|
|
# 健康检查接口,暂时不做要求,后期做白名单或者删掉
|
|
|
-@app.route('/static/health')
|
|
|
+@app.route('/static/health') #签名检测
|
|
|
def health_check():
|
|
|
- try:
|
|
|
- # 检查数据库连接
|
|
|
- db = flaskDBUtils.flaskDB(host=dbhost,port=dbport,user=dbuser,password=dbpassword,database=database)
|
|
|
- db.close()
|
|
|
- return jsonify({"status": "ok", "msg":{"timestamp": datetime.datetime.now().isoformat()}}), 200
|
|
|
- except Exception as e:
|
|
|
- return jsonify({"status": "error", "msg": str(e)}), 500
|
|
|
+ signature = request.headers.get('X-Signature')
|
|
|
+ timestamp = request.headers.get('X-Timestamp')
|
|
|
+ if verify_request(timestamp,signature, {"timestamp": timestamp}):
|
|
|
+ try:
|
|
|
+ # 检查数据库连接
|
|
|
+ db = flaskDBUtils.flaskDB(host=dbhost,port=dbport,user=dbuser,password=dbpassword,database=database)
|
|
|
+ db.close()
|
|
|
+ return jsonify({"status": "ok", "msg":{"timestamp": datetime.datetime.now().isoformat()}}), 200
|
|
|
+ except Exception as e:
|
|
|
+ return jsonify({"status": "error", "msg": str(e)}), 500
|
|
|
+ else:
|
|
|
+ return jsonify({"status": "error", "msg": "签名验证未通过"}), 401
|
|
|
@app.route("/map/<selectedtime>/<token>")
|
|
|
def index(selectedtime,token):
|
|
|
return render_template("map.html", selectedtime=selectedtime,token=token)
|
|
@@ -346,7 +381,7 @@ def loginTable():
|
|
|
#print(f'处理时间:{t3-t2}')
|
|
|
return jsonify(msg=(datetime.datetime.now(),"[%s]%s尝试登录失败" %(remote_addr,username)), data=res1), 401
|
|
|
else:
|
|
|
- return jsonify(msg=(datetime.datetime.now(),"[%s]%s尝试登录失败" ), data={"返回值":"fail"}), 401
|
|
|
+ return jsonify(msg=(datetime.datetime.now(),"签名验证未通过" ), data={"返回值":"fail"}), 401
|
|
|
|
|
|
@app.route('/static/remoteCheck', methods=['POST']) #操作系统版本验证 #签名检测
|
|
|
def remoteCheck():
|
|
@@ -363,7 +398,7 @@ def remoteCheck():
|
|
|
return jsonify(res)
|
|
|
else:
|
|
|
res = { "返回值" : "签名验证未通过" }
|
|
|
- return jsonify(res)
|
|
|
+ return jsonify(res), 401
|
|
|
|
|
|
@app.route('/static/remoteCheck2', methods=['POST']) #电子白板系统版本验证#签名检测
|
|
|
def remoteCheck2():
|
|
@@ -380,7 +415,7 @@ def remoteCheck2():
|
|
|
return jsonify(res)
|
|
|
else:
|
|
|
res = { "返回值" : "签名验证未通过" }
|
|
|
- return jsonify(res)
|
|
|
+ return jsonify(res), 401
|
|
|
|
|
|
@app.route('/bakupdata')#签名检测
|
|
|
def bakupdata():
|
|
@@ -394,7 +429,7 @@ def bakupdata():
|
|
|
print(datetime.datetime.now(), "[%s]5分钟间隔自动备份"%remote_addr)
|
|
|
return jsonify(status="ok")
|
|
|
else:
|
|
|
- return jsonify(status="fail",msg= '签名验证失败')
|
|
|
+ return jsonify(status="fail",msg= '签名验证失败'), 401
|
|
|
|
|
|
@app.route('/postgresql')#签名检测
|
|
|
def postgresql():
|
|
@@ -434,7 +469,7 @@ def postgresql():
|
|
|
print(traceback.format_exc())
|
|
|
return jsonify(status="fail", msg=("[返回为fail]远端显示中心计算请求失败"))
|
|
|
else:
|
|
|
- return jsonify(status="fail",msg= '签名验证失败')
|
|
|
+ return jsonify(status="fail",msg= '签名验证失败'), 401
|
|
|
|
|
|
@app.route('/getFlightData2', methods=['POST'])#签名检测
|
|
|
async def getFlightData2():
|
|
@@ -523,9 +558,9 @@ async def getFlightData2():
|
|
|
checkTFUairplane(fdb,onlinefileDB)
|
|
|
checkWorkerlaod_new(fdb,workLoad,nowDayStr,nowDay_1)
|
|
|
checkFlightAlert(fdb, singlePeopleNotice)
|
|
|
- dingdingDelete_flight(fdb)
|
|
|
- dingdingFlightsts(fdb)
|
|
|
- dingdinginfoget(fdb)
|
|
|
+ #dingdingDelete_flight(fdb)
|
|
|
+ #dingdingFlightsts(fdb)
|
|
|
+ #dingdinginfoget(fdb)
|
|
|
CalledChecked(fdb)
|
|
|
if Online_flight_sts == "1" and SameDatabase == "0":
|
|
|
res = UpdatePeopleScheduleFromOnline(fdb, onlinefileDB)
|
|
@@ -556,9 +591,9 @@ async def getFlightData2():
|
|
|
checkTFUairplane(fdb,onlinefileDB)
|
|
|
checkWorkerlaod_new(fdb,workLoad,nowDayStr,nowDay_1)
|
|
|
checkFlightAlert(fdb, singlePeopleNotice)
|
|
|
- dingdingDelete_flight(fdb)
|
|
|
- dingdingFlightsts(fdb)
|
|
|
- dingdinginfoget(fdb)
|
|
|
+ #dingdingDelete_flight(fdb)
|
|
|
+ #dingdingFlightsts(fdb)
|
|
|
+ #dingdinginfoget(fdb)
|
|
|
CalledChecked(fdb)
|
|
|
flaskDBUtils.insertinfolog(db,nowStr,str(taskflightdata['code']))
|
|
|
if Online_flight_sts == "1":
|
|
@@ -578,9 +613,9 @@ async def getFlightData2():
|
|
|
checkTFUairplane(fdb,onlinefileDB)
|
|
|
checkWorkerlaod_new(fdb,workLoad,nowDayStr,nowDay_1)
|
|
|
checkFlightAlert(fdb, singlePeopleNotice)
|
|
|
- dingdingDelete_flight(fdb)
|
|
|
- dingdingFlightsts(fdb)
|
|
|
- dingdinginfoget(fdb)
|
|
|
+ #dingdingDelete_flight(fdb)
|
|
|
+ #dingdingFlightsts(fdb)
|
|
|
+ #dingdinginfoget(fdb)
|
|
|
CalledChecked(fdb)
|
|
|
if Online_flight_sts == "1" and SameDatabase == "0":
|
|
|
res=UpdatePeopleScheduleFromOnline(fdb, onlinefileDB)
|
|
@@ -655,7 +690,7 @@ async def getFlightData2():
|
|
|
else:
|
|
|
return "200"
|
|
|
else:
|
|
|
- return jsonify(code='未登录',msg= '签名验证失败')
|
|
|
+ return jsonify(code='未登录',msg= '签名验证失败'), 401
|
|
|
@app.route('/static/linktest')#签名检测
|
|
|
def linktest():
|
|
|
signature = request.headers.get('X-Signature')
|
|
@@ -663,7 +698,7 @@ def linktest():
|
|
|
if verify_request(timestamp , signature , { "timestamp": timestamp}) :
|
|
|
return jsonify(status="ok", msg="linktest")
|
|
|
else:
|
|
|
- return jsonify(status="fail",msg= '签名验证失败')
|
|
|
+ return jsonify(status="fail",msg= '签名验证失败'), 401
|
|
|
|
|
|
@app.route('/checkLogin')#签名检测
|
|
|
def checkLogin():
|
|
@@ -696,7 +731,7 @@ def checkLogin():
|
|
|
else:
|
|
|
return jsonify(code="0", msg="登录超时")
|
|
|
else:
|
|
|
- return jsonify(code="0",msg= '签名验证失败')
|
|
|
+ return jsonify(code="0",msg= '签名验证失败'), 401
|
|
|
@app.route('/table')#签名检测
|
|
|
def table():
|
|
|
|
|
@@ -720,7 +755,7 @@ def table():
|
|
|
else:
|
|
|
return jsonify({"data":[],'msg':"无数据"})
|
|
|
else:
|
|
|
- return jsonify({"data":[],'msg':"签名验证失败"})
|
|
|
+ return jsonify({"data":[],'msg':"签名验证失败"}), 401
|
|
|
|
|
|
#------------------------------------------------------------------------------------------------
|
|
|
#受保护的路由
|