Skip to content

Commit 1ccbf0c

Browse files
Adapt new context api in monobean Related: #1164 (#1173)
* adapt new conntext api * monobean:adapt new context api * passed unit tests * fix clippy erro * fix clippy erro --------- Co-authored-by: Quanyi Ma <[email protected]>
1 parent 5b18bc5 commit 1ccbf0c

File tree

10 files changed

+88
-43
lines changed

10 files changed

+88
-43
lines changed

context/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ jupiter = { workspace = true }
1717
vault = { workspace = true }
1818

1919
gemini = { workspace = true, optional = true }
20+
tokio = "1.45.1"

context/src/lib.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,17 @@ pub struct AppContext {
2222
impl AppContext {
2323
/// Creates a new application context with the given configuration.
2424
pub async fn new(config: common::config::Config) -> Self {
25+
2526
let config = Arc::new(config);
27+
2628
let storage = jupiter::storage::Storage::new(config.clone()).await;
27-
let vault = vault::integration::vault_core::VaultCore::new(storage.clone());
29+
30+
let storage_for_vault = storage.clone();
31+
let vault = tokio::task::spawn_blocking(move || {
32+
vault::integration::vault_core::VaultCore::new(storage_for_vault)
33+
}).await.expect("VaultCore::new panicked");
34+
35+
2836
#[cfg(feature = "p2p")]
2937
let client = gemini::p2p::client::P2PClient::new(storage.clone(), vault.clone());
3038

@@ -41,9 +49,12 @@ impl AppContext {
4149
#[cfg(feature = "p2p")]
4250
client,
4351
}
52+
53+
4454
}
4555

4656
pub fn wrapped_context(&self) -> Arc<Self> {
4757
Arc::new(self.clone())
4858
}
4959
}
60+

monobean/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ vault = { path = "../vault" }
2525
gateway = { path = "../gateway" }
2626
ceres = { path = "../ceres" }
2727
mercury = { path = "../mercury" }
28+
context = {path = "../context"}
2829

2930
thiserror = { version = "2.0.11", features = ["default"] }
3031
tracing-subscriber = { version = "0.3.19", features = ["default", "env-filter"] }

monobean/src/application.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ impl MonobeanApplication {
294294
glib::LogLevel::Debug => tracing::Level::DEBUG,
295295
};
296296

297-
println!("{}: {}", level, fields);
297+
println!("{level}: {fields}");
298298
},
299299
);
300300
}

