virtual thread is good
This commit is contained in:
@@ -6,8 +6,6 @@
|
|||||||
|
|
||||||
<U>**device uuid 무조건 바꾸시오.**</U>
|
<U>**device uuid 무조건 바꾸시오.**</U>
|
||||||
|
|
||||||
자바21에 추가된 virtual thread 사용하도록 바꾸는중...
|
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||

|

|
||||||
@@ -80,6 +78,8 @@ jar 파일은 build/libs 디렉터리 안에 생성됩니다.
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
자바21 이상 필요합니다.
|
||||||
|
|
||||||
첫 로그인시에 기기등록이 필요합니다. 콘솔창에 방법 나오니 따라하세요.
|
첫 로그인시에 기기등록이 필요합니다. 콘솔창에 방법 나오니 따라하세요.
|
||||||
|
|
||||||
로그인하면 로그인 정보(토큰 등)가 email_deviceName 폴더 안에 저장됩니다. 서버 연결이 안되면 삭제하고 시도하세요.
|
로그인하면 로그인 정보(토큰 등)가 email_deviceName 폴더 안에 저장됩니다. 서버 연결이 안되면 삭제하고 시도하세요.
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ plugins {
|
|||||||
|
|
||||||
group = 'com.github.netricecake'
|
group = 'com.github.netricecake'
|
||||||
version = '1.0-SNAPSHOT'
|
version = '1.0-SNAPSHOT'
|
||||||
|
sourceCompatibility = '21'
|
||||||
|
targetCompatibility = '21'
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
manifest {
|
manifest {
|
||||||
|
|||||||
@@ -16,12 +16,10 @@ import com.github.netricecake.loco.packet.outbound.room.InfoLinkOut;
|
|||||||
import com.github.netricecake.loco.packet.outbound.message.MessageOut;
|
import com.github.netricecake.loco.packet.outbound.message.MessageOut;
|
||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import lombok.Getter;
|
|
||||||
|
|
||||||
public class LocoSocketHandlerImpl extends LocoSocketHandler {
|
public class LocoSocketHandlerImpl extends LocoSocketHandler {
|
||||||
|
|
||||||
@Getter
|
private final TalkClient client;
|
||||||
private TalkClient client;
|
|
||||||
|
|
||||||
public LocoSocketHandlerImpl(TalkClient client) {
|
public LocoSocketHandlerImpl(TalkClient client) {
|
||||||
this.client = client;
|
this.client = client;
|
||||||
@@ -41,7 +39,9 @@ public class LocoSocketHandlerImpl extends LocoSocketHandler {
|
|||||||
Member member = room.getMembers().get(in.getAuthorId());
|
Member member = room.getMembers().get(in.getAuthorId());
|
||||||
|
|
||||||
Message msg = new Message(in.getLogId(), room, member, in.getType(), in.getMessage(), in.getAttachment());
|
Message msg = new Message(in.getLogId(), room, member, in.getType(), in.getMessage(), in.getAttachment());
|
||||||
|
Thread.ofVirtual().start(() -> {
|
||||||
client.getTalkHandler().onMessage(msg);
|
client.getTalkHandler().onMessage(msg);
|
||||||
|
});
|
||||||
} else if (packet.getMethod().equals("NEWMEM")) {
|
} else if (packet.getMethod().equals("NEWMEM")) {
|
||||||
NewMemIn in = new NewMemIn();
|
NewMemIn in = new NewMemIn();
|
||||||
in.fromBson(packet.getBody());
|
in.fromBson(packet.getBody());
|
||||||
@@ -50,7 +50,9 @@ public class LocoSocketHandlerImpl extends LocoSocketHandler {
|
|||||||
|
|
||||||
ChatRoom room = client.getChatRooms().get(in.getChatId());
|
ChatRoom room = client.getChatRooms().get(in.getChatId());
|
||||||
if (!room.getType().equals("OM")) return;
|
if (!room.getType().equals("OM")) return;
|
||||||
|
Thread.ofVirtual().start(() -> {
|
||||||
client.getTalkHandler().onNewMember(room, room.getMembers().get(in.getUserId()));
|
client.getTalkHandler().onNewMember(room, room.getMembers().get(in.getUserId()));
|
||||||
|
});
|
||||||
} else if (packet.getMethod().equals("DELMEM")) {
|
} else if (packet.getMethod().equals("DELMEM")) {
|
||||||
DelMemIn in = new DelMemIn();
|
DelMemIn in = new DelMemIn();
|
||||||
in.fromBson(packet.getBody());
|
in.fromBson(packet.getBody());
|
||||||
@@ -58,7 +60,9 @@ public class LocoSocketHandlerImpl extends LocoSocketHandler {
|
|||||||
|
|
||||||
ChatRoom room = client.getChatRooms().get(in.getChatId());
|
ChatRoom room = client.getChatRooms().get(in.getChatId());
|
||||||
if (!room.getType().equals("OM")) return;
|
if (!room.getType().equals("OM")) return;
|
||||||
|
Thread.ofVirtual().start(() -> {
|
||||||
client.getTalkHandler().onDelMember(room, new Member(in.getUserId(), in.getNickname(), 2));
|
client.getTalkHandler().onDelMember(room, new Member(in.getUserId(), in.getNickname(), 2));
|
||||||
|
});
|
||||||
room.getMembers().remove(in.getUserId());
|
room.getMembers().remove(in.getUserId());
|
||||||
} else if (packet.getMethod().equals("SYNCLINKPF")) {
|
} else if (packet.getMethod().equals("SYNCLINKPF")) {
|
||||||
SyncLinkPfIn si = new SyncLinkPfIn();
|
SyncLinkPfIn si = new SyncLinkPfIn();
|
||||||
|
|||||||
@@ -36,14 +36,14 @@ import java.util.concurrent.Executors;
|
|||||||
|
|
||||||
public class TalkClient {
|
public class TalkClient {
|
||||||
|
|
||||||
private String email;
|
private final String email;
|
||||||
private String password;
|
private final String password;
|
||||||
private String deviceName;
|
private final String deviceName;
|
||||||
private String deviceUuid;
|
private final String deviceUuid;
|
||||||
private String sessionDir;
|
private final String sessionDir;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private Map<Long, ChatRoom> chatRooms = new HashMap<>();
|
private final Map<Long, ChatRoom> chatRooms = new HashMap<>();
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
protected boolean connected;
|
protected boolean connected;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class SecureLayerCodec extends MessageToMessageCodec<byte[], byte[]> {
|
public class SecureLayerCodec extends MessageToMessageCodec<byte[], byte[]> {
|
||||||
|
|
||||||
private CryptoManager cryptoManager;
|
private final CryptoManager cryptoManager;
|
||||||
|
|
||||||
private int currentLength = -1;
|
private int currentLength = -1;
|
||||||
private byte[] buffer = new byte[0];
|
private byte[] buffer = new byte[0];
|
||||||
@@ -20,6 +20,7 @@ public class SecureLayerCodec extends MessageToMessageCodec<byte[], byte[]> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void encode(ChannelHandlerContext channelHandlerContext, byte[] bytes, List<Object> list) throws Exception {
|
protected void encode(ChannelHandlerContext channelHandlerContext, byte[] bytes, List<Object> list) throws Exception {
|
||||||
|
// TODO 길이 길면 짤라서 암호화해서 보내야됨
|
||||||
byte[] encryptedBody = cryptoManager.encryptMessage(bytes);
|
byte[] encryptedBody = cryptoManager.encryptMessage(bytes);
|
||||||
byte[] packet = ByteUtil.concatBytes(ByteUtil.intToByteArrayLE(encryptedBody.length), encryptedBody);
|
byte[] packet = ByteUtil.concatBytes(ByteUtil.intToByteArrayLE(encryptedBody.length), encryptedBody);
|
||||||
list.add(packet);
|
list.add(packet);
|
||||||
|
|||||||
@@ -55,10 +55,9 @@ public class CryptoManager {
|
|||||||
byte[] length = ByteUtil.intToByteArrayLE(HANDSHAKE_BODY_SIZE);
|
byte[] length = ByteUtil.intToByteArrayLE(HANDSHAKE_BODY_SIZE);
|
||||||
return ByteUtil.concatBytes(length, ByteUtil.intToByteArrayLE(RSA_LOCO_HEADER), ByteUtil.intToByteArrayLE(AES_LOCO_HEADER), encryptedKey);
|
return ByteUtil.concatBytes(length, ByteUtil.intToByteArrayLE(RSA_LOCO_HEADER), ByteUtil.intToByteArrayLE(AES_LOCO_HEADER), encryptedKey);
|
||||||
} catch (Exception e) {}
|
} catch (Exception e) {}
|
||||||
return new byte[0];
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 바디 사이즈가 131067가 최대인거 같은데 잘 모르겠음
|
|
||||||
public byte[] encryptMessage(byte[] message) {
|
public byte[] encryptMessage(byte[] message) {
|
||||||
try {
|
try {
|
||||||
byte[] nonce = new byte[AES_NONCE_SIZE];
|
byte[] nonce = new byte[AES_NONCE_SIZE];
|
||||||
@@ -67,7 +66,7 @@ public class CryptoManager {
|
|||||||
cipher.init(Cipher.ENCRYPT_MODE, aesKey, new GCMParameterSpec(AES_KEY_SIZE, nonce));
|
cipher.init(Cipher.ENCRYPT_MODE, aesKey, new GCMParameterSpec(AES_KEY_SIZE, nonce));
|
||||||
return ByteUtil.concatBytes(nonce, cipher.doFinal(message));
|
return ByteUtil.concatBytes(nonce, cipher.doFinal(message));
|
||||||
} catch (Exception e) {}
|
} catch (Exception e) {}
|
||||||
return new byte[0];
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] decryptMessage(byte[] message) {
|
public byte[] decryptMessage(byte[] message) {
|
||||||
@@ -77,7 +76,7 @@ public class CryptoManager {
|
|||||||
cipher.init(Cipher.DECRYPT_MODE, aesKey, new GCMParameterSpec(AES_KEY_SIZE, nonce));
|
cipher.init(Cipher.DECRYPT_MODE, aesKey, new GCMParameterSpec(AES_KEY_SIZE, nonce));
|
||||||
return cipher.doFinal(ByteUtil.sliceBytes(message, AES_NONCE_SIZE, message.length - nonce.length));
|
return cipher.doFinal(ByteUtil.sliceBytes(message, AES_NONCE_SIZE, message.length - nonce.length));
|
||||||
} catch (Exception e) {}
|
} catch (Exception e) {}
|
||||||
return new byte[0];
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user