Compare commits

..

No commits in common. "27db3d5ef01044d99d5a296980749a0a4c9ad174" and "29c43e64e60dace41b961bff2b07e415ed39a4f8" have entirely different histories.

3 changed files with 33 additions and 45 deletions

View File

@ -2,6 +2,7 @@ import time
import random import random
import asyncio import asyncio
import traceback import traceback
import multiprocessing
from typing import Dict, List, Tuple, Any, Optional, Union, Literal from typing import Dict, List, Tuple, Any, Optional, Union, Literal
@ -66,7 +67,7 @@ class Message(Options):
} }
sio: socketio.AsyncClient = socketio.AsyncClient() sio = socketio.AsyncClient()
@sio.on('connect') @sio.on('connect')
@ -86,10 +87,6 @@ async def require_auth(salt: str, versions: Dict[str, str]):
await sio.emit('auth', signature.signature) await sio.emit('auth', signature.signature)
print(f"{Fore.BLUE}send auth emit{Style.RESET_ALL}") print(f"{Fore.BLUE}send auth emit{Style.RESET_ALL}")
# @sio.on('requireAuth')
# def require_auth(*data: Dict[str, Any]):
# print(f"{Fore.BLUE}requireAuth: {data}{Style.RESET_ALL}")
@sio.on('auth') @sio.on('auth')
def auth(data: Dict[str, Any]): def auth(data: Dict[str, Any]):
@ -226,8 +223,8 @@ async def add_message(data: Dict[str, Any]):
await asyncio.sleep(random.random() * 2) await asyncio.sleep(random.random() * 2)
await sio.emit('sendMessage', message.to_json()) await sio.emit('sendMessage', message.to_json())
elif data['message']['content'] == '!!jrrp': elif data['message']['content'] == 'jrrp':
randomer = random.Random(f'{sender_id}-{data["message"]["date"]}-jrrp-v2') randomer = random.Random(f'{sender_id}-{data["message"]["date"]}-jrrp')
result = randomer.randint(0, 50) + randomer.randint(0, 50) result = randomer.randint(0, 50) + randomer.randint(0, 50)
print(f'{sender_name} 今日人品值为 {result}') print(f'{sender_name} 今日人品值为 {result}')
reply = ReplyMessage(id=data['message']['_id']) reply = ReplyMessage(id=data['message']['_id'])

View File

@ -1,25 +0,0 @@
use ed25519_dalek::{Signature, Signer, SigningKey};
pub struct IcalinguaSinger {
pub host: String,
pub pub_key: SigningKey,
}
impl IcalinguaSinger {
pub fn new(host: String, pub_key: &str) -> Self {
let array_key: [u8; 32] = hex::decode(pub_key).unwrap().try_into().unwrap();
let signing_key: SigningKey = SigningKey::from_bytes(&array_key);
Self {
host,
pub_key: signing_key,
}
}
pub fn sign_for_salt(&self, salt: String) -> Vec<u8> {
let salt: Vec<u8> = hex::decode(salt).unwrap();
let signature: Signature = self.pub_key.sign(salt.as_slice());
signature.to_bytes().to_vec()
}
}

View File

@ -1,29 +1,27 @@
mod client;
use ed25519_dalek::{Signature, Signer, SigningKey}; use ed25519_dalek::{Signature, Signer, SigningKey};
use rust_socketio::{ClientBuilder, Event, Payload, RawClient}; use rust_socketio::{ClientBuilder, Payload, RawClient, Event};
use std::time::Duration; use std::time::Duration;
static KEY: &str = "";
static HOST: &str = "";
#[allow(unused)] #[allow(unused)]
fn require_auth_callback(payload: Payload, client: RawClient) { fn require_auth_callback(payload: Payload, client: RawClient) {
let key = std::env::args().nth(2).expect("No key given");
let auth_key = match payload { let auth_key = match payload {
Payload::String(str) => Some(str), Payload::String(str) => Some(str),
Payload::Binary(_) => None, Payload::Binary(_) => None,
} }
.expect("Payload should be String"); .unwrap();
// 去除前后的 "
let auth_key = &auth_key[1..auth_key.len() - 1]; let auth_key = &auth_key[1..auth_key.len() - 1];
println!("auth_key: {}", auth_key); println!("auth_key: {}", auth_key);
let array_key: [u8; 32] = hex::decode(key) let array_key: [u8; 32] = hex::decode(KEY).unwrap().try_into().unwrap();
.expect("Key should be hex")
.try_into()
.expect("Key should be 32 bytes");
let signing_key: SigningKey = SigningKey::from_bytes(&array_key); let signing_key: SigningKey = SigningKey::from_bytes(&array_key);
let salt = hex::decode(auth_key).expect("Got an invalid salt from the server"); let salt = hex::decode(auth_key).unwrap();
let signature: Signature = signing_key.sign(salt.as_slice()); let signature: Signature = signing_key.sign(salt.as_slice());
// let sign = hex::encode(signature.to_bytes()); // let sign = hex::encode(signature.to_bytes());
let sign = signature.to_bytes().to_vec(); let sign = signature.to_bytes().to_vec();
@ -46,12 +44,10 @@ fn ws_main() {
let connect_call_back = |payload: Payload, _client: RawClient| { let connect_call_back = |payload: Payload, _client: RawClient| {
println!("Connect callback: {:#?}", payload); println!("Connect callback: {:#?}", payload);
}; };
// 从命令行获取 host 和 key
let host = std::env::args().nth(1).expect("No host given");
// get a socket that is connected to the admin namespace // get a socket that is connected to the admin namespace
let socket = ClientBuilder::new(host) let socket = ClientBuilder::new(HOST)
// .namespace("/admin") // .namespace("/admin")
.on_any(any_event) .on_any(any_event)
.on("connect", connect_call_back) .on("connect", connect_call_back)
@ -64,6 +60,26 @@ fn ws_main() {
socket.disconnect().expect("Disconnect failed") socket.disconnect().expect("Disconnect failed")
} }
fn sign_main() {
// 生成 SingningKey
let array_key: [u8; 32] = hex::decode(KEY).unwrap().try_into().unwrap();
let signing_key: SigningKey = SigningKey::from_bytes(&array_key);
// 要签名的东西
let data = "187d0b21becfa7a49e97afc00646e169";
let data = hex::decode(data).unwrap();
// 签名
let signature: Signature = signing_key.sign(data.as_slice());
// 生成签名
let sign = hex::encode(signature.to_bytes());
println!("sign: {} {:?} {}", sign, signature.to_bytes(), signature.to_bytes().len());
// println!("hex: {}", hex::encode());
}
fn main() { fn main() {
sign_main();
ws_main(); ws_main();
} }