fixed issue #2099 , support user/passwd acl and canal admin operator
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user