/* This Source Code Form is subject to the terms of the Mozilla Public *License,v.2.0.IfacopyoftheMPLwasnotdistributedwiththis
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
let stored = StoredValue {
data: data.to_vec(),
timestamp,
};
let plaintext = serde_json::to_vec(&stored)?;
let (dek, cipher_suite, _) = self
.keystore
.get_dek_internal(&self.collection_name, &self.kek_ref)?;
let data_to_store = crypto::encrypt_with_key(&plaintext, &dek, cipher_suite)?;
let full_key = format!("{}::{}", self.collection_name, entry_name); let value = utils::bytes_to_value(&data_to_store)?;
let db = Database::new(&self.store, &self.collection_name); let key_obj = Key::from(full_key.as_str());
db.put(&[(key_obj, Some(value))])?;
Ok(())
}
pubfn get(&self, entry_name: &str) -> Result<Vec<u8>, LockstoreError> { let full_key = format!("{}::{}", self.collection_name, entry_name); let db = Database::new(&self.store, &self.collection_name); let key_obj = Key::from(full_key.as_str());
let value = db
.get(&key_obj, &GetOptions::default())?
.ok_or_else(|| LockstoreError::NotFound(entry_name.to_string()))?;
let stored_bytes = utils::value_to_bytes(&value)?;
let (dek, _cipher_suite, _) = self
.keystore
.get_dek_internal(&self.collection_name, &self.kek_ref)?;
let plaintext = crypto::decrypt_with_key(&stored_bytes, &dek)?;
let stored: StoredValue = serde_json::from_slice(&plaintext)?;
Ok(stored.data)
}
pubfn delete(&self, entry_name: &str) -> Result<(), LockstoreError> { let full_key = format!("{}::{}", self.collection_name, entry_name); let db = Database::new(&self.store, &self.collection_name); let key_obj = Key::from(full_key.as_str());
if !db.has(&key_obj, &GetOptions::default())? { return Err(LockstoreError::NotFound(entry_name.to_string()));
}
db.delete(&key_obj)?;
Ok(())
}
pubfn keys(&self) -> Result<Vec<String>, LockstoreError> { let reader = self.store.reader()?; let prefix = format!("{}::", self.collection_name);
let entries = reader
.read(|conn| { letmut stmt = conn
.prepare( "SELECT data.key FROM data
JOIN dbs ON data.db_id = dbs.id WHERE dbs.name = ?1
AND data.key LIKE ?2
ORDER BY data.key",
)
.map_err(DatabaseError::from)?;
let pattern = format!("{}%", prefix); let entry_strings: Result<Vec<String>, _> = stmt
.query_map([&self.collection_name, &pattern], |row| { let key: String = row.get(0)?;
Ok(key.strip_prefix(&prefix).unwrap_or(&key).to_string())
})
.map_err(DatabaseError::from)?
.collect();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.