monobean/src/components/hello_page.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,15 @@ impl HelloPage {
8989
fn setup_logo(&self) {
9090
let logo = self.imp().logo.clone();
9191
let id = random_int_range(1, 6);
92-
logo.set_icon_name(Some(format!("walrus-{}", id).as_str()));
92+
logo.set_icon_name(Some(format!("walrus-{id}").as_str()));
9393

9494
let gesture = gtk::GestureClick::new();
9595
gesture.connect_pressed(clone!(
9696
#[weak]
9797
logo,
9898
move |_, _, _, _| {
9999
let id = random_int_range(1, 6);
100-
logo.set_icon_name(Some(format!("walrus-{}", id).as_str()));
100+
logo.set_icon_name(Some(format!("walrus-{id}").as_str()));
101101
}
102102
));
103103
logo.add_controller(gesture);

monobean/src/config.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ macro_rules! get_setting {
9595
pub fn monobean_base() -> PathBuf {
9696
// Get the base directory from the environment variable or use the default
9797
std::env::var("MONOBEAN_BASE_DIR")
98-
.map(|inner| PathBuf::from(inner))
98+
.map(PathBuf::from)
9999
.unwrap_or_else(|_| common::config::mega_base().join("monobean"))
100100
}
101101

@@ -119,7 +119,7 @@ pub fn monobean_base() -> PathBuf {
119119
pub fn monobean_cache() -> PathBuf {
120120
// Get the cache directory from the environment variable or use the default
121121
std::env::var("MONOBEAN_CACHE_DIR")
122-
.map(|inner| PathBuf::from(inner))
122+
.map(PathBuf::from)
123123
.unwrap_or_else(|_| common::config::mega_cache().join("monobean"))
124124
}
125125

monobean/src/core/mega_core.rs

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use ceres::api_service::ApiHandler;
99
use ceres::protocol::repo::Repo;
1010
use common::config::Config;
1111
use common::model::P2pOptions;
12-
use jupiter::context::Context as MegaContext;
12+
use context::AppContext as MegaContext;
1313
use mercury::internal::object::tree::Tree;
1414
use std::fmt;
1515
use std::fmt::{Debug, Formatter};
@@ -18,6 +18,7 @@ use std::path::{Component, Path, PathBuf};
1818
use std::sync::atomic::{AtomicBool, Ordering};
1919
use std::sync::Arc;
2020
use tokio::sync::{oneshot, OnceCell, RwLock};
21+
use vault::integration::vault_core::VaultCore;
2122
use vault::pgp::{SignedPublicKey, SignedSecretKey};
2223

2324
pub struct MegaCore {
@@ -146,19 +147,28 @@ impl MegaCore {
146147
return;
147148
}
148149

149-
if let Some(pk) = vault::pgp::load_pub_key().await {
150-
let sk = vault::pgp::load_sec_key().await.unwrap();
150+
let guard = self.running_context.read().await;
151+
let vault_core = if let Some(ctx) = guard.as_ref() {
152+
&ctx.vault
153+
} else {
154+
let err_msg = "Mega core is not running, failed to get vault core";
155+
tracing::error!(err_msg);
156+
return;
157+
};
158+
159+
if let Some(pk) = vault_core.load_pub_key() {
160+
let sk = vault_core.load_sec_key().await.unwrap();
151161
chan.send(Ok(())).unwrap();
152162
self.pgp.set((pk, sk)).unwrap();
153163
} else {
154-
let uid = format!("{} <{}>", user_name, user_email);
155-
let params = vault::pgp::params(
164+
let uid = format!("{user_name} <{user_email}>");
165+
let params = VaultCore::params(
156166
vault::pgp::KeyType::Rsa(2048),
157167
passwd.clone(),
158168
uid.as_ref(),
159169
);
160-
let (pk, sk) = vault::pgp::gen_pgp_keypair(params, passwd);
161-
vault::pgp::save_keys(pk.clone(), sk.clone()).await;
170+
let (pk, sk) = vault_core.gen_pgp_keypair(params, passwd);
171+
vault_core.save_keys(pk.clone(), sk.clone());
162172
chan.send(Ok(())).unwrap();
163173
self.pgp.set((pk, sk)).unwrap();
164174
}
@@ -190,9 +200,18 @@ impl MegaCore {
190200
self.initialized.store(true, Ordering::Release);
191201
}
192202

203+
let guard = self.running_context.read().await;
204+
let vault_core = if let Some(ctx) = guard.as_ref() {
205+
&ctx.vault
206+
} else {
207+
let err_msg = "Mega core is not running, failed to get vault core";
208+
tracing::error!(err_msg);
209+
return;
210+
};
211+
193212
// Try to load pgp keys from vault.
194-
if let Some(pk) = vault::pgp::load_pub_key().await {
195-
let sk = vault::pgp::load_sec_key().await.unwrap();
213+
if let Some(pk) = vault_core.load_pub_key() {
214+
let sk = vault_core.load_sec_key().await.unwrap();
196215
self.pgp.set((pk, sk)).unwrap();
197216
tracing::debug!("Loaded pgp keys from vault");
198217
}
@@ -211,13 +230,9 @@ impl MegaCore {
211230
return Err(MonoBeanError::MegaCoreError(err.to_string()));
212231
}
213232

214-
let config: Arc<Config> = self.config.read().await.clone().into();
233+
let config = self.config.read().await.clone();
234+
215235
let inner = MegaContext::new(config.clone()).await;
216-
inner
217-
.services
218-
.mono_storage
219-
.init_monorepo(&config.monorepo)
220-
.await;
221236

222237
let http_ctx = inner.clone();
223238
*self.http_options.write().await = http_addr
@@ -281,21 +296,23 @@ impl MegaCore {
281296

282297
if path.as_ref().starts_with(&import_dir) && path.as_ref() != import_dir {
283298
if let Some(model) = ctx
299+
.storage
284300
.services
301+
.as_ref()
285302
.git_db_storage
286303
.find_git_repo_like_path(path.as_ref().to_string_lossy().as_ref())
287304
.await
288305
.unwrap()
289306
{
290307
let repo: Repo = model.into();
291308
return Ok(Box::new(ImportApiService {
292-
context: ctx.clone(),
309+
storage: ctx.storage.clone(),
293310
repo,
294311
}));
295312
}
296313
}
297314
let ret: Box<dyn ApiHandler> = Box::new(MonoApiService {
298-
context: ctx.clone(),
315+
storage: ctx.storage.clone(),
299316
});
300317

301318
// Rust-analyzer cannot infer the type of `ret` correctly and always reports an error.
@@ -319,7 +336,7 @@ impl MegaCore {
319336
match tree {
320337
Ok(Some(tree)) => Ok(tree),
321338
_ => {
322-
let err_msg = format!("Failed to load tree: {:?}", path);
339+
let err_msg = format!("Failed to load tree: {path:?}");
323340
tracing::error!(err_msg);
324341
Err(MonoBeanError::MegaCoreError(err_msg))
325342
}
@@ -328,7 +345,9 @@ impl MegaCore {
328345

329346
async fn load_blob(&self, id: impl AsRef<str>) -> MonoBeanResult<String> {
330347
let ctx = self.running_context.read().await.clone().unwrap();
331-
let mono = MonoApiService { context: ctx };
348+
let mono = MonoApiService {
349+
storage: ctx.storage,
350+
};
332351
let raw = mono
333352
.get_raw_blob_by_hash(id.as_ref())
334353
.await
@@ -338,7 +357,7 @@ impl MegaCore {
338357
Some(data) => match String::from_utf8(data) {
339358
Ok(string) => Ok(string),
340359
Err(err) => {
341-
let err_msg = format!("Invalid UTF-8 data: {}", err);
360+
let err_msg = format!("Invalid UTF-8 data: {err}");
342361
tracing::error!(err_msg);
343362
Err(MonoBeanError::MegaCoreError(err_msg))
344363
}
@@ -500,7 +519,14 @@ mod tests {
500519
#[tokio::test]
501520
async fn test_launch_http() {
502521
let temp_base = TempDir::new().unwrap();
522+
523+
// 设置环境变量,让 mega_base() 返回临时目录
524+
unsafe {
525+
std::env::set_var("MEGA_BASE_DIR", temp_base.path());
526+
}
527+
503528
let core = test_core(&temp_base).await;
529+
504530
core.process_command(MegaCommands::MegaStart(
505531
Some(SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 8080)),
506532
None,
@@ -515,9 +541,12 @@ mod tests {
515541
assert!(core.ssh_options.read().await.is_none());
516542
}
517543

518-
#[tokio::test]
544+
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
519545
async fn test_launch_ssh() {
520546
let temp_base = TempDir::new().unwrap();
547+
unsafe {
548+
std::env::set_var("MEGA_BASE_DIR", temp_base.path());
549+
}
521550
let core = test_core(&temp_base).await;
522551
core.process_command(MegaCommands::MegaStart(
523552
None,

monobean/src/core/servers.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::error::MonoBeanResult;
22
use bytes::BytesMut;
33
use common::model::P2pOptions;
4+
use context::AppContext as MegaContext;
45
use gateway::https_server::{app, check_run_with_p2p};
5-
use jupiter::context::Context as MegaContext;
66
use mono::git_protocol::ssh::SshServer;
77
use russh::server::Server;
88
use std::collections::HashMap;
@@ -31,7 +31,7 @@ impl HttpOptions {
3131

3232
pub async fn run_server(&self, mega_ctx: MegaContext) -> MonoBeanResult<()> {
3333
let app = app(
34-
mega_ctx.clone(),
34+
mega_ctx.storage.clone(),
3535
self.addr.ip().to_string(),
3636
self.addr.port(),
3737
self.p2p.clone(),
@@ -88,7 +88,7 @@ impl SshOptions {
8888
// Use rusty vault configurations...
8989
let (tx, mut rx) = mpsc::channel::<()>(1);
9090
self.abort.set(tx).unwrap();
91-
let key = mono::server::ssh_server::load_key().await;
91+
let key = mono::server::ssh_server::load_key(mega_ctx.clone());
9292
let ssh_config = russh::server::Config {
9393
auth_rejection_time: std::time::Duration::from_secs(3),
9494
keys: vec![key],
@@ -100,7 +100,7 @@ impl SshOptions {
100100
let mut ssh_server = SshServer {
101101
clients: Arc::new(Mutex::new(HashMap::new())),
102102
id: 0,
103-
context: mega_ctx,
103+
storage: mega_ctx.storage.clone(),
104104
smart_protocol: None,
105105
data_combined: BytesMut::new(),
106106
};

monobean/src/window.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ fn load_css() {
253253
.into_iter()
254254
.map(|f| {
255255
let provider = CssProvider::new();
256-
provider.load_from_resource(&format!("{}/css/{}", PREFIX, f));
256+
provider.load_from_resource(&format!("{PREFIX}/css/{f}"));
257257
style_context_add_provider_for_display(
258258
&gtk::gdk::Display::default().expect("Could not connect to a display."),
259259
&provider,

vault/src/integration/vault_core.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
use std::{
2-
path::PathBuf,
3-
sync::{Arc, RwLock},
4-
};
5-
1+
use std::{path::PathBuf, sync::{Arc, RwLock}};
62
use crate::integration::jupiter_backend::JupiterBackend;
73
use common::errors::MegaError;
84
use jupiter::storage::Storage;
@@ -18,6 +14,8 @@ use tracing::log;
1814

1915
const CORE_KEY_FILE: &str = "core_key.json"; // where the core key is stored, like `root_token`
2016

17+
18+
2119
#[derive(Debug, Clone, Serialize, Deserialize)]
2220
struct CoreKey {
2321
secret_shares: Vec<Vec<u8>>,
@@ -51,9 +49,10 @@ impl VaultCore {
5149
pub fn new(ctx: Storage) -> Self {
5250
let dir = common::config::mega_base().join("vault");
5351
let key_path = dir.join(CORE_KEY_FILE);
54-
52+
println!("{:?}", key_path);
5553
std::fs::create_dir_all(&dir).expect("Failed to create vault directory");
56-
Self::config(ctx, key_path)
54+
let result = Self::config(ctx.clone(), key_path);
55+
result
5756
}
5857

5958
fn config(ctx: Storage, key_path: PathBuf) -> Self {
@@ -71,23 +70,26 @@ impl VaultCore {
7170
};
7271
let core = Arc::new(RwLock::new(core));
7372

73+
7474
let key = {
7575
let mut managed_core = core.write().unwrap();
7676
managed_core
7777
.config(core.clone(), None)
7878
.expect("Failed to configure vault core");
7979

8080
let core_key = if !key_path.exists() {
81+
82+
8183
let result = managed_core
8284
.init(&seal_config)
8385
.expect("Failed to initialize vault");
8486
let core_key = CoreKey {
8587
secret_shares: Vec::from(&result.secret_shares[..]),
8688
root_token: result.root_token,
8789
};
88-
let file = std::fs::File::create(key_path).unwrap();
90+
println!("[vault] Creating new core_key.json at: {}", key_path.display());
91+
let file = std::fs::File::create(&key_path).unwrap();
8992
serde_json::to_writer_pretty(file, &core_key).unwrap();
90-
9193
core_key
9294
} else {
9395
println!("Using existing vault core key file: {}", key_path.display());
@@ -110,7 +112,6 @@ impl VaultCore {
110112

111113
core_key.into()
112114
};
113-
114115
Self { core, key }
115116
}
116117
}
@@ -187,6 +188,7 @@ mod tests {
187188
async fn test_vault_core_initialization() {
188189
let temp_dir = tempfile::tempdir().expect("Failed to create temporary directory");
189190
let key_path = temp_dir.path().join(CORE_KEY_FILE);
191+
println!("Key path: {:?}", key_path);
190192
let storage = test_storage(temp_dir.path()).await;
191193
let vault_core = VaultCore::config(storage, key_path);
192194

@@ -199,7 +201,8 @@ mod tests {
199201
"Vault core should be initialized"
200202
);
201203
}
202-
204+
205+
203206
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
204207
async fn test_vault_api() {
205208
let temp_dir = tempfile::tempdir().expect("Failed to create temporary directory");

0 commit comments

Comments
 (0)