From 2daa59d78ce206308c35294da04cffe5e340143a Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期四, 23 五月 2024 17:10:45 +0800
Subject: [PATCH] 支持彻底关闭文档页面 + 修复云端录像偶现callId错误问题

---
 src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java     |   15 +++----
 src/main/resources/all-application.yml                                           |    2 +
 src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java   |    6 +++
 src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java         |    2 
 数据库/2.7.1/初始化-postgresql-kingbase-2.7.1.sql                                      |    1 
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java           |   24 +----------
 src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java                    |    2 +
 src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java                        |   10 +++++
 src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java            |    7 +++
 src/main/resources/application-dev.yml                                           |    3 -
 src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnRecordMp4HookParam.java |   10 +++++
 src/main/java/com/genersoft/iot/vmp/utils/MediaServerUtils.java                  |   26 +++++++++++++
 数据库/2.7.1/初始化-mysql-2.7.1.sql                                                    |    1 
 13 files changed, 76 insertions(+), 33 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java
index 0a472f8..45f9a2f 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java
@@ -7,6 +7,7 @@
 import io.swagger.v3.oas.models.info.Info;
 import io.swagger.v3.oas.models.info.License;
 import io.swagger.v3.oas.models.security.SecurityScheme;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.core.annotation.Order;
 import org.springdoc.core.GroupedOpenApi;
 import org.springframework.beans.factory.annotation.Value;
@@ -18,6 +19,7 @@
  */
 @Configuration
 @Order(1)
+@ConditionalOnProperty(value = "user-settings.doc-enable", havingValue = "true", matchIfMissing = true)
 public class SpringDocConfig {
 
     @Value("${doc.enabled: true}")
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
index a9b17ae..96253d6 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
@@ -54,6 +54,8 @@
     private Boolean deviceStatusNotify = Boolean.TRUE;
     private Boolean useCustomSsrcForParentInvite = Boolean.TRUE;
 
+    private Boolean docEnable = Boolean.TRUE;
+
     private String serverId = "000000";
 
     private String thirdPartyGBIdReg = "[\\s\\S]*";
@@ -315,4 +317,12 @@
     public void setRegisterKeepIntDialog(boolean registerKeepIntDialog) {
         this.registerKeepIntDialog = registerKeepIntDialog;
     }
+
+    public Boolean getDocEnable() {
+        return docEnable;
+    }
+
+    public void setDocEnable(Boolean docEnable) {
+        this.docEnable = docEnable;
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java
index f45f89a..ce24e98 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java
@@ -35,10 +35,16 @@
 
         // 蹇界暐鐧诲綍璇锋眰鐨則oken楠岃瘉
         String requestURI = request.getRequestURI();
+        System.out.println(requestURI);
+        if ((requestURI.startsWith("/doc.html") || requestURI.startsWith("/swagger-ui") ) && !userSetting.getDocEnable()) {
+            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+            return;
+        }
         if (requestURI.equalsIgnoreCase("/api/user/login")) {
             chain.doFilter(request, response);
             return;
         }
+
         if (!userSetting.isInterfaceAuthentication()) {
             UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(null, null, new ArrayList<>() );
             SecurityContextHolder.getContext().setAuthentication(token);
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
index ad959d6..55f9383 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
@@ -117,7 +117,7 @@
                 .authorizeRequests()
                 .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
                 .antMatchers(userSetting.getInterfaceAuthenticationExcludes().toArray(new String[0])).permitAll()
-                .antMatchers("/api/user/login", "/index/hook/**", "/swagger-ui/**", "/doc.html").permitAll()
+                .antMatchers("/api/user/login", "/index/hook/**", "/swagger-ui/**", "/doc.html#/**").permitAll()
                 .anyRequest().authenticated()
                 // 寮傚父澶勭悊鍣�
                 .and()
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
index 6968236..b639048 100755
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -29,6 +29,7 @@
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
 import com.genersoft.iot.vmp.utils.DateUtil;
+import com.genersoft.iot.vmp.utils.MediaServerUtils;
 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
 import com.genersoft.iot.vmp.vmanager.bean.OtherPsSendInfo;
 import com.genersoft.iot.vmp.vmanager.bean.OtherRtpSendInfo;
@@ -47,7 +48,6 @@
 import javax.sip.InvalidArgumentException;
 import javax.sip.SipException;
 import java.text.ParseException;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
@@ -179,7 +179,7 @@
             }
         });
         if (!"rtp".equals(param.getApp())) {
-            Map<String, String> paramMap = urlParamToMap(param.getParams());
+            Map<String, String> paramMap = MediaServerUtils.urlParamToMap(param.getParams());
             StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(param.getApp(), param.getStream());
             if (streamAuthorityInfo != null && streamAuthorityInfo.getCallId() != null && !streamAuthorityInfo.getCallId().equals(paramMap.get("callId"))) {
                 return new HookResult(401, "Unauthorized");
@@ -220,7 +220,7 @@
                     logger.info("鎺ㄦ祦閴存潈澶辫触锛� 缂哄皯蹇呰鍙傛暟锛歴ign=md5(user琛ㄧ殑pushKey)");
                     return new HookResultForOnPublish(401, "Unauthorized");
                 }
-                Map<String, String> paramMap = urlParamToMap(param.getParams());
+                Map<String, String> paramMap = MediaServerUtils.urlParamToMap(param.getParams());
                 String sign = paramMap.get("sign");
                 if (sign == null) {
                     logger.info("鎺ㄦ祦閴存潈澶辫触锛� 缂哄皯蹇呰鍙傛暟锛歴ign=md5(user琛ㄧ殑pushKey)");
@@ -898,23 +898,5 @@
         });
 
         return HookResult.SUCCESS();
