From abd569d79a346d9066c4b239dbc452861b26a6cb Mon Sep 17 00:00:00 2001 From: 64850858 <648540858@qq.com> Date: 星期二, 08 六月 2021 14:43:03 +0800 Subject: [PATCH] 添加注册失败时回复403避免陷入401循环 --- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java | 1 src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java | 4 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java | 118 +++++++++++++++-------------- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java | 6 src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java | 55 +++++++++++++ src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java | 2 6 files changed, 124 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java index 60100e1..f61b019 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java @@ -241,4 +241,59 @@ return mdString.equals(response); } + + public static void main(String[] args) throws NoSuchAlgorithmException { + String realm = "4401000000"; + String username = "44010000001110008008"; + + + String nonce = "0074b397f86fc263b1b7f9eb72553267"; + String uri = "sip:44010000002000000001@4401000000"; + // qop 淇濇姢璐ㄩ噺 鍖呭惈auth锛堥粯璁ょ殑锛夊拰auth-int锛堝鍔犱簡鎶ユ枃瀹屾暣鎬ф娴嬶級涓ょ绛栫暐 + String qop = null; + + // 瀹㈡埛绔殢鏈烘暟锛岃繖鏄竴涓笉閫忔槑鐨勫瓧绗︿覆鍊硷紝鐢卞鎴风鎻愪緵锛屽苟涓斿鎴风鍜屾湇鍔″櫒閮戒細浣跨敤锛屼互閬垮厤鐢ㄦ槑鏂囨枃鏈�� + // 杩欎娇寰楀弻鏂归兘鍙互鏌ラ獙瀵规柟鐨勮韩浠斤紝骞跺娑堟伅鐨勫畬鏁存�ф彁渚涗竴浜涗繚鎶� + //String cNonce = authHeader.getCNonce(); + + // nonce璁℃暟鍣紝鏄竴涓�16杩涘埗鐨勬暟鍊硷紝琛ㄧず鍚屼竴nonce涓嬪鎴风鍙戦�佸嚭璇锋眰鐨勬暟閲� + int nc = -1; + String ncStr = new DecimalFormat("00000000").format(nc); +// String ncStr = new DecimalFormat("00000000").format(Integer.parseInt(nc + "", 16)); + MessageDigest messageDigest = MessageDigest.getInstance(DEFAULT_ALGORITHM); + String A1 = username + ":" + realm + ":" + "crservice@123"; + String A2 = "REGISTER" + ":" + uri.toString(); + byte mdbytes[] = messageDigest.digest(A1.getBytes()); + String HA1 = toHexString(mdbytes); + System.out.println("A1: " + A1); + System.out.println("A2: " + A2); + + mdbytes = messageDigest.digest(A2.getBytes()); + String HA2 = toHexString(mdbytes); + System.out.println("HA1: " + HA1); + System.out.println("HA2: " + HA2); + String cnonce = null; + System.out.println("nonce: " + nonce); + System.out.println("nc: " + ncStr); + System.out.println("cnonce: " + cnonce); + System.out.println("qop: " + qop); + String KD = HA1 + ":" + nonce; + + if (qop != null && qop.equals("auth") ) { + if (nc != -1) { + KD += ":" + ncStr; + } + if (cnonce != null) { + KD += ":" + cnonce; + } + KD += ":" + qop; + } + KD += ":" + HA2; + System.out.println("KD: " + KD); + mdbytes = messageDigest.digest(KD.getBytes()); + String mdString = toHexString(mdbytes); + System.out.println("mdString: " + mdString); + String response = "fdb1608a7a3b96f0598f40b8ba78d6a9"; + System.out.println("response: " + response); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java index 64be7ef..37cf1cd 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java @@ -89,7 +89,7 @@ } // 鏈惡甯︽巿鏉冨ご鎴栬�呭瘑鐮侀敊璇� 鍥炲401 - if (authorhead == null || !passwordCorrect) { + if (authorhead == null ) { if (authorhead == null) { logger.info("[{}] 鏈惡甯︽巿鏉冨ご 鍥炲401", requestAddress); @@ -98,65 +98,71 @@ } response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request); new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getSipDomain()); - } - // 鎼哄甫鎺堟潈澶村苟涓斿瘑鐮佹纭� - else if (passwordCorrect) { - response = getMessageFactory().createResponse(Response.OK, request); - // 娣诲姞date澶� - SIPDateHeader dateHeader = new SIPDateHeader(); - // 浣跨敤鑷繁淇敼鐨� - WvpSipDate wvpSipDate = new WvpSipDate(Calendar.getInstance(Locale.ENGLISH).getTimeInMillis()); - dateHeader.setDate(wvpSipDate); - response.addHeader(dateHeader); + }else { + if (!passwordCorrect){ + // 娉ㄥ唽澶辫触 + response = getMessageFactory().createResponse(Response.FORBIDDEN, request); + response.setReasonPhrase("wrong password"); + }else { + // 鎼哄甫鎺堟潈澶村苟涓斿瘑鐮佹纭� + response = getMessageFactory().createResponse(Response.OK, request); + // 娣诲姞date澶� + SIPDateHeader dateHeader = new SIPDateHeader(); + // 浣跨敤鑷繁淇敼鐨� + WvpSipDate wvpSipDate = new WvpSipDate(Calendar.getInstance(Locale.ENGLISH).getTimeInMillis()); + dateHeader.setDate(wvpSipDate); + response.addHeader(dateHeader); - ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME); - if (expiresHeader == null) { - response = getMessageFactory().createResponse(Response.BAD_REQUEST, request); - getServerTransaction(evt).sendResponse(response); - return; - } - // 娣诲姞Contact澶� - response.addHeader(request.getHeader(ContactHeader.NAME)); - // 娣诲姞Expires澶� - response.addHeader(request.getExpires()); - - // 鑾峰彇鍒伴�氫俊鍦板潃绛変俊鎭� - ViaHeader viaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); - String received = viaHeader.getReceived(); - int rPort = viaHeader.getRPort(); - // 瑙f瀽鏈湴鍦板潃鏇夸唬 - if (StringUtils.isEmpty(received) || rPort == -1) { - received = viaHeader.getHost(); - rPort = viaHeader.getPort(); - } - // - - if (device == null) { - device = new Device(); - device.setStreamMode("UDP"); - device.setDeviceId(deviceId); - } - device.setIp(received); - device.setPort(rPort); - device.setHostAddress(received.concat(":").concat(String.valueOf(rPort))); - // 娉ㄩ攢鎴愬姛 - if (expiresHeader.getExpires() == 0) { - registerFlag = 2; - } - // 娉ㄥ唽鎴愬姛 - else { - device.setExpires(expiresHeader.getExpires()); - registerFlag = 1; - // 鍒ゆ柇TCP杩樻槸UDP - boolean isTcp = false; - ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); - String transport = reqViaHeader.getTransport(); - if (transport.equals("TCP")) { - isTcp = true; + ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME); + if (expiresHeader == null) { + response = getMessageFactory().createResponse(Response.BAD_REQUEST, request); + getServerTransaction(evt).sendResponse(response); + return; } - device.setTransport(isTcp ? "TCP" : "UDP"); + // 娣诲姞Contact澶� + response.addHeader(request.getHeader(ContactHeader.NAME)); + // 娣诲姞Expires澶� + response.addHeader(request.getExpires()); + + // 鑾峰彇鍒伴�氫俊鍦板潃绛変俊鎭� + ViaHeader viaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); + String received = viaHeader.getReceived(); + int rPort = viaHeader.getRPort(); + // 瑙f瀽鏈湴鍦板潃鏇夸唬 + if (StringUtils.isEmpty(received) || rPort == -1) { + received = viaHeader.getHost(); + rPort = viaHeader.getPort(); + } + // + + if (device == null) { + device = new Device(); + device.setStreamMode("UDP"); + device.setDeviceId(deviceId); + } + device.setIp(received); + device.setPort(rPort); + device.setHostAddress(received.concat(":").concat(String.valueOf(rPort))); + // 娉ㄩ攢鎴愬姛 + if (expiresHeader.getExpires() == 0) { + registerFlag = 2; + } + // 娉ㄥ唽鎴愬姛 + else { + device.setExpires(expiresHeader.getExpires()); + registerFlag = 1; + // 鍒ゆ柇TCP杩樻槸UDP + boolean isTcp = false; + ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); + String transport = reqViaHeader.getTransport(); + if (transport.equals("TCP")) { + isTcp = true; + } + device.setTransport(isTcp ? "TCP" : "UDP"); + } } } + getServerTransaction(evt).sendResponse(response); // 娉ㄥ唽鎴愬姛 // 淇濆瓨鍒皉edis diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java index 09fec81..f9171c3 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java @@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.conf.MediaConfig; -import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import com.genersoft.iot.vmp.service.IStreamProxyService; diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java index 270a632..32cb49b 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java @@ -41,7 +41,7 @@ private String streamIp; - private long updateTime; + private String updateTime; @JSONField(name = "hls.fileBufSize") private String hlsFileBufSize; @@ -732,11 +732,11 @@ this.shellPhell = shellPhell; } - public long getUpdateTime() { + public String getUpdateTime() { return updateTime; } - public void setUpdateTime(long updateTime) { + public void setUpdateTime(String updateTime) { this.updateTime = updateTime; } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java index 6b3bd1c..0be9b19 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java @@ -24,7 +24,7 @@ @Update(value = {" <script>" + "UPDATE device_channel " + - "SET updateTime=datetime('now','localtime'))" + + "SET updateTime=datetime('now','localtime')" + "<if test=\"name != null\">, name='${name}'</if>" + "<if test=\"manufacture != null\">, manufacture='${manufacture}'</if>" + "<if test=\"model != null\">, model='${model}'</if>" + diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java index 0318772..1c6409f 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java @@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.text.SimpleDateFormat; import java.util.*; @SuppressWarnings("rawtypes") @@ -22,6 +23,7 @@ @Autowired private DeviceChannelMapper deviceChannelMapper; + private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 寮�濮嬫挱鏀炬椂灏嗘祦瀛樺叆redis @@ -91,7 +93,7 @@ */ @Override public boolean updateMediaInfo(ZLMServerConfig ZLMServerConfig) { - ZLMServerConfig.setUpdateTime(System.currentTimeMillis()); + ZLMServerConfig.setUpdateTime(format.format(new Date(System.currentTimeMillis()))); return redis.set(VideoManagerConstants.MEDIA_SERVER_PREFIX, ZLMServerConfig); } -- Gitblit v1.8.0