Skip to content

Commit 0a083a6

Browse files
committed
rewrite subscription complete
1 parent 3afe79b commit 0a083a6

File tree

13 files changed

+1085
-526
lines changed

13 files changed

+1085
-526
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ntfy-daemon/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,4 @@ regex = "1.9.6"
3131
oo7 = "0.2.1"
3232
async-trait = "0.1.83"
3333
http = "1.1.0"
34+
async-channel = "2.3.1"

ntfy-daemon/src/credentials.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::cell::RefCell;
22
use std::collections::HashMap;
33
use std::rc::Rc;
4+
use std::sync::{Arc, RwLock};
45

56
use async_trait::async_trait;
67

@@ -135,14 +136,14 @@ pub struct Credential {
135136

136137
#[derive(Clone)]
137138
pub struct Credentials {
138-
keyring: Rc<dyn LightKeyring>,
139-
creds: Rc<RefCell<HashMap<String, Credential>>>,
139+
keyring: Arc<dyn LightKeyring + Send + Sync>,
140+
creds: Arc<RwLock<HashMap<String, Credential>>>,
140141
}
141142

142143
impl Credentials {
143144
pub async fn new() -> anyhow::Result<Self> {
144145
let mut this = Self {
145-
keyring: Rc::new(RealKeyring {
146+
keyring: Arc::new(RealKeyring {
146147
keyring: oo7::Keyring::new()
147148
.await
148149
.expect("Failed to start Secret Service"),
@@ -154,7 +155,7 @@ impl Credentials {
154155
}
155156
pub async fn new_nullable(credentials: Vec<Credential>) -> anyhow::Result<Self> {
156157
let mut this = Self {
157-
keyring: Rc::new(NullableKeyring::with_credentials(credentials)),
158+
keyring: Arc::new(NullableKeyring::with_credentials(credentials)),
158159
creds: Default::default(),
159160
};
160161
this.load().await?;
@@ -168,12 +169,13 @@ impl Credentials {
168169
.await
169170
.map_err(|e| capnp::Error::failed(e.to_string()))?;
170171

171-
self.creds.borrow_mut().clear();
172+
let mut lock = self.creds.write().unwrap();
173+
lock.clear();
172174
for item in values {
173175
let attrs = item
174176
.attributes()
175177
.await;
176-
self.creds.borrow_mut().insert(
178+
lock.insert(
177179
attrs["server"].to_string(),
178180
Credential {
179181
username: attrs["username"].to_string(),
@@ -184,14 +186,14 @@ impl Credentials {
184186
Ok(())
185187
}
186188
pub fn get(&self, server: &str) -> Option<Credential> {
187-
self.creds.borrow().get(server).cloned()
189+
self.creds.read().unwrap().get(server).cloned()
188190
}
189191
pub fn list_all(&self) -> HashMap<String, Credential> {
190-
self.creds.borrow().clone()
192+
self.creds.read().unwrap().clone()
191193
}
192194
pub async fn insert(&self, server: &str, username: &str, password: &str) -> anyhow::Result<()> {
193195
{
194-
if let Some(cred) = self.creds.borrow().get(server) {
196+
if let Some(cred) = self.creds.read().unwrap().get(server) {
195197
if cred.username != username {
196198
anyhow::bail!("You can add only one account per server");
197199
}
@@ -207,7 +209,7 @@ impl Credentials {
207209
.await
208210
.map_err(|e| capnp::Error::failed(e.to_string()))?;
209211

210-
self.creds.borrow_mut().insert(
212+
self.creds.write().unwrap().insert(
211213
server.to_string(),
212214
Credential {
213215
username: username.to_string(),
@@ -219,7 +221,8 @@ impl Credentials {
219221
pub async fn delete(&self, server: &str) -> anyhow::Result<()> {
220222
let creds = {
221223
self.creds
222-
.borrow()
224+
.read()
225+
.unwrap()
223226
.get(server)
224227
.ok_or(anyhow::anyhow!("server creds not found"))?
225228
.clone()
@@ -234,7 +237,8 @@ impl Credentials {
234237
.await
235238
.map_err(|e| capnp::Error::failed(e.to_string()))?;
236239
self.creds
237-
.borrow_mut()
240+
.write()
241+
.unwrap()
238242
.remove(server)
239243
.ok_or(anyhow::anyhow!("server creds not found"))?;
240244
Ok(())

0 commit comments

Comments
 (0)