|
@@ -0,0 +1,78 @@
|
|
|
+package com.nokia.sms.blacklist.message;
|
|
|
+
|
|
|
+import java.security.MessageDigest;
|
|
|
+import java.security.NoSuchAlgorithmException;
|
|
|
+import java.text.DateFormat;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Date;
|
|
|
+
|
|
|
+import com.nokia.sms.blacklist.BlacklistTcpClient;
|
|
|
+import com.nokia.sms.blacklist.exception.ParseException;
|
|
|
+
|
|
|
+public class SmitBindMessage {
|
|
|
+ private final MessageHeader header;
|
|
|
+
|
|
|
+ private static BlacklistTcpClient CLIENT;
|
|
|
+
|
|
|
+ private static final DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
|
|
|
+
|
|
|
+ public SmitBindMessage(BlacklistTcpClient client) {
|
|
|
+ // 初始化header
|
|
|
+ header = new MessageHeader();
|
|
|
+ // header 12 + body 16+20 所以是48字节
|
|
|
+ header.setMessageLength(48);
|
|
|
+ header.setCommandId(CommandId.SMIT_BIND);
|
|
|
+ // 所有的初始连接需要从0开始
|
|
|
+ header.setSequenceNumber(0L);
|
|
|
+ SmitBindMessage.CLIENT = client;
|
|
|
+ }
|
|
|
+
|
|
|
+ public byte[] toByteArray() throws NoSuchAlgorithmException {
|
|
|
+ // 初始化
|
|
|
+ byte[] message = new byte[header.getMessageLength()];
|
|
|
+ // 填充header
|
|
|
+ System.arraycopy(header.toByteArray(), 0, message, 0, 12);
|
|
|
+
|
|
|
+ // 填充systemId
|
|
|
+ byte[] systemIdByteArray = SmitBindMessage.CLIENT.getSystemId().getBytes();
|
|
|
+ System.arraycopy(systemIdByteArray, 0, message, 12, systemIdByteArray.length);
|
|
|
+
|
|
|
+ // 填充AuthCode
|
|
|
+ String authCodeString = SmitBindMessage.CLIENT.getPassword() + dateFormat.format(new Date());
|
|
|
+ MessageDigest digest = MessageDigest.getInstance("SHA-1");
|
|
|
+ // sha1以后为20字节
|
|
|
+ System.arraycopy(digest.digest(authCodeString.getBytes()), 0, message, 28, 20);
|
|
|
+ return message;
|
|
|
+ }
|
|
|
+
|
|
|
+ public BindRespStatus parseAndResp(byte[] message) {
|
|
|
+ try {
|
|
|
+ MessageHeader header = MessageHeader.parse(message);
|
|
|
+ // 判断消息类型
|
|
|
+ if (CommandId.SMIT_BIND.equals(header.getCommandId())) {
|
|
|
+ // 获取并对比systemId
|
|
|
+ byte[] systemIdByteArray = Arrays.copyOfRange(message, 12, 28);
|
|
|
+ if (SmitBindMessage.CLIENT.getSystemId().equals(new String(systemIdByteArray).trim())) {
|
|
|
+ // 获取和判断鉴权信息
|
|
|
+ String authCodeString = SmitBindMessage.CLIENT.getPassword() + dateFormat.format(new Date());
|
|
|
+ MessageDigest digest = MessageDigest.getInstance("SHA-1");
|
|
|
+ // sha1后的本地字符串
|
|
|
+ String authCodeLocal = new String(digest.digest(authCodeString.getBytes()));
|
|
|
+ // 获取到的authCode
|
|
|
+ String authCode = new String(Arrays.copyOfRange(message, 28, 48));
|
|
|
+ if (authCodeLocal.equals(authCode)) {
|
|
|
+ return BindRespStatus.SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return BindRespStatus.AUTH_ERROR;
|
|
|
+ }
|
|
|
+ } catch (ParseException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (NoSuchAlgorithmException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return BindRespStatus.STRUCTURE_ERROR;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|