remove 30-day limit on scraper keys
parent
49c1a2fbd7
commit
caaed8a5e1
|
@ -15,7 +15,6 @@ use crate::{
|
||||||
errors::ConfigError,
|
errors::ConfigError,
|
||||||
key_validity::{
|
key_validity::{
|
||||||
ScraperKey,
|
ScraperKey,
|
||||||
Valid30Days,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -99,7 +98,6 @@ pub mod file {
|
||||||
use crate::key_validity::{
|
use crate::key_validity::{
|
||||||
BlakeHashWrapper,
|
BlakeHashWrapper,
|
||||||
ScraperKey,
|
ScraperKey,
|
||||||
Valid30Days,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive (Clone, Debug, Deserialize, Serialize)]
|
#[derive (Clone, Debug, Deserialize, Serialize)]
|
||||||
|
@ -142,7 +140,7 @@ pub mod file {
|
||||||
pub servers: Option <Vec <Server>>,
|
pub servers: Option <Vec <Server>>,
|
||||||
|
|
||||||
// Adding a DB will take a while, so I'm moving these out of dev mode.
|
// Adding a DB will take a while, so I'm moving these out of dev mode.
|
||||||
pub scraper_keys: Option <Vec <ScraperKey <Valid30Days>>>,
|
pub scraper_keys: Option <Vec <ScraperKey>>,
|
||||||
|
|
||||||
pub news_url: Option <String>,
|
pub news_url: Option <String>,
|
||||||
}
|
}
|
||||||
|
@ -156,7 +154,7 @@ pub struct Config {
|
||||||
pub address: IpAddr,
|
pub address: IpAddr,
|
||||||
pub port: Option <u16>,
|
pub port: Option <u16>,
|
||||||
pub servers: HashMap <String, file::Server>,
|
pub servers: HashMap <String, file::Server>,
|
||||||
pub scraper_keys: HashMap <String, ScraperKey <Valid30Days>>,
|
pub scraper_keys: HashMap <String, ScraperKey>,
|
||||||
pub news_url: Option <String>,
|
pub news_url: Option <String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,36 +78,17 @@ impl Serialize for BlakeHashWrapper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Valid7Days;
|
|
||||||
pub struct Valid30Days;
|
|
||||||
//pub struct Valid90Days;
|
|
||||||
|
|
||||||
pub trait MaxValidDuration {
|
pub trait MaxValidDuration {
|
||||||
fn dur () -> Duration;
|
fn dur () -> Duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MaxValidDuration for Valid7Days {
|
|
||||||
fn dur () -> Duration {
|
|
||||||
Duration::days (7)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl MaxValidDuration for Valid30Days {
|
|
||||||
fn dur () -> Duration {
|
|
||||||
Duration::days (30)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive (Deserialize)]
|
#[derive (Deserialize)]
|
||||||
pub struct ScraperKey <V: MaxValidDuration> {
|
pub struct ScraperKey {
|
||||||
name: String,
|
name: String,
|
||||||
|
|
||||||
not_before: DateTime <Utc>,
|
not_before: DateTime <Utc>,
|
||||||
not_after: DateTime <Utc>,
|
not_after: DateTime <Utc>,
|
||||||
pub hash: BlakeHashWrapper,
|
pub hash: BlakeHashWrapper,
|
||||||
|
|
||||||
#[serde (default)]
|
|
||||||
_phantom: std::marker::PhantomData <V>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive (Copy, Clone, Debug, PartialEq)]
|
#[derive (Copy, Clone, Debug, PartialEq)]
|
||||||
|
@ -121,21 +102,20 @@ pub enum KeyValidity {
|
||||||
DurationNegative,
|
DurationNegative,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl <V: MaxValidDuration> ScraperKey <V> {
|
impl ScraperKey {
|
||||||
pub fn new_30_day <S: Into <String>> (name: S, input: &[u8]) -> Self {
|
pub fn new_30_day <S: Into <String>> (name: S, input: &[u8]) -> Self {
|
||||||
let now = Utc::now ();
|
let now = Utc::now ();
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
name: name.into (),
|
name: name.into (),
|
||||||
not_before: now,
|
not_before: now,
|
||||||
not_after: now + V::dur (),
|
not_after: now + Duration::days (30),
|
||||||
hash: BlakeHashWrapper::from_key (input),
|
hash: BlakeHashWrapper::from_key (input),
|
||||||
_phantom: Default::default (),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl <V: MaxValidDuration> ScraperKey <V> {
|
impl ScraperKey {
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn is_valid (&self, now: DateTime <Utc>, input: &[u8]) -> KeyValidity {
|
pub fn is_valid (&self, now: DateTime <Utc>, input: &[u8]) -> KeyValidity {
|
||||||
use KeyValidity::*;
|
use KeyValidity::*;
|
||||||
|
@ -152,13 +132,6 @@ impl <V: MaxValidDuration> ScraperKey <V> {
|
||||||
return DurationNegative;
|
return DurationNegative;
|
||||||
}
|
}
|
||||||
|
|
||||||
let max_dur = V::dur ();
|
|
||||||
let actual_dur = self.not_after - self.not_before;
|
|
||||||
|
|
||||||
if actual_dur > max_dur {
|
|
||||||
return DurationTooLong (max_dur);
|
|
||||||
}
|
|
||||||
|
|
||||||
if now >= self.not_after {
|
if now >= self.not_after {
|
||||||
return Expired;
|
return Expired;
|
||||||
}
|
}
|
||||||
|
@ -196,12 +169,11 @@ mod tests {
|
||||||
fn duration_negative () {
|
fn duration_negative () {
|
||||||
let zero_time = Utc::now ();
|
let zero_time = Utc::now ();
|
||||||
|
|
||||||
let key = ScraperKey::<Valid30Days> {
|
let key = ScraperKey {
|
||||||
name: "automated testing".to_string (),
|
name: "automated testing".to_string (),
|
||||||
not_before: zero_time + Duration::days (1 + 2),
|
not_before: zero_time + Duration::days (1 + 2),
|
||||||
not_after: zero_time + Duration::days (1),
|
not_after: zero_time + Duration::days (1),
|
||||||
hash: BlakeHashWrapper::from_key ("bad_password".as_bytes ()),
|
hash: BlakeHashWrapper::from_key ("bad_password".as_bytes ()),
|
||||||
_phantom: Default::default (),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let err = DurationNegative;
|
let err = DurationNegative;
|
||||||
|
@ -215,46 +187,22 @@ mod tests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn key_valid_too_long () {
|
|
||||||
let zero_time = Utc::now ();
|
|
||||||
|
|
||||||
let key = ScraperKey::<Valid30Days> {
|
|
||||||
name: "automated testing".to_string (),
|
|
||||||
not_before: zero_time + Duration::days (1),
|
|
||||||
not_after: zero_time + Duration::days (1 + 31),
|
|
||||||
hash: BlakeHashWrapper::from_key ("bad_password".as_bytes ()),
|
|
||||||
_phantom: Default::default (),
|
|
||||||
};
|
|
||||||
|
|
||||||
let err = DurationTooLong (Duration::days (30));
|
|
||||||
|
|
||||||
for (input, expected) in &[
|
|
||||||
(zero_time + Duration::days (0), err),
|
|
||||||
(zero_time + Duration::days (2), err),
|
|
||||||
(zero_time + Duration::days (100), err),
|
|
||||||
] {
|
|
||||||
assert_eq! (key.is_valid (*input, "bad_password".as_bytes ()), *expected);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn normal_key () {
|
fn normal_key () {
|
||||||
let zero_time = Utc::now ();
|
let zero_time = Utc::now ();
|
||||||
|
|
||||||
let key = ScraperKey::<Valid30Days> {
|
let key = ScraperKey {
|
||||||
name: "automated testing".to_string (),
|
name: "automated testing".to_string (),
|
||||||
not_before: zero_time + Duration::days (1),
|
not_before: zero_time + Duration::days (1),
|
||||||
not_after: zero_time + Duration::days (1 + 30),
|
not_after: zero_time + Duration::days (1 + 60),
|
||||||
hash: BlakeHashWrapper::from_key ("bad_password".as_bytes ()),
|
hash: BlakeHashWrapper::from_key ("bad_password".as_bytes ()),
|
||||||
_phantom: Default::default (),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
for (input, expected) in &[
|
for (input, expected) in &[
|
||||||
(zero_time + Duration::days (0), ClockIsBehind),
|
(zero_time + Duration::days (0), ClockIsBehind),
|
||||||
(zero_time + Duration::days (2), Valid),
|
(zero_time + Duration::days (2), Valid),
|
||||||
(zero_time + Duration::days (29), Valid),
|
(zero_time + Duration::days (60 - 1), Valid),
|
||||||
(zero_time + Duration::days (1 + 30), Expired),
|
(zero_time + Duration::days (60 + 1), Expired),
|
||||||
(zero_time + Duration::days (100), Expired),
|
(zero_time + Duration::days (100), Expired),
|
||||||
] {
|
] {
|
||||||
assert_eq! (key.is_valid (*input, "bad_password".as_bytes ()), *expected);
|
assert_eq! (key.is_valid (*input, "bad_password".as_bytes ()), *expected);
|
||||||
|
@ -265,12 +213,11 @@ mod tests {
|
||||||
fn wrong_key () {
|
fn wrong_key () {
|
||||||
let zero_time = Utc::now ();
|
let zero_time = Utc::now ();
|
||||||
|
|
||||||
let key = ScraperKey::<Valid30Days> {
|
let key = ScraperKey {
|
||||||
name: "automated testing".to_string (),
|
name: "automated testing".to_string (),
|
||||||
not_before: zero_time + Duration::days (1),
|
not_before: zero_time + Duration::days (1),
|
||||||
not_after: zero_time + Duration::days (1 + 30),
|
not_after: zero_time + Duration::days (1 + 30),
|
||||||
hash: BlakeHashWrapper::from_key ("bad_password".as_bytes ()),
|
hash: BlakeHashWrapper::from_key ("bad_password".as_bytes ()),
|
||||||
_phantom: Default::default (),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
for input in &[
|
for input in &[
|
||||||
|
|
|
@ -312,7 +312,7 @@ impl Builder {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn scraper_key (mut self, key: crate::key_validity::ScraperKey <crate::key_validity::Valid30Days>)
|
pub fn scraper_key (mut self, key: crate::key_validity::ScraperKey)
|
||||||
-> Self
|
-> Self
|
||||||
{
|
{
|
||||||
self.config.scraper_keys.insert (key.hash.encode_base64 (), key);
|
self.config.scraper_keys.insert (key.hash.encode_base64 (), key);
|
||||||
|
|
|
@ -224,7 +224,6 @@ mod tests {
|
||||||
|
|
||||||
use tokio::runtime::Runtime;
|
use tokio::runtime::Runtime;
|
||||||
use crate::{
|
use crate::{
|
||||||
config,
|
|
||||||
key_validity,
|
key_validity,
|
||||||
};
|
};
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
Loading…
Reference in New Issue