Updated gif api and using rustls for ssl&tls

This commit is contained in:
Piyush मिश्रः 2023-02-28 18:21:05 +05:30
parent ab3a31426d
commit 91fdc5576d
3 changed files with 172 additions and 36 deletions

147
Cargo.lock generated
View File

@ -69,10 +69,11 @@ dependencies = [
"futures-util", "futures-util",
"http", "http",
"log", "log",
"openssl", "rustls",
"tokio-openssl", "tokio-rustls",
"trust-dns-proto", "trust-dns-proto",
"trust-dns-resolver", "trust-dns-resolver",
"webpki",
] ]
[[package]] [[package]]
@ -109,7 +110,7 @@ dependencies = [
"actix-threadpool", "actix-threadpool",
"actix-tls", "actix-tls",
"actix-utils", "actix-utils",
"base64", "base64 0.13.0",
"bitflags", "bitflags",
"brotli2", "brotli2",
"bytes 0.5.6", "bytes 0.5.6",
@ -269,8 +270,10 @@ dependencies = [
"actix-service", "actix-service",
"actix-utils", "actix-utils",
"futures-util", "futures-util",
"openssl", "rustls",
"tokio-openssl", "tokio-rustls",
"webpki",
"webpki-roots",
] ]
[[package]] [[package]]
@ -321,9 +324,9 @@ dependencies = [
"fxhash", "fxhash",
"log", "log",
"mime", "mime",
"openssl",
"pin-project 1.0.10", "pin-project 1.0.10",
"regex", "regex",
"rustls",
"serde", "serde",
"serde_json", "serde_json",
"serde_urlencoded", "serde_urlencoded",
@ -450,16 +453,16 @@ dependencies = [
"actix-http", "actix-http",
"actix-rt", "actix-rt",
"actix-service", "actix-service",
"base64", "base64 0.13.0",
"bytes 0.5.6", "bytes 0.5.6",
"cfg-if 1.0.0", "cfg-if 1.0.0",
"derive_more", "derive_more",
"futures-core", "futures-core",
"log", "log",
"mime", "mime",
"openssl",
"percent-encoding", "percent-encoding",
"rand 0.7.3", "rand 0.7.3",
"rustls",
"serde", "serde",
"serde_json", "serde_json",
"serde_urlencoded", "serde_urlencoded",
@ -496,12 +499,24 @@ version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b"
[[package]]
name = "base64"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
[[package]] [[package]]
name = "base64" name = "base64"
version = "0.13.0" version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
[[package]]
name = "base64"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.3.2" version = "1.3.2"
@ -1197,6 +1212,15 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
[[package]]
name = "js-sys"
version = "0.3.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84"
dependencies = [
"wasm-bindgen",
]
[[package]] [[package]]
name = "kernel32-sys" name = "kernel32-sys"
version = "0.2.2" version = "0.2.2"
@ -1242,9 +1266,9 @@ dependencies = [
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.14" version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
] ]
@ -1269,12 +1293,15 @@ dependencies = [
"actix-web", "actix-web",
"actix-web-actors", "actix-web-actors",
"actix-web-middleware-redirect-https", "actix-web-middleware-redirect-https",
"base64", "base64 0.13.0",
"clap", "clap",
"env_logger", "env_logger",
"lazy_static", "lazy_static",
"log",
"openssl", "openssl",
"rand 0.8.4", "rand 0.8.4",
"rustls",
"rustls-pemfile",
"serde", "serde",
"serde_json", "serde_json",
"sha2", "sha2",
@ -1788,6 +1815,21 @@ dependencies = [
"quick-error", "quick-error",
] ]
[[package]]
name = "ring"
version = "0.16.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
dependencies = [
"cc",
"libc",
"once_cell",
"spin",
"untrusted",
"web-sys",
"winapi 0.3.9",
]
[[package]] [[package]]
name = "rustc-demangle" name = "rustc-demangle"
version = "0.1.21" version = "0.1.21"
@ -1812,6 +1854,28 @@ dependencies = [
"semver 1.0.4", "semver 1.0.4",
] ]
[[package]]
name = "rustls"
version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d1126dcf58e93cee7d098dbda643b5f92ed724f1f6a63007c1116eed6700c81"
dependencies = [
"base64 0.12.3",
"log",
"ring",
"sct",
"webpki",
]
[[package]]
name = "rustls-pemfile"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b"
dependencies = [
"base64 0.21.0",
]
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.9" version = "1.0.9"
@ -1833,6 +1897,16 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "sct"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce"
dependencies = [
"ring",
"untrusted",
]
[[package]] [[package]]
name = "semver" name = "semver"
version = "0.9.0" version = "0.9.0"
@ -1968,6 +2042,12 @@ dependencies = [
"winapi 0.3.9", "winapi 0.3.9",
] ]
[[package]]
name = "spin"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
[[package]] [[package]]
name = "standback" name = "standback"
version = "0.2.17" version = "0.2.17"
@ -2196,13 +2276,15 @@ dependencies = [
] ]
[[package]] [[package]]
name = "tokio-openssl" name = "tokio-rustls"
version = "0.4.0" version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c4b08c5f4208e699ede3df2520aca2e82401b2de33f45e96696a074480be594" checksum = "e12831b255bcfa39dc0436b01e19fea231a37db570686c06ee72c423479f889a"
dependencies = [ dependencies = [
"openssl", "futures-core",
"rustls",
"tokio 0.2.25", "tokio 0.2.25",
"webpki",
] ]
[[package]] [[package]]
@ -2355,6 +2437,12 @@ dependencies = [
"void", "void",
] ]
[[package]]
name = "untrusted"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
[[package]] [[package]]
name = "url" name = "url"
version = "2.2.2" version = "2.2.2"
@ -2489,6 +2577,35 @@ version = "0.2.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc"
[[package]]
name = "web-sys"
version = "0.3.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]]
name = "webpki"
version = "0.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea"
dependencies = [
"ring",
"untrusted",
]
[[package]]
name = "webpki-roots"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f20dea7535251981a9670857150d571846545088359b28e4951d350bdaf179f"
dependencies = [
"webpki",
]
[[package]] [[package]]
name = "widestring" name = "widestring"
version = "0.4.3" version = "0.4.3"