-    }
-
-    private Map<String, String> urlParamToMap(String params) {
-        HashMap<String, String> map = new HashMap<>();
-        if (ObjectUtils.isEmpty(params)) {
-            return map;
-        }
-        String[] paramsArray = params.split("&");
-        if (paramsArray.length == 0) {
-            return map;
-        }
-        for (String param : paramsArray) {
-            String[] paramArray = param.split("=");
-            if (paramArray.length == 2) {
-                map.put(paramArray[0], paramArray[1]);
-            }
-        }
-        return map;
     }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnRecordMp4HookParam.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnRecordMp4HookParam.java
index d52165e..deeeff4 100755
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnRecordMp4HookParam.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnRecordMp4HookParam.java
@@ -15,6 +15,7 @@
     private String vhost;
     private long start_time;
     private double time_len;
+    private String params;
 
     public String getApp() {
         return app;
@@ -96,6 +97,14 @@
         this.time_len = time_len;
     }
 
+    public String getParams() {
+        return params;
+    }
+
+    public void setParams(String params) {
+        this.params = params;
+    }
+
     @Override
     public String toString() {
         return "OnRecordMp4HookParam{" +
@@ -109,6 +118,7 @@
                 ", vhost='" + vhost + '\'' +
                 ", start_time=" + start_time +
                 ", time_len=" + time_len +
+                ", params=" + params +
                 '}';
     }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java b/src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java
index 771e4c8..c6e84de 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java
@@ -1,6 +1,9 @@
 package com.genersoft.iot.vmp.service.bean;
 
 import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRecordMp4HookParam;
