-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(backend): Implement get parameters
Also implement type wrapper for SecStr in order to de- and serialize it more easily. Fixed some start up issues as well. Refs: #2
- Loading branch information
Showing
20 changed files
with
700 additions
and
200 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
pub mod aws; | ||
pub mod secure_string; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
use std::fmt::Formatter; | ||
|
||
use secstr::SecStr; | ||
use serde::de::{Error, Visitor}; | ||
use serde::{Deserializer, Serializer}; | ||
|
||
#[derive(Debug, Eq, PartialEq, Clone)] | ||
pub struct SecureString(SecStr); | ||
|
||
impl SecureString { | ||
pub fn new(bytes: Vec<u8>) -> SecureString { | ||
SecureString(SecStr::from(bytes)) | ||
} | ||
|
||
pub fn as_str(&self) -> &str { | ||
std::str::from_utf8(self.0.unsecure()).expect("should be serializable to be UTF-8 string") | ||
} | ||
} | ||
|
||
impl From<&str> for SecureString { | ||
fn from(s: &str) -> Self { | ||
SecureString(SecStr::from(s)) | ||
} | ||
} | ||
|
||
impl From<String> for SecureString { | ||
fn from(value: String) -> Self { | ||
SecureString(SecStr::from(value)) | ||
} | ||
} | ||
|
||
impl From<Vec<u8>> for SecureString { | ||
fn from(bytes: Vec<u8>) -> Self { | ||
SecureString(SecStr::new(bytes)) | ||
} | ||
} | ||
|
||
impl serde::Serialize for SecureString { | ||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> | ||
where | ||
S: Serializer, | ||
{ | ||
let secure_str = &self.0.unsecure(); | ||
let utf8_str = std::str::from_utf8(secure_str).expect("should serialize to utf8 string"); | ||
|
||
serializer.serialize_str(utf8_str) | ||
} | ||
} | ||
|
||
struct SecureStringVisitor; | ||
|
||
impl<'de> Visitor<'de> for SecureStringVisitor { | ||
type Value = SecureString; | ||
|
||
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result { | ||
formatter.write_str("struct SecureString") | ||
} | ||
|
||
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> | ||
where | ||
E: Error, | ||
{ | ||
Ok(SecureString(SecStr::from(v))) | ||
} | ||
|
||
fn visit_string<E>(self, v: String) -> Result<Self::Value, E> | ||
where | ||
E: Error, | ||
{ | ||
Ok(SecureString(SecStr::from(v))) | ||
} | ||
} | ||
|
||
impl<'de> serde::Deserialize<'de> for SecureString { | ||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> | ||
where | ||
D: Deserializer<'de>, | ||
{ | ||
deserializer.deserialize_str(SecureStringVisitor) | ||
} | ||
} | ||
|
||
#[cfg(test)] | ||
mod tests { | ||
use spectral::prelude::*; | ||
|
||
use super::*; | ||
|
||
#[test] | ||
fn should_serialize_secure_string_to_string() { | ||
let secure_str = SecureString(SecStr::from("super_secret_password")); | ||
|
||
let serialized = serde_json::to_string(&secure_str).unwrap(); | ||
|
||
assert_that!(serialized).is_equal_to("\"super_secret_password\"".to_string()) | ||
} | ||
|
||
#[test] | ||
fn should_serialize_empty_secure_string_to_string() { | ||
let secure_str = SecureString(SecStr::from("")); | ||
|
||
let serialized = serde_json::to_string(&secure_str).unwrap(); | ||
|
||
assert_that!(serialized).is_equal_to("\"\"".to_string()); | ||
} | ||
|
||
#[test] | ||
fn should_serialize_secure_string_with_special_chars_to_string() { | ||
let secure_str = SecureString(SecStr::from("s3cr3t_$tr!ng")); | ||
|
||
let serialized = serde_json::to_string(&secure_str).unwrap(); | ||
|
||
assert_eq!(serialized, "\"s3cr3t_$tr!ng\""); | ||
} | ||
|
||
#[test] | ||
fn should_deserialize_str_to_secure_string() { | ||
let serialized = "\"super_secret_password\""; | ||
|
||
let deserialized: SecureString = serde_json::from_str(serialized).unwrap(); | ||
|
||
assert_eq!( | ||
deserialized.0.unsecure(), | ||
"super_secret_password".as_bytes() | ||
); | ||
} | ||
|
||
#[test] | ||
fn should_deserialize_empty_str_to_secure_string() { | ||
let serialized = "\"\""; | ||
|
||
let deserialized: SecureString = serde_json::from_str(serialized).unwrap(); | ||
|
||
assert_eq!(deserialized.0.unsecure(), "".as_bytes()); | ||
} | ||
|
||
#[test] | ||
fn should_deserialize_str_with_special_chars_to_secure_string() { | ||
let serialized = "\"s3cr3t_$tr!ng\""; | ||
|
||
let deserialized: SecureString = serde_json::from_str(serialized).unwrap(); | ||
|
||
assert_eq!(deserialized.0.unsecure(), "s3cr3t_$tr!ng".as_bytes()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
mod common; | ||
pub mod common; | ||
pub mod credentials; | ||
pub mod parameters; | ||
pub mod profiles; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
mod application; | ||
pub mod application; | ||
pub mod core; | ||
pub mod infrastructure; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
pub mod tauri; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
pub mod parameters_handler; |
17 changes: 17 additions & 0 deletions
17
src-tauri/src/parameters/application/tauri/parameters_handler.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
use std::sync::Arc; | ||
|
||
use crate::parameters::core::api::ParameterDataAPI; | ||
use crate::parameters::core::domain::Parameter; | ||
use crate::parameters::core::error::ParameterDataError; | ||
|
||
#[tauri::command] | ||
#[cfg(not(tarpaulin_include))] | ||
pub async fn get_parameters( | ||
api: tauri::State<'_, Arc<dyn ParameterDataAPI>>, | ||
profile_name: String, | ||
page_size: u32, | ||
) -> Result<Vec<Parameter>, ParameterDataError> { | ||
let result = api.get_parameters(profile_name.as_str(), page_size).await; | ||
|
||
result.map_err(ParameterDataError::from) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
pub mod api; | ||
pub mod domain; | ||
pub mod error; | ||
mod parameter_service; | ||
pub mod parameter_service; | ||
pub mod spi; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,21 @@ | ||
use aws_sdk_sts::primitives::DateTime; | ||
use secstr::SecStr; | ||
use chrono::{DateTime, Utc}; | ||
use serde::{Deserialize, Serialize}; | ||
|
||
#[derive(Debug, Clone, PartialEq)] | ||
use crate::common::secure_string::SecureString; | ||
|
||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] | ||
pub enum ParameterValue { | ||
String(String), | ||
StringList(Vec<String>), | ||
SecureString(SecStr), | ||
SecureString(SecureString), | ||
} | ||
|
||
#[derive(Debug, Clone, PartialEq)] | ||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] | ||
pub struct Parameter { | ||
pub name: String, | ||
pub value: ParameterValue, | ||
pub version: i64, | ||
pub last_modified_date: Option<DateTime>, | ||
// #[serde(with = "ts_milliseconds_option")] | ||
pub last_modified_date: Option<DateTime<Utc>>, | ||
pub identifier: Option<String>, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.