mirror of
https://github.com/RustySamovar/RustySamovar.git
synced 2024-11-25 11:36:46 +00:00
Support versions >= 2.7.50 in query_cur_resion
This commit is contained in:
parent
673976095a
commit
69450ae7ea
@ -4,6 +4,8 @@ use std::net::TcpStream;
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::fs::read_to_string; // use instead of std::fs::File
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
extern crate futures;
|
extern crate futures;
|
||||||
extern crate base64;
|
extern crate base64;
|
||||||
@ -11,15 +13,21 @@ extern crate actix_web;
|
|||||||
extern crate openssl;
|
extern crate openssl;
|
||||||
|
|
||||||
use serde::{de, Deserialize, Deserializer, Serialize};
|
use serde::{de, Deserialize, Deserializer, Serialize};
|
||||||
|
use serde::de::Error;
|
||||||
use futures::executor;
|
use futures::executor;
|
||||||
|
|
||||||
use actix_web::{rt::System, web, get, App, HttpRequest, HttpResponse, HttpServer, Responder, middleware::Logger};
|
use actix_web::{rt::System, web, get, App, HttpRequest, HttpResponse, HttpServer, Responder, middleware::Logger};
|
||||||
use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod, SslVerifyMode, SslOptions, SslMode};
|
use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod, SslVerifyMode, SslOptions, SslMode};
|
||||||
|
use openssl::rsa::{Rsa, Padding};
|
||||||
|
use openssl::symm::Cipher;
|
||||||
use rand::{distributions::Alphanumeric, Rng};
|
use rand::{distributions::Alphanumeric, Rng};
|
||||||
|
|
||||||
use prost::Message;
|
use prost::Message;
|
||||||
|
|
||||||
use mhycrypt;
|
use mhycrypt;
|
||||||
|
use openssl::hash::MessageDigest;
|
||||||
|
use openssl::pkey::{PKey, Private, Public};
|
||||||
|
use openssl::sign::Signer;
|
||||||
use pretty_env_logger::env_logger::fmt;
|
use pretty_env_logger::env_logger::fmt;
|
||||||
use serde::de::Unexpected;
|
use serde::de::Unexpected;
|
||||||
//use openssl::rand;
|
//use openssl::rand;
|
||||||
@ -27,6 +35,34 @@ use serde::de::Unexpected;
|
|||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct DispatchServer {}
|
pub struct DispatchServer {}
|
||||||
|
|
||||||
|
// Keys stuff
|
||||||
|
#[derive(Deserialize,Debug)]
|
||||||
|
struct KeyInfo {
|
||||||
|
key_id: u8,
|
||||||
|
#[serde(deserialize_with = "deserialize_pub_key")]
|
||||||
|
public_key: Rsa<Public>,
|
||||||
|
#[serde(deserialize_with = "deserialize_priv_key")]
|
||||||
|
private_key: Rsa<Private>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_pub_key<'de, D>(deserializer: D) -> Result<Rsa<Public>, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let public_key_pem: &str = Deserialize::deserialize(deserializer)?;
|
||||||
|
|
||||||
|
Rsa::public_key_from_pem(public_key_pem.as_bytes()).map_err(D::Error::custom)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_priv_key<'de, D>(deserializer: D) -> Result<Rsa<Private>, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let private_key_pem: &str = Deserialize::deserialize(deserializer)?;
|
||||||
|
|
||||||
|
Rsa::private_key_from_pem(private_key_pem.as_bytes()).map_err(D::Error::custom)
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize,Debug)]
|
#[derive(Deserialize,Debug)]
|
||||||
struct ClientInfo {
|
struct ClientInfo {
|
||||||
version: String,
|
version: String,
|
||||||
@ -37,6 +73,7 @@ struct ClientInfo {
|
|||||||
channel_id: i32,
|
channel_id: i32,
|
||||||
sub_channel_id: i32,
|
sub_channel_id: i32,
|
||||||
account_type: Option<i32>,
|
account_type: Option<i32>,
|
||||||
|
key_id: Option<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize,Debug)]
|
#[derive(Deserialize,Debug)]
|
||||||
@ -268,7 +305,39 @@ impl DispatchServer {
|
|||||||
|
|
||||||
region_config.encode(&mut region_conf_buf).unwrap();
|
region_config.encode(&mut region_conf_buf).unwrap();
|
||||||
|
|
||||||
return base64::encode(region_conf_buf);
|
if c.0.version.contains("2.7.5") || c.0.version.contains("2.8.") {// TODO: use proper version check!
|
||||||
|
let key_id = match c.0.key_id {
|
||||||
|
Some(key_id) => key_id,
|
||||||
|
None => panic!("Client version >= 2.7.50, but it haven't provided key_id!"),
|
||||||
|
};
|
||||||
|
let rsa_key_collection = DispatchServer::load_rsa_keys("RSAConfig");
|
||||||
|
let keys = match rsa_key_collection.get(&key_id) {
|
||||||
|
Some(keys) => keys,
|
||||||
|
None => panic!("Unknown key ID {}!", key_id),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut out_buf: Vec<u8> = Vec::new();
|
||||||
|
let mut enc_buf: Vec<u8> = vec![0; keys.public_key.size() as usize];
|
||||||
|
|
||||||
|
for chunk in region_conf_buf.chunks(245) { // TODO: value hardcoded for the 2048-bit key!
|
||||||
|
keys.public_key.public_encrypt(chunk, &mut enc_buf, Padding::PKCS1).unwrap();
|
||||||
|
out_buf.append(&mut enc_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
let keypair = PKey::from_rsa(keys.private_key.clone()).unwrap();
|
||||||
|
let mut signer = Signer::new(MessageDigest::sha256(), &keypair).unwrap();
|
||||||
|
signer.update(®ion_conf_buf).unwrap();
|
||||||
|
let signature = signer.sign_to_vec().unwrap();
|
||||||
|
|
||||||
|
return format!("
|
||||||
|
{{
|
||||||
|
\"content\": \"{}\",
|
||||||
|
\"sign\": \"{}\"
|
||||||
|
}}
|
||||||
|
", base64::encode(out_buf), base64::encode(signature));
|
||||||
|
} else {
|
||||||
|
return base64::encode(region_conf_buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn risky_api_check_old(a: web::Json<ActionToCheck>) -> String {
|
async fn risky_api_check_old(a: web::Json<ActionToCheck>) -> String {
|
||||||
@ -634,6 +703,16 @@ impl DispatchServer {
|
|||||||
return "127.0.0.1".to_string();
|
return "127.0.0.1".to_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn load_rsa_keys(name: &str) -> HashMap<u8, KeyInfo> {
|
||||||
|
// Key depo
|
||||||
|
let path = format!("./{}/{}.json", "keys", name);
|
||||||
|
let json_file_path = Path::new(&path);
|
||||||
|
let json_file_str = read_to_string(json_file_path).unwrap_or_else(|_| panic!("File {} not found", path));
|
||||||
|
let data: Vec<KeyInfo> = serde_json::from_str(&json_file_str).expect(&format!("Error while reading json {}", name));
|
||||||
|
|
||||||
|
data.into_iter().map(|ki| (ki.key_id, ki)).collect()
|
||||||
|
}
|
||||||
|
|
||||||
fn load_keys(name: &str) -> (Vec<u8>, Vec<u8>) {
|
fn load_keys(name: &str) -> (Vec<u8>, Vec<u8>) {
|
||||||
// Key
|
// Key
|
||||||
let filename = format!("./{}/{}.key", "keys", name);
|
let filename = format!("./{}/{}.key", "keys", name);
|
||||||
|
Loading…
Reference in New Issue
Block a user