summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-02-06 09:37:48 +0200
committerLars Wirzenius <liw@liw.fi>2021-02-06 09:37:48 +0200
commit6461ea45a26d0858cd2205ba97c200239f531008 (patch)
tree0d824b05fc2cd2ed8d841bc38af89f0848b744ff
parentac460fecfa2795f1eeb2d2171b977e52af7dd24e (diff)
downloadobnam2-6461ea45a26d0858cd2205ba97c200239f531008.tar.gz
feat: client requires an HTTPS URL for server
-rw-r--r--obnam.md19
-rw-r--r--src/client.rs13
2 files changed, 31 insertions, 1 deletions
diff --git a/obnam.md b/obnam.md
index 6e9085c..47839c7 100644
--- a/obnam.md
+++ b/obnam.md
@@ -1001,6 +1001,25 @@ server_url: https://backup.example.com
~~~
+## Client requires https
+
+This scenario verifies that the client rejects a configuration with a
+server URL using `http:` instead of `https:`.
+
+
+~~~scenario
+given an installed obnam
+and file http.yaml
+when I try to run obnam --config http.yaml config
+then command fails
+then stderr contains "https:"
+~~~
+
+~~~{#http.yaml .file .yaml .numberLines}
+root: live
+server_url: http://backup.example.com
+~~~
+
# Acceptance criteria for Obnam as a whole
The scenarios in this chapter apply to Obnam as a whole: the client
diff --git a/src/client.rs b/src/client.rs
index e8e20eb..3d3b2a5 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -26,6 +26,9 @@ pub struct ClientConfig {
#[derive(Debug, thiserror::Error)]
pub enum ClientConfigError {
+ #[error("server URL doesn't use https: {0}")]
+ NotHttps(String),
+
#[error(transparent)]
IoError(#[from] std::io::Error),
@@ -39,9 +42,17 @@ impl ClientConfig {
pub fn read_config(filename: &Path) -> ClientConfigResult<Self> {
trace!("read_config: filename={:?}", filename);
let config = std::fs::read_to_string(filename)?;
- let config = serde_yaml::from_str(&config)?;
+ let config: ClientConfig = serde_yaml::from_str(&config)?;
+ config.check()?;
Ok(config)
}
+
+ fn check(&self) -> Result<(), ClientConfigError> {
+ if !self.server_url.starts_with("https://") {
+ return Err(ClientConfigError::NotHttps(self.server_url.to_string()));
+ }
+ Ok(())
+ }
}
#[derive(Debug, thiserror::Error)]