View File

@ -14,7 +14,7 @@ keywords = ["chat", "Chatting", "Talk", "Stranger"]
[dependencies] [dependencies]
actix = "0.10" actix = "0.10"
actix-web = { version = "3", features = ["openssl"] } actix-web = { version = "3", features = ["rustls"] }
actix-web-actors = "3" actix-web-actors = "3"
actix-broker = "0.3" actix-broker = "0.3"
actix-files = "0.5" actix-files = "0.5"
@ -33,3 +33,6 @@ tokio = { version = "1.5", features = ['rt', 'rt-multi-thread', 'macros'] }
sha2 = "0.10" sha2 = "0.10"
base64 = "0.13" base64 = "0.13"
log = "0.4.17"
rustls = "0.18.0"
rustls-pemfile = "1.0.2"

View File

@ -35,8 +35,10 @@ use actix_web::{
web, App, Error, HttpRequest, HttpResponse, HttpServer, web, App, Error, HttpRequest, HttpResponse, HttpServer,
}; };
use actix_web_actors::ws; use actix_web_actors::ws;
use openssl::ssl::{SslAcceptor, SslAcceptorBuilder, SslConnector, SslFiletype, SslMethod}; use log::error;
use std::sync::RwLock; // use openssl::ssl::{SslAcceptor, SslAcceptorBuilder, SslConnector, SslFiletype, SslMethod};
use rustls::{Certificate, NoClientAuth, PrivateKey, ServerConfig};
use std::{fs::File, sync::RwLock};
use ws_sansad::WsSansad; use ws_sansad::WsSansad;
mod broker_messages; mod broker_messages;
@ -53,18 +55,18 @@ lazy_static! {
#[actix_web::main] #[actix_web::main]
async fn main() -> std::io::Result<()> { async fn main() -> std::io::Result<()> {
std::env::set_var("RUST_LOG", "actix_web=info"); std::env::set_var("RUST_LOG", "info");
env_logger::init(); env_logger::init();
let (config, config_file) = config::generate(); let (config, config_file) = config::generate();
error!("Hello");
*SALT.write().unwrap() = config_file.salt; *SALT.write().unwrap() = config_file.salt;
if let Some(key) = config_file.tenor_key { if let Some(key) = config_file.tenor_key {
*TENOR_API_KEY.write().unwrap() = Some(key); *TENOR_API_KEY.write().unwrap() = Some(key);
} }
let ssl_builder = if config_file.ssl_key.is_some() && config_file.ssl_cert.is_some() { let rustls_server_config = if config_file.ssl_key.is_some() && config_file.ssl_cert.is_some() {
generate_ssl_builder(config_file.ssl_key.unwrap(), config_file.ssl_cert.unwrap()) gen_rustls_server_config(config_file.ssl_key.unwrap(), config_file.ssl_cert.unwrap())
} else { } else {
None None
}; };
@ -92,7 +94,7 @@ async fn main() -> std::io::Result<()> {
app app
}); });
if ssl_builder.is_some() && config.port_ssl.is_some() { if rustls_server_config.is_some() && config.port_ssl.is_some() {
let port = config.port.clone(); let port = config.port.clone();
let port_ssl = config.port_ssl.clone().unwrap(); let port_ssl = config.port_ssl.clone().unwrap();
let redirect_server = HttpServer::new(move || { let redirect_server = HttpServer::new(move || {
@ -119,11 +121,11 @@ async fn main() -> std::io::Result<()> {
}) })
.bind(format!("{}:{}", config.bind_address, config.port))? .bind(format!("{}:{}", config.bind_address, config.port))?
.run(); .run();
let sc = rustls_server_config.unwrap();
let server = server let server = server
.bind_openssl( .bind_rustls(
format!("{}:{}", config.bind_address, config.port_ssl.unwrap()), format!("{}:{}", config.bind_address, config.port_ssl.unwrap()),
ssl_builder.unwrap(), sc,
)? )?
.run(); .run();
@ -147,10 +149,9 @@ async fn gif(req: HttpRequest) -> Result<HttpResponse, Error> {
if pos == "_" { if pos == "_" {
pos = "" pos = ""
} }
let builder = SslConnector::builder(SslMethod::tls()).unwrap();
let client = Client::builder() let client = Client::builder()
.connector(Connector::new().ssl(builder.build()).finish()) .connector(Connector::new().finish())
.finish(); .finish();
let tenor_key = TENOR_API_KEY.read().unwrap(); let tenor_key = TENOR_API_KEY.read().unwrap();
@ -169,8 +170,7 @@ async fn gif(req: HttpRequest) -> Result<HttpResponse, Error> {
} else { } else {
format!( format!(
"https://tenor.googleapis.com/v2/featured?key={}&limit=20&media_filter=tinygif&pos={}", "https://tenor.googleapis.com/v2/featured?key={}&limit=20&media_filter=tinygif&pos={}",
key, key, pos
pos
) )
}; };
@ -187,12 +187,28 @@ async fn gif(req: HttpRequest) -> Result<HttpResponse, Error> {
.body(response)) .body(response))
} }
fn generate_ssl_builder(key: String, cert: String) -> Option<SslAcceptorBuilder> { fn gen_rustls_server_config(key: String, cert: String) -> Option<ServerConfig> {
if key != "" && cert != "" { if key != "" && cert != "" {
let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap(); let mut br = std::io::BufReader::new(File::open(cert).unwrap());
builder.set_private_key_file(key, SslFiletype::PEM).unwrap(); let certs = rustls_pemfile::certs(&mut br)
builder.set_certificate_chain_file(cert).unwrap(); .unwrap()
Some(builder) .iter()
.map(|a| Certificate(a.to_owned()))
.collect::<Vec<Certificate>>();
let mut br = std::io::BufReader::new(File::open(key).unwrap());
let private_key = rustls_pemfile::ec_private_keys(&mut br).unwrap_or(
rustls_pemfile::rsa_private_keys(&mut br)
.unwrap_or(rustls_pemfile::pkcs8_private_keys(&mut br).unwrap()),
);
let private_key = private_key.get(0).unwrap();
let private_key = PrivateKey(private_key.to_owned());
let mut config = ServerConfig::new(NoClientAuth::new());
config.set_single_cert(certs, private_key).unwrap();
Some(config)
} else { } else {
None None
} }