fixed issue #2099 , support user/passwd acl and canal admin operator

This commit is contained in:
agapple
2019-08-26 18:16:33 +08:00
parent e376a129ed
commit 3d4dbc9a8c
54 changed files with 8518 additions and 813 deletions
+6
View File
@@ -26,5 +26,11 @@
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,83 @@
syntax = "proto3";
package com.alibaba.otter.canal.protocol;
option java_package = "com.alibaba.otter.canal.protocol";
option java_outer_classname = "AdminPacket";
option optimize_for = SPEED;
enum PacketType {
//compatible
PACKAGETYPECOMPATIBLEPROTO2 = 0;
HANDSHAKE = 1;
CLIENTAUTHENTICATION = 2;
ACK = 3;
SERVER = 4;
INSTANCE = 5;
LOG = 6;
}
message Packet {
//[default = 17];
oneof magic_number_present {
int32 magic_number = 1;
}
// [default = 1]
oneof version_present {
int32 version = 2;
};
PacketType type = 3;
bytes body = 4;
}
message Ack {
// [default = 0]
oneof error_code_present {
int32 code = 1;
}
string message = 2; // if something like compression is not supported, erorr_message will tell about it.
}
message Handshake {
// [default = "utf8"];
oneof communication_encoding_present {
string communication_encoding = 1;
}
bytes seeds = 2;
}
// client authentication
message ClientAuth {
string username = 1;
bytes password = 2; // hashed password with seeds from Handshake message
// [default = 0]
oneof net_read_timeout_present {
int32 net_read_timeout = 3; // in seconds
}
// [default = 0];
oneof net_write_timeout_present {
int32 net_write_timeout = 4; // in seconds
}
}
message ServerAdmin {
string action = 1; // check/start/stop/restart/list
}
message InstanceAdmin {
string destination = 1;
string action = 2; // check/start/stop/reload
}
message LogAdmin {
string type = 1; // canal/instance
string action = 2;
oneof destination_present {
string destination = 3;
}
oneof file_present {
string file = 4;
}
oneof count_present {
int32 count = 5; // 默认tail 100行,最大不超过4MB
}
}
@@ -630,7 +630,7 @@ public final class CanalPacket {
if (versionPresentCase_ == 2) {
return (java.lang.Integer) versionPresent_;
}
return 1;
return 0;
}
public static final int TYPE_FIELD_NUMBER = 3;
@@ -658,7 +658,7 @@ public final class CanalPacket {
if (compressionPresentCase_ == 4) {
return (java.lang.Integer) compressionPresent_;
}
return Compression.NONE_VALUE;
return 0;
}
/**
* <code>.com.alibaba.otter.canal.protocol.Compression compression = 4;</code>
@@ -1180,7 +1180,7 @@ public final class CanalPacket {
if (magicNumberPresentCase_ == 1) {
return (java.lang.Integer) magicNumberPresent_;
}
return 17;
return 0;
}
/**
* <code>int32 magic_number = 1;</code>
@@ -7731,7 +7731,7 @@ public final class CanalPacket {
if (timeoutPresentCase_ == 4) {
return (java.lang.Long) timeoutPresent_;
}
return -1L;
return 0L;
}
public static final int UNIT_FIELD_NUMBER = 5;
@@ -7746,7 +7746,7 @@ public final class CanalPacket {
if (unitPresentCase_ == 5) {
return (java.lang.Integer) unitPresent_;
}
return 2;
return 0;
}
public static final int AUTO_ACK_FIELD_NUMBER = 6;
@@ -0,0 +1,223 @@
package com.alibaba.otter.canal.protocol;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* <pre>
* 1、client
* stage1_hash = SHA1(明文密码).
* token = SHA1(scramble + SHA1(stage1_hash)) XOR stage1_hash
* 2. server
* token = SHA1(token XOR SHA1(scramble + password))
* 3. checktoken vs password
* </pre>
*
* @author agapple 2019年8月26日 下午4:58:15
* @since 1.1.4
*/
public class SecurityUtil {
public static final String scrambleGenPass(byte[] pass) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] pass1 = md.digest(pass);
md.reset();
byte[] pass2 = md.digest(pass1);
return SecurityUtil.byte2HexStr(pass2);
}
/**
* server auth check
*/
public static final boolean scrambleServerAuth(byte[] token, byte[] pass, byte[] seed)
throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(seed);
byte[] pass1 = md.digest(pass);
for (int i = 0; i < pass1.length; i++) {
pass1[i] = (byte) (token[i] ^ pass1[i]);
}
md = MessageDigest.getInstance("SHA-1");
byte[] pass2 = md.digest(pass1);
return Arrays.equals(pass, pass2);
}
public static final byte[] scramble411(byte[] pass, byte[] seed) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] pass1 = md.digest(pass);
md.reset();
byte[] pass2 = md.digest(pass1);
md.reset();
md.update(seed);
byte[] pass3 = md.digest(pass2);
for (int i = 0; i < pass3.length; i++) {
pass3[i] = (byte) (pass3[i] ^ pass1[i]);
}
return pass3;
}
/**
* bytes转换成十六进制字符串
*/
public static String byte2HexStr(byte[] b) {
StringBuilder hs = new StringBuilder();
for (int n = 0; n < b.length; n++) {
String hex = (Integer.toHexString(b[n] & 0XFF));
if (hex.length() == 1) {
hs.append("0" + hex);
} else {
hs.append(hex);
}
}
return hs.toString();
}
/**
* bytes转换成十六进制字符串
*/
public static byte[] hexStr2Bytes(String src) {
if (src == null) {
return null;
}
int offset = 0;
int length = src.length();
if (length == 0) {
return new byte[0];
}
boolean odd = length << 31 == Integer.MIN_VALUE;
byte[] bs = new byte[odd ? (length + 1) >> 1 : length >> 1];
for (int i = offset, limit = offset + length; i < limit; ++i) {
char high, low;
if (i == offset && odd) {
high = '0';
low = src.charAt(i);
} else {
high = src.charAt(i);
low = src.charAt(++i);
}
int b;
switch (high) {
case '0':
b = 0;
break;
case '1':
b = 0x10;
break;
case '2':
b = 0x20;
break;
case '3':
b = 0x30;
break;
case '4':
b = 0x40;
break;
case '5':
b = 0x50;
break;
case '6':
b = 0x60;
break;
case '7':
b = 0x70;
break;
case '8':
b = 0x80;
break;
case '9':
b = 0x90;
break;
case 'a':
case 'A':
b = 0xa0;
break;
case 'b':
case 'B':
b = 0xb0;
break;
case 'c':
case 'C':
b = 0xc0;
break;
case 'd':
case 'D':
b = 0xd0;
break;
case 'e':
case 'E':
b = 0xe0;
break;
case 'f':
case 'F':
b = 0xf0;
break;
default:
throw new IllegalArgumentException("illegal hex-string: " + src);
}
switch (low) {
case '0':
break;
case '1':
b += 1;
break;
case '2':
b += 2;
break;
case '3':
b += 3;
break;
case '4':
b += 4;
break;
case '5':
b += 5;
break;
case '6':
b += 6;
break;
case '7':
b += 7;
break;
case '8':
b += 8;
break;
case '9':
b += 9;
break;
case 'a':
case 'A':
b += 10;
break;
case 'b':
case 'B':
b += 11;
break;
case 'c':
case 'C':
b += 12;
break;
case 'd':
case 'D':
b += 13;
break;
case 'e':
case 'E':
b += 14;
break;
case 'f':
case 'F':
b += 15;
break;
default:
throw new IllegalArgumentException("illegal hex-string: " + src);
}
bs[(i - offset) >> 1] = (byte) b;
}
return bs;
}
}