diff --git a/Makefile b/Makefile index 8d584ce..1e692d7 100644 --- a/Makefile +++ b/Makefile @@ -23,9 +23,6 @@ dropTag: run: go run *.go -d -.PHONY:build -build: - @GOOS=linux GOARCH=amd64 go build -o ./build/OneAuth syncDB: @scp -P 19529 oa.db root@alco.host:/root/ diff --git a/oab/Cargo.lock b/oab/Cargo.lock index 736313b..0708c9c 100644 --- a/oab/Cargo.lock +++ b/oab/Cargo.lock @@ -381,6 +381,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + [[package]] name = "arrayvec" version = "0.7.4" @@ -393,6 +399,40 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" +[[package]] +name = "async-nats" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e45b67ea596bb94741ef15ba1d90b72c92bdc07553d8033734cb620a2b39f1c" +dependencies = [ + "base64 0.21.4", + "bytes", + "futures", + "http", + "memchr", + "nkeys", + "nuid", + "once_cell", + "rand", + "regex", + "ring", + "rustls 0.21.7", + "rustls-native-certs", + "rustls-pemfile", + "rustls-webpki", + "serde", + "serde_json", + "serde_nanos", + "serde_repr", + "thiserror", + "time", + "tokio", + "tokio-retry", + "tokio-rustls 0.24.1", + "tracing", + "url", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -655,6 +695,9 @@ name = "bytes" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +dependencies = [ + "serde", +] [[package]] name = "bytestring" @@ -773,6 +816,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.4" @@ -875,6 +928,33 @@ dependencies = [ "cipher", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "platforms", + "rustc_version", + "subtle", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + [[package]] name = "darling" version = "0.20.3" @@ -910,6 +990,12 @@ dependencies = [ "syn 2.0.37", ] +[[package]] +name = "data-encoding" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" + [[package]] name = "dav-server" version = "0.5.7" @@ -1041,6 +1127,27 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +dependencies = [ + "curve25519-dalek", + "ed25519", + "sha2", + "signature", +] + [[package]] name = "either" version = "1.9.0" @@ -1109,6 +1216,12 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "fiat-crypto" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0870c84016d4b481be5c9f323c24f65e31e901ae618f0e80f4308fb00de1d2d" + [[package]] name = "finl_unicode" version = "1.2.0" @@ -1813,6 +1926,22 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "nkeys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aad178aad32087b19042ee36dfd450b73f5f934fbfb058b59b198684dfec4c47" +dependencies = [ + "byteorder", + "data-encoding", + "ed25519", + "ed25519-dalek", + "getrandom", + "log", + "rand", + "signatory", +] + [[package]] name = "nom" version = "7.1.3" @@ -1833,6 +1962,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "nuid" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc895af95856f929163a0aa20c26a78d26bfdc839f51b9d5aa7a5b79e52b7e83" +dependencies = [ + "rand", +] + [[package]] name = "num-bigint" version = "0.3.3" @@ -1922,8 +2060,11 @@ dependencies = [ "actix-multipart", "actix-web", "aes-gcm", + "anyhow", + "async-nats", "base64 0.13.1", "block-padding", + "bytes", "chrono", "clap", "dav-server", @@ -1935,6 +2076,7 @@ dependencies = [ "jsonwebtoken", "lazy_static", "mime_guess", + "nkeys", "proc", "rand", "rust-embed", @@ -1974,6 +2116,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + [[package]] name = "ordered-float" version = "3.9.1" @@ -2193,6 +2341,12 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +[[package]] +name = "platforms" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4503fa043bf02cee09a9582e9554b4c6403b2ef55e4612e96561d294419429f8" + [[package]] name = "polyval" version = "0.5.3" @@ -2576,11 +2730,24 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" dependencies = [ + "log", "ring", "rustls-webpki", "sct 0.7.0", ] +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.3" @@ -2615,6 +2782,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -2735,6 +2911,29 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "1.0.19" @@ -2781,6 +2980,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_nanos" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae801b7733ca8d6a2b580debe99f67f36826a0f5b8a36055dc6bc40f8d6bc71" +dependencies = [ + "serde", +] + [[package]] name = "serde_plain" version = "1.0.2" @@ -2888,11 +3096,23 @@ dependencies = [ "libc", ] +[[package]] +name = "signatory" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1e303f8205714074f6068773f0e29527e0453937fe837c9717d066635b65f31" +dependencies = [ + "pkcs8 0.10.2", + "rand_core", + "signature", + "zeroize", +] + [[package]] name = "signature" -version = "2.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "8fe458c98333f9c8152221191a77e2a44e8325d0193484af2e9421a53019e57d" dependencies = [ "digest", "rand_core", @@ -3276,7 +3496,7 @@ checksum = "4db708cd3e459078f85f39f96a00960bd841f66ee2a669e90bf36907f5a79aae" dependencies = [ "once_cell", "tokio", - "tokio-rustls", + "tokio-rustls 0.22.0", ] [[package]] @@ -3498,6 +3718,17 @@ dependencies = [ "syn 2.0.37", ] +[[package]] +name = "tokio-retry" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f" +dependencies = [ + "pin-project", + "rand", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.22.0" @@ -3509,6 +3740,16 @@ dependencies = [ "webpki", ] +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.7", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.14" diff --git a/oab/Cargo.toml b/oab/Cargo.toml index 459b8c5..5a43a72 100644 --- a/oab/Cargo.toml +++ b/oab/Cargo.toml @@ -56,4 +56,8 @@ actix-cors = "0.6.4" rust-embed = "8.0.0" mime_guess = "2.0.4" service-manager = "0.3.0" +async-nats = "0.32.1" +anyhow = "1.0.75" +bytes = "1.5.0" +nkeys = "0.3.2" diff --git a/oab/Makefile b/oab/Makefile index fcbbe7f..69c3422 100644 --- a/oab/Makefile +++ b/oab/Makefile @@ -15,3 +15,9 @@ sqlx: entity: @sea-orm-cli generate entity --database-url mysql://root:123456@localhost:3306/oneauth -o ./src/models/entity/ --with-serde both --model-extra-derives Default,sqlx::FromRow --serde-skip-hidden-column --date-time-crate chrono + +# install_target: +# @rustup target add x86_64-unknown-linux-gnu + +build_linux: + @cargo build --release --target-dir ./target/linux/ diff --git a/oab/src/api/token.rs b/oab/src/api/token.rs index 8a6c167..65cb94c 100644 --- a/oab/src/api/token.rs +++ b/oab/src/api/token.rs @@ -5,64 +5,107 @@ // Distributed under terms of the MIT license. // -use actix_web::{get, web, Responder}; -use proc::access_read; +use actix_web::{post, web, Responder}; +use nkeys; use sea_orm::{ColumnTrait, EntityTrait, QueryFilter}; +use serde::{Deserialize, Serialize}; +use tracing::info; use crate::{ - models::{self, AUStatus, Token, UserPlugin}, + models::{self, AUStatus, AccessCore, UserPlugin}, AppState, Error, Result, }; -#[get("/app/{aid}/token/")] -#[access_read("app")] +#[derive(Debug, Deserialize, Serialize)] +pub struct GetOptions { + app_id: Option, + token: String, + nonce: Option, +} + +// 转换token +#[post("/app/{aid}/token/")] pub async fn get( aid: web::Path, stat: web::Data, - t: web::ReqData, + query: web::Json, ) -> Result { - let n = aid.into_inner(); - if !n.is_empty() { - let s = models::app_user::Entity::find() - .filter(models::app_user::Column::AppId.eq(&n)) - .filter(models::app_user::Column::UserId.eq(&t.id)) - .one(stat.db()) - .await?; - if s.is_none() { - return Err(Error::NotAuthed); - }; - let s = s.unwrap(); - if s.status == AUStatus::OK as i32 { - let result = sqlx::query_as::<_, models::AccessCore>( + let aid = aid.into_inner(); + let mut key = stat.key.clone(); + let sid = match &query.app_id { + Some(i) => { + if !i.is_empty() { + match models::app::Entity::find_by_id(i).one(stat.db()).await? { + Some(sapp) => key = sapp.key, + None => {} + } + info!("{}", key); + }; + i + } + _ => "", + }; + info!("{}", key); + let token = models::Token::from(&query.token, &key)?; + if aid.starts_with("nats") { + let nonce = &query.nonce.clone().unwrap(); + let u = nkeys::KeyPair::from_seed(&stat.nats_secret).unwrap(); + let res = base64::encode(u.sign(nonce.as_bytes()).unwrap()); + return Ok(res); + }; + if !aid.is_empty() { + // 从OA token 转向其他app token + if sid.is_empty() { + let s = models::app_user::Entity::find() + .filter(models::app_user::Column::AppId.eq(&aid)) + .filter(models::app_user::Column::UserId.eq(&token.id)) + .one(stat.db()) + .await?; + if s.is_none() { + return Err(Error::NotAuthed); + }; + let s = s.unwrap(); + if s.status == AUStatus::OK as i32 { + let result = sqlx::query_as::<_, models::AccessCore>( "select access.name, access.rid, access.level from access, user_role, role WHERE user_role.user_id = ? && access.role_id=user_role.role_id && role.id=user_role.role_id && role.app_id = ?", ) - .bind(&t.id) - .bind(&n) + .bind(&token.id) + .bind(&aid) .fetch_all(stat.sqlx()) .await?; - let appobj = models::app::Entity::find_by_id(&n) - .one(stat.db()) - .await? - .unwrap(); - let u = models::user::Entity::find_by_id(&t.id) + let appobj = models::app::Entity::find_by_id(&aid) + .one(stat.db()) + .await? + .unwrap(); + let u = models::user::Entity::find_by_id(&token.id) + .one(stat.db()) + .await? + .unwrap(); + let str = u.token(result).to_string(&appobj.key)?; + Ok(str) + } else { + Err(Error::NotAuthed) + } + } else { + let u = models::user::Entity::find_by_id(&token.id) .one(stat.db()) .await? .unwrap(); - let str = u.token(result).to_string(&appobj.key)?; - // tokio::spawn(async move { - // let mut interval = tokio::time::interval(Duration::from_secs(5)); - // interval.tick().await; - // let start = Instant::now(); - // println!("time:{:?}", start); - // loop { - // interval.tick().await; - // println!("time:{:?}", start.elapsed()); - // } - // }); - + let str = u + .token(vec![ + AccessCore { + name: "app".to_string(), + rid: None, + level: models::AccessLevel::Read, + }, + AccessCore { + name: "user".to_string(), + rid: None, + level: models::AccessLevel::Read, + }, + ]) + .to_string(&stat.key)?; Ok(str) - } else { - Err(Error::NotAuthed) } } else { Err(Error::Missing("id".to_string())) diff --git a/oab/src/cfg.rs b/oab/src/cfg.rs index 3f45a90..03eadde 100644 --- a/oab/src/cfg.rs +++ b/oab/src/cfg.rs @@ -26,7 +26,6 @@ lazy_static! { pub static ref CLI: AppCli = AppCli::new(); } -pub static mut KEY: String = String::new(); // lazy_static! { // pub static ref CONFIG: ApplicationConfig = ApplicationConfig::new(); // } @@ -116,11 +115,13 @@ pub struct AppState { pub db_name: String, pub log_dir: Option, pub fs_root: String, + pub nats_key: String, + pub nats_secret: String, + /// "100MB" 日志分割尺寸-单位KB,MB,GB pub log_temp_size: Option, pub log_pack_compress: Option, pub log_level: Option, - pub jwt_secret: Option, pub user_init_space: i64, #[serde(skip)] @@ -136,9 +137,6 @@ impl AppState { Ok(f) => f, Err(ref e) if e.kind() == io::ErrorKind::NotFound => { // res.connect_sqlx().unwrap(); - unsafe { - KEY = res.key.clone(); - } return res; } Err(e) => panic!("{}", e), @@ -154,9 +152,6 @@ impl AppState { } else { println!("release_mode is enable!") } - unsafe { - KEY = res.key.clone(); - } res } pub fn defaut() -> Self { @@ -175,9 +170,10 @@ impl AppState { media_path: "/Users/veypi/test/media".to_string(), fs_root: "/Users/veypi/test/media".to_string(), log_level: None, - jwt_secret: None, _sqlx: None, _db: None, + nats_key: "UCXFAAVMCPTATZUZX6H24YF6FI3NKPQBPLM6BNN2EDFPNSUUEZPNFKEL".to_string(), + nats_secret: "SUACQNAAFKDKRBXS62J4JYZ7DWZS7UNUQI52BOFGGBUACHTDHRQP7I66GI".to_string(), user_init_space: 300, } } diff --git a/oab/src/main.rs b/oab/src/main.rs index 47cc647..fa9fab2 100644 --- a/oab/src/main.rs +++ b/oab/src/main.rs @@ -5,6 +5,8 @@ // Distributed under terms of the Apache license. // +use bytes::Bytes; + use actix_files as fs; use actix_web::{ dev::{self, Service}, @@ -25,13 +27,13 @@ use tracing::{error, info, warn}; async fn main() -> Result<()> { std::env::set_var("RUST_LOG", "debug"); std::env::set_var("RUST_BACKTRACE", "1"); + std::env::set_var("asd", "asd"); init_log(); let mut data = AppState::new(); - data.connect().await?; - data.connect_sqlx()?; if let Some(c) = &CLI.command { match c { Clis::Init => { + data.connect_sqlx()?; models::init(data).await; return Ok(()); } @@ -41,10 +43,24 @@ async fn main() -> Result<()> { _ => {} }; }; + data.connect().await?; + data.connect_sqlx()?; web(data).await?; Ok(()) } async fn web(data: AppState) -> Result<()> { + let client = match async_nats::ConnectOptions::new() + .nkey(data.nats_secret.clone()) + .connect("127.0.0.1:4222") + .await + { + Ok(r) => r, + Err(e) => return Err(oab::Error::Unknown), + }; + client + .publish("msg".to_string(), Bytes::from("asd")) + .await + .unwrap(); let url = data.server_url.clone(); let dav = libs::fs::core(); let serv = HttpServer::new(move || { @@ -61,7 +77,13 @@ async fn web(data: AppState) -> Result<()> { ) .into() }); - let cors = actix_cors::Cors::permissive(); + let cors = actix_cors::Cors::default() + .allow_any_method() + .allow_any_header() + .supports_credentials() + .allowed_origin_fn(|_, _| { + return true; + }); let app = App::new(); app.wrap(logger) .wrap(middleware::Compress::default()) @@ -85,7 +107,7 @@ async fn web(data: AppState) -> Result<()> { .wrap_fn(|req, srv| { let headers = &req.headers().clone(); let origin = match headers.get("Origin") { - Some(o) => o.to_str().unwrap().clone().to_string(), + Some(o) => o.to_str().unwrap().to_string(), None => "".to_string(), }; srv.call(req).map(move |res| { @@ -129,6 +151,7 @@ struct Asset; #[actix_web::get("/{_:.*}")] async fn index(p: web::Path) -> impl Responder { info!("{}", p); + let p = &p.into_inner(); match Asset::get(p) { Some(content) => HttpResponse::Ok() diff --git a/oab/src/models/user_plugin.rs b/oab/src/models/user_plugin.rs index c7673ce..ce6f4d6 100644 --- a/oab/src/models/user_plugin.rs +++ b/oab/src/models/user_plugin.rs @@ -66,7 +66,7 @@ impl UserPlugin for super::entity::user::Model { exp: (Utc::now() + Duration::days(4)).timestamp(), iat: Utc::now().timestamp(), id: self.id.clone(), - ico: self.icon.as_ref().unwrap_or(&default_ico).to_string(), + icon: self.icon.as_ref().unwrap_or(&default_ico).to_string(), access: Some(ac), nickname: self .nickname @@ -173,7 +173,7 @@ pub struct Token { pub iat: i64, // Optional. 发布时间 pub id: String, // 用户id pub nickname: String, - pub ico: String, + pub icon: String, pub access: Option>, } diff --git a/oab/src/result.rs b/oab/src/result.rs index d4792ad..14f31be 100644 --- a/oab/src/result.rs +++ b/oab/src/result.rs @@ -41,7 +41,7 @@ where // pub type AsyncResult = std::result::Result>; -#[derive(Clone, ThisError, Debug, Deserialize, Serialize)] +#[derive(ThisError, Debug)] pub enum Error { // system // EnvVarError, @@ -128,6 +128,9 @@ pub enum Error { #[error("unknown error")] Unknown, + + #[error(transparent)] + Other(#[from] anyhow::Error), } impl From for Error { diff --git a/oaweb/package.json b/oaweb/package.json index 91167be..c37d930 100644 --- a/oaweb/package.json +++ b/oaweb/package.json @@ -17,7 +17,7 @@ "@toast-ui/editor": "^3.2.2", "@types/validator": "^13.11.2", "@veypi/msg": "^0.1.1", - "@veypi/oaer": "^0.0.1", + "@veypi/oaer": "^0.0.3", "@veypi/one-icon": "2", "animate.css": "^4.1.1", "axios": "^1.2.1", @@ -25,8 +25,10 @@ "js-base64": "^3.7.5", "mathjax": "3", "mitt": "^3.0.1", + "nats.ws": "^1.18.0", "pinia": "^2.0.11", "quasar": "^2.6.0", + "ts-nkeys": "^1.0.16", "validator": "^13.11.0", "vite-plugin-rewrite-all": "^1.0.1", "vue": "^3.0.0", diff --git a/oaweb/public/icons/favicon-128x128.png b/oaweb/public/icons/favicon-128x128.png deleted file mode 100644 index 1401176..0000000 Binary files a/oaweb/public/icons/favicon-128x128.png and /dev/null differ diff --git a/oaweb/public/icons/favicon-16x16.png b/oaweb/public/icons/favicon-16x16.png deleted file mode 100644 index 679063a..0000000 Binary files a/oaweb/public/icons/favicon-16x16.png and /dev/null differ diff --git a/oaweb/public/icons/favicon-32x32.png b/oaweb/public/icons/favicon-32x32.png deleted file mode 100644 index fd1fbc6..0000000 Binary files a/oaweb/public/icons/favicon-32x32.png and /dev/null differ diff --git a/oaweb/public/icons/favicon-96x96.png b/oaweb/public/icons/favicon-96x96.png deleted file mode 100644 index e93b80a..0000000 Binary files a/oaweb/public/icons/favicon-96x96.png and /dev/null differ diff --git a/oaweb/quasar.config.js b/oaweb/quasar.config.js index d5170bc..a7f965a 100644 --- a/oaweb/quasar.config.js +++ b/oaweb/quasar.config.js @@ -40,6 +40,8 @@ module.exports = configure(function(/* ctx */) { 'i18n', 'api', 'pack', + 'nats', + 'oaer', ], // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css diff --git a/oaweb/src/boot/nats.ts b/oaweb/src/boot/nats.ts new file mode 100644 index 0000000..89cfd03 --- /dev/null +++ b/oaweb/src/boot/nats.ts @@ -0,0 +1,40 @@ +/* + * nats.ts + * Copyright (C) 2023 veypi + * 2023-10-16 16:18 + * Distributed under terms of the MIT license. + */ + +import axios from 'axios' +import util from '../libs/util' +import { connect, StringCodec } from '../libs/nats.ws' + + + + +const sc = StringCodec(); +const nc = await connect({ + servers: 'ws://127.0.0.1:4221', + authenticator: function(nonce?: string) { + let nkey = 'UCXFAAVMCPTATZUZX6H24YF6FI3NKPQBPLM6BNN2EDFPNSUUEZPNFKEL' + // let nre = nkeyAuthenticator(nkey_seed) + let res = { + nkey: nkey, + sig: async function() { + let response = await axios.post('/api/app/nats/token/', { token: util.getToken(), nonce: nonce }); + console.log(response) + return response.data + } + }; + return res + } as any +}) + +nc.publish('msg', '123') +const sub = nc.subscribe("msg"); +(async () => { + for await (const m of sub) { + console.log(`[${sub.getProcessed()}]: ${sc.decode(m.data)}`); + } + console.log("subscription closed"); +})(); diff --git a/oaweb/src/boot/oaer.ts b/oaweb/src/boot/oaer.ts new file mode 100644 index 0000000..36bb289 --- /dev/null +++ b/oaweb/src/boot/oaer.ts @@ -0,0 +1,22 @@ +/* + * oaer.ts + * Copyright (C) 2023 veypi + * 2023-10-16 21:20 + * Distributed under terms of the MIT license. + */ + + +// import '@veypi/oaer' +import oaer from '@veypi/oaer' +import bus from 'src/libs/bus' +import util from 'src/libs/util' + +oaer.set({ + token: util.getToken(), + host: 'http://' + window.location.host, + uuid: 'FR9P5t8debxc11aFF', +}) + +bus.on('token', (t: any) => { + oaer.set({ token: t }) +}) diff --git a/oaweb/src/boot/pack.ts b/oaweb/src/boot/pack.ts index c2a1f0b..82dc872 100644 --- a/oaweb/src/boot/pack.ts +++ b/oaweb/src/boot/pack.ts @@ -7,33 +7,11 @@ -import { boot } from 'quasar/wrappers' import '@veypi/msg/index.css' import { conf } from '@veypi/msg' import '../assets/icon.js' -import '@veypi/oaer/dist/index.css' import 'cherry-markdown/dist/cherry-markdown.css'; -import oafs from 'src/libs/oafs' -import { Cfg } from '@veypi/oaer' -import util from 'src/libs/util.js' -import evt from 'src/libs/evt.js' - - -oafs.setCfg({ token: util.getToken(), app_id: 'FR9P5t8debxc11aFF' }) -Cfg.token.value = util.getToken() - conf.timeout = 5000 -Cfg.host.value = 'http://' + window.location.host -Cfg.uuid.value = 'FR9P5t8debxc11aFF' -evt.on('token', (t: any) => { - oafs.setCfg({ token: t }) - Cfg.token.value = t -}) -// "async" is optional; -// more info on params: https://v2.quasar.dev/quasar-cli/boot-files -export default boot(async (/* { app, router, ... } */) => { - // something to do -}) diff --git a/oaweb/src/components/FsTree.vue b/oaweb/src/components/FsTree.vue index 886bb7e..93929eb 100644 --- a/oaweb/src/components/FsTree.vue +++ b/oaweb/src/components/FsTree.vue @@ -28,7 +28,7 @@ diff --git a/oaweb/yarn.lock b/oaweb/yarn.lock index 4900d1d..7ced1d4 100644 --- a/oaweb/yarn.lock +++ b/oaweb/yarn.lock @@ -530,20 +530,18 @@ resolved "https://registry.yarnpkg.com/@veypi/msg/-/msg-0.1.1.tgz#94864ae2c0a81991b8a30d87f12d2245fdebbead" integrity sha512-UiAF/Y0EGT/37tGApptzHBNUpo78LbnrEkCqGAGMkJp86wrUyOgTAvuvQ197Ifqw9PIbjZM9dAgMv4DfMJQEYA== -"@veypi/oaer@^0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@veypi/oaer/-/oaer-0.0.1.tgz#b22ebaf72a7bfd5abf62f099b72b533a8cf27abd" - integrity sha512-ILY8SXK7yihH2/qhUFfPbD2FNE7O4IHh7Q9Z1A+Ild6zonCb3RM7LcOBM4/9WriEi3mPdBNmFfuoP8YFCIxHuA== +"@veypi/oaer@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@veypi/oaer/-/oaer-0.0.3.tgz#b72623ae3b124ac03ca65a6715cc1a2aaa1590ee" + integrity sha512-KfbbXJFUiGoCWoYpMAKOEX32Hc2qxk0NnApCWgXAVwU5iyFC4onJpvwPn0ekbWXULWSov5T3Yde61kOirGToIw== dependencies: "@veypi/msg" "^0.1.0" "@veypi/one-icon" "2" animate.css "^4.1.1" autoprefixer "^10.4.16" - axios "^1.5.1" js-base64 "^3.7.5" + mitt "^3.0.1" postcss "^8.4.31" - tailwindcss "^3.3.3" - vue "^3.3.4" webdav "^5.3.0" "@veypi/one-icon@2": @@ -871,15 +869,6 @@ axios@^1.2.1: form-data "^4.0.0" proxy-from-env "^1.1.0" -axios@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" - integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -3137,6 +3126,20 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nats.ws@^1.18.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/nats.ws/-/nats.ws-1.18.0.tgz#eeef911608cc3c0f0f8ff2509c8a231f40213cb5" + integrity sha512-5ITvGO2gd4vAVK733u494ysEOuorfygpig9pqqLapV3FuiFWp4APsZdtZ893zXCC5UclF9MYUzdiTj2cKPDxAA== + optionalDependencies: + nkeys.js "1.0.5" + +nats@^2.17.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nats/-/nats-2.17.0.tgz#1f6ffa5d89bb8ea4549e205f42601dbf66c4561e" + integrity sha512-749TtweWL6bc9R9yNra4a+tuk8J0bqurxcPV/9R2D+WPTplY4PPde/LPSXspqR/eCCTxiM80/AjVlfboEafRxA== + dependencies: + nkeys.js "1.0.5" + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -3157,6 +3160,13 @@ nested-property@^4.0.0: resolved "https://registry.yarnpkg.com/nested-property/-/nested-property-4.0.0.tgz#a67b5a31991e701e03cdbaa6453bc5b1011bb88d" integrity sha512-yFehXNWRs4cM0+dz7QxCd06hTbWbSkV0ISsqBfkntU6TOY4Qm3Q88fRRLOddkGh2Qq6dZvnKVAahfhjcUvLnyA== +nkeys.js@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nkeys.js/-/nkeys.js-1.0.5.tgz#3024bde671eb33be0316ff2d5abe8b8cec960158" + integrity sha512-u25YnRPHiGVsNzwyHnn+PT90sgAhnS8jUJ1nxmkHMFYCJ6+Ic0lv291w7uhRBpJVJ3PH2GWbYqA151lGCRrB5g== + dependencies: + tweetnacl "1.0.3" + no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" @@ -4116,6 +4126,13 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-nkeys@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/ts-nkeys/-/ts-nkeys-1.0.16.tgz#b0c6e7c4f16f976c7e7ddb6982fc789a2f971248" + integrity sha512-1qrhAlavbm36wtW+7NtKOgxpzl+70NTF8xlz9mEhiA5zHMlMxjj3sEVKWm3pGZhHXE0Q3ykjrj+OSRVaYw+Dqg== + dependencies: + tweetnacl "^1.0.3" + tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -4133,6 +4150,11 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" +tweetnacl@1.0.3, tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -4294,7 +4316,7 @@ vue-router@^4.0.0: dependencies: "@vue/devtools-api" "^6.5.0" -vue@^3.0.0, vue@^3.2.20, vue@^3.3.4: +vue@^3.0.0, vue@^3.2.20: version "3.3.4" resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.4.tgz#8ed945d3873667df1d0fcf3b2463ada028f88bd6" integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw== diff --git a/script/nats.yml b/script/nats.yml new file mode 100644 index 0000000..0c38051 --- /dev/null +++ b/script/nats.yml @@ -0,0 +1,21 @@ +# nats cfg +# +host: 127.0.0.1 +port: 4222 + +# 监控端口 +http_port: 8222 + +jetstream: { +} + +authorization: { + users: [ + { nkey: UCXFAAVMCPTATZUZX6H24YF6FI3NKPQBPLM6BNN2EDFPNSUUEZPNFKEL} + ] +} + +websocket: { + listen: '0.0.0.0:4221' + no_tls: true +}