+import com.genersoft.iot.vmp.utils.MediaServerUtils;
+
+import java.util.Map;
 
 /**
  * 浜戠褰曞儚鏁版嵁
@@ -88,6 +91,10 @@
         cloudRecordItem.setMediaServerId(param.getMediaServerId());
         cloudRecordItem.setTimeLen((long) param.getTime_len() * 1000);
         cloudRecordItem.setEndTime((param.getStart_time() + (long)param.getTime_len()) * 1000);
+        Map<String, String> paramsMap = MediaServerUtils.urlParamToMap(param.getParams());
+        if (paramsMap.get("callId") != null) {
+            cloudRecordItem.setCallId(paramsMap.get("callId"));
+        }
         return cloudRecordItem;
     }
 
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java
index 6e501e2..7c8f6a7 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java
@@ -7,7 +7,6 @@
 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
 import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
-import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
 import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRecordMp4HookParam;
 import com.genersoft.iot.vmp.service.ICloudRecordService;
 import com.genersoft.iot.vmp.service.IMediaServerService;
@@ -26,8 +25,12 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.time.*;
-import java.util.*;
+import java.time.LocalDate;
+import java.time.ZoneOffset;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 @Service
 @DS("share")
@@ -102,11 +105,7 @@
     @Override
     public void addRecord(OnRecordMp4HookParam param) {
         CloudRecordItem cloudRecordItem = CloudRecordItem.getInstance(param);
-        StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(param.getApp(), param.getStream());
-        if (streamAuthorityInfo != null) {
-            cloudRecordItem.setCallId(streamAuthorityInfo.getCallId());
-        }
-        logger.info("[娣诲姞褰曞儚璁板綍] {}/{} 鏂囦欢澶у皬锛歿}, 鏃堕暱锛� {}绉�", param.getApp(), param.getStream(), param.getFile_size(),param.getTime_len());
+        logger.info("[娣诲姞褰曞儚璁板綍] {}/{}, callId: {}, 鏂囦欢澶у皬锛歿}, 鏃堕暱锛� {}绉�", param.getApp(), param.getStream(),cloudRecordItem.getCallId(), param.getFile_size(),param.getTime_len());
         cloudRecordServiceMapper.add(cloudRecordItem);
     }
 
diff --git a/src/main/java/com/genersoft/iot/vmp/utils/MediaServerUtils.java b/src/main/java/com/genersoft/iot/vmp/utils/MediaServerUtils.java
new file mode 100644
index 0000000..bb57547
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/utils/MediaServerUtils.java
@@ -0,0 +1,26 @@
+package com.genersoft.iot.vmp.utils;
+
+import org.springframework.util.ObjectUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class MediaServerUtils {
+    public static Map<String, String> urlParamToMap(String params) {
+        HashMap<String, String> map = new HashMap<>();
+        if (ObjectUtils.isEmpty(params)) {
+            return map;
+        }
+        String[] paramsArray = params.split("&");
+        if (paramsArray.length == 0) {
+            return map;
+        }
+        for (String param : paramsArray) {
+            String[] paramArray = param.split("=");
+            if (paramArray.length == 2) {
+                map.put(paramArray[0], paramArray[1]);
+            }
+        }
+        return map;
+    }
+}
diff --git a/src/main/resources/all-application.yml b/src/main/resources/all-application.yml
index e616187..f2fd504 100644
--- a/src/main/resources/all-application.yml
+++ b/src/main/resources/all-application.yml
@@ -241,6 +241,8 @@
     register-again-after-time: 60
     # 鍥芥爣缁鏂瑰紡锛宼rue涓虹画璁紝姣忔娉ㄥ唽鍦ㄥ悓涓�涓細璇濋噷锛宖alse涓洪噸鏂版敞鍐岋紝姣忔浣跨敤鏂扮殑浼氳瘽
     register-keep-int-dialog: false
+    # 寮�鍚帴鍙f枃妗i〉闈€�� 榛樿寮�鍚紝鐢熶骇鐜寤鸿鍏抽棴锛岄亣鍒皊wagger鐩稿叧鐨勬紡娲炴椂涔熷彲浠ュ叧闂�
+    doc-enable: true
     # 璺ㄥ煙閰嶇疆锛屼笉閰嶇疆姝ら」鍒欏厑璁告墍鏈夎法鍩熻姹傦紝閰嶇疆鍚庡垯鍙厑璁搁厤缃殑椤甸潰鐨勫湴鍧�璇锋眰锛� 鍙互閰嶇疆澶氫釜
     allowed-origins:
         - http://localhost:8008
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 5be3036..bce9118 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -110,7 +110,4 @@
   auto-apply-play: true
   # 璁惧/閫氶亾鐘舵�佸彉鍖栨椂鍙戦�佹秷鎭�
   device-status-notify: true
-# [鍙�塢 鏃ュ織閰嶇疆, 涓�鑸笉闇�瑕佹敼
-logging:
-  config: classpath:logback-spring.xml
 
diff --git "a/\346\225\260\346\215\256\345\272\223/2.7.1/\345\210\235\345\247\213\345\214\226-mysql-2.7.1.sql" "b/\346\225\260\346\215\256\345\272\223/2.7.1/\345\210\235\345\247\213\345\214\226-mysql-2.7.1.sql"
index 6d7864f..ee828f4 100644
--- "a/\346\225\260\346\215\256\345\272\223/2.7.1/\345\210\235\345\247\213\345\214\226-mysql-2.7.1.sql"
+++ "b/\346\225\260\346\215\256\345\272\223/2.7.1/\345\210\235\345\247\213\345\214\226-mysql-2.7.1.sql"
@@ -166,6 +166,7 @@
                                   hook_alive_interval integer,
                                   record_path character varying(255),
                                   record_day integer default 7,
+                                  transcode_suffix character varying(255),
                                   constraint uk_media_server_unique_ip_http_port unique (ip, http_port)
 );
 
diff --git "a/\346\225\260\346\215\256\345\272\223/2.7.1/\345\210\235\345\247\213\345\214\226-postgresql-kingbase-2.7.1.sql" "b/\346\225\260\346\215\256\345\272\223/2.7.1/\345\210\235\345\247\213\345\214\226-postgresql-kingbase-2.7.1.sql"
index c81ca31..86a63d9 100644
--- "a/\346\225\260\346\215\256\345\272\223/2.7.1/\345\210\235\345\247\213\345\214\226-postgresql-kingbase-2.7.1.sql"
+++ "b/\346\225\260\346\215\256\345\272\223/2.7.1/\345\210\235\345\247\213\345\214\226-postgresql-kingbase-2.7.1.sql"
@@ -166,6 +166,7 @@
                                   hook_alive_interval integer,
                                   record_path character varying(255),
                                   record_day integer default 7,
+                                  transcode_suffix character varying(255),
                                   constraint uk_media_server_unique_ip_http_port unique (ip, http_port)
 );
 

--
Gitblit v1.8.0