Skip to content

Commit cec5267

Browse files
authored
Merge pull request #6 from RobDWaller/0.2.0-beta
0.2.0 beta
2 parents 34e8ee3 + 361c27d commit cec5267

8 files changed

Lines changed: 63 additions & 93 deletions

File tree

.cargo/config

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[alias]
2+
lint = "fmt -- --check"
3+
analyse = "clippy --all-targets --all-features -- -D warnings"

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "csp_generator"
33
description = "Consume a JSON formatted list of domains and CSP directives and output a correctly formatted Content Security Policy string."
4-
version = "0.1.0-rc.1"
4+
version = "0.2.0-beta"
55
authors = ["Rob Waller <rdwaller1984@gmail.com>"]
66
edition = "2018"
77
keywords = ["csp", "json", "content-security", "csp-generator", "security"]

src/directives/line.rs

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use crate::domains;
1+
use crate::domains::{Collection, Item};
22

3-
fn domains_to_directive(directive: String, domains: Vec<domains::Item>) -> String {
3+
fn domains_to_directive(directive: String, domains: Vec<Item>) -> String {
44
let mut directive_line = directive.clone();
55

66
for domain in domains {
@@ -27,8 +27,8 @@ fn create_check(mut directive: String) -> String {
2727
directive
2828
}
2929

30-
pub fn build(directive: String, domains: domains::Collection) -> String {
31-
let directive_line = domains_to_directive(directive.clone(), domains.domains);
30+
pub fn build(directive: String, domains: Collection) -> String {
31+
let directive_line = domains_to_directive(directive.clone(), domains);
3232

3333
check_line(directive_line, create_check(directive))
3434
}
@@ -38,25 +38,21 @@ pub fn build(directive: String, domains: domains::Collection) -> String {
3838
// -----
3939
#[cfg(test)]
4040
mod lines_test {
41-
use crate::domains;
41+
use crate::domains::{Collection, Item};
4242

4343
#[test]
4444
fn test_build() {
4545
let directives: Vec<String> = vec![String::from("connect-src"), String::from("script-src")];
4646

47-
let item = domains::Item {
47+
let item = Item {
4848
domain: String::from("*.example.com"),
4949
directive: directives,
5050
};
5151

52-
let mut domain_list: Vec<domains::Item> = Vec::new();
52+
let mut domain_list: Collection = Vec::new();
5353
domain_list.push(item);
5454

55-
let json = domains::Collection {
56-
domains: domain_list,
57-
};
58-
59-
let connect_src: String = super::build(String::from("connect-src"), json);
55+
let connect_src: String = super::build(String::from("connect-src"), domain_list);
6056

6157
assert_eq!(connect_src, String::from("connect-src *.example.com; "));
6258
}
@@ -65,19 +61,15 @@ mod lines_test {
6561
fn test_build_line_no_directive() {
6662
let directives: Vec<String> = vec![String::from("connect-src"), String::from("script-src")];
6763

68-
let item = domains::Item {
64+
let item = Item {
6965
domain: String::from("*.example.com"),
7066
directive: directives,
7167
};
7268

73-
let mut domain_list: Vec<domains::Item> = Vec::new();
69+
let mut domain_list: Collection = Vec::new();
7470
domain_list.push(item);
7571

76-
let json = domains::Collection {
77-
domains: domain_list,
78-
};
79-
80-
let default_src: String = super::build(String::from("default-src"), json);
72+
let default_src: String = super::build(String::from("default-src"), domain_list);
8173

8274
assert_eq!(default_src, String::from(""));
8375
}

src/directives/mod.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,10 @@ mod directives_test {
4242
#[test]
4343
fn test_build_directives() {
4444
let json = r#"
45-
{
46-
"domains": [
47-
{"domain": "example.com", "directive": ["connect-src"]},
48-
{"domain": "test.com", "directive": ["connect-src", "script-src"]}
49-
]
50-
}
45+
[
46+
{"domain": "example.com", "directive": ["connect-src"]},
47+
{"domain": "test.com", "directive": ["connect-src", "script-src"]}
48+
]
5149
"#;
5250

5351
let csp: Result<String, error::Error> = super::build(config::get_directives(), json);

src/directives/threads.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
use crate::directives::line;
2-
use crate::domains;
2+
use crate::domains::Collection;
33
use std::thread;
44
use std::thread::JoinHandle;
55

6-
fn create(directive: String, domains: domains::Collection) -> JoinHandle<String> {
6+
fn create(directive: String, domains: Collection) -> JoinHandle<String> {
77
thread::spawn(move || line::build(directive, domains.clone()))
88
}
99

10-
pub fn build_lines(
11-
directives: Vec<String>,
12-
domains: domains::Collection,
13-
) -> Vec<JoinHandle<String>> {
10+
pub fn build_lines(directives: Vec<String>, domains: Collection) -> Vec<JoinHandle<String>> {
1411
let mut threads: Vec<JoinHandle<String>> = vec![];
1512

1613
for directive in directives {
@@ -25,20 +22,19 @@ pub fn build_lines(
2522
// -----
2623
#[cfg(test)]
2724
mod threads_test {
28-
use crate::domains;
25+
use crate::domains::{Collection, Item};
2926

3027
#[test]
3128
fn test_create() {
3229
let domain = String::from("*.google.com");
3330
let directive = vec![String::from("connect-src")];
3431

35-
let domain = domains::Item { domain, directive };
36-
let domains = vec![domain];
37-
let collection = domains::Collection { domains };
32+
let domain = Item { domain, directive };
33+
let domains: Collection = vec![domain];
3834

3935
let directive_check = String::from("connect-src");
4036

41-
let result = super::create(directive_check, collection);
37+
let result = super::create(directive_check, domains);
4238

4339
assert_eq!(
4440
result.join().unwrap().as_str(),

src/domains.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@ pub struct Item {
44
pub directive: Vec<String>,
55
}
66

7-
#[derive(Serialize, Deserialize, Clone)]
8-
pub struct Collection {
9-
pub domains: Vec<Item>,
10-
}
7+
pub type Collection = Vec<Item>;
118

129
// -----
1310
// Tests
@@ -36,12 +33,10 @@ mod item_test {
3633
directive: directives,
3734
};
3835

39-
let mut domains: Vec<super::Item> = vec![];
36+
let mut domains: super::Collection = vec![];
4037
domains.push(item);
4138

42-
let collection = super::Collection { domains };
43-
44-
assert_eq!(collection.domains[0].domain, "*.example.com");
45-
assert_eq!(collection.domains[0].directive[1], "script-src");
39+
assert_eq!(domains[0].domain, "*.example.com");
40+
assert_eq!(domains[0].directive[1], "script-src");
4641
}
4742
}

src/parse.rs

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
use crate::domains;
1+
use crate::domains::Collection;
22
use serde_json::error;
33

4-
pub fn json(json: &str) -> Result<domains::Collection, error::Error> {
4+
pub fn json(json: &str) -> Result<Collection, error::Error> {
55
let result = serde_json::from_str(json);
66

77
match result {
88
Ok(result) => {
9-
let parsed: domains::Collection = result;
9+
let parsed: Collection = result;
1010
Ok(parsed)
1111
}
1212
Err(e) => Err(e),
@@ -21,19 +21,17 @@ mod parse_json_test {
2121
#[test]
2222
fn test_parse_json() {
2323
let json = r#"
24-
{
25-
"domains": [
26-
{"domain": "example.com", "directive": ["connect-src", "script-src"]},
27-
{"domain": "test.com", "directive": ["script-src", "img-src", "style-src"]}
28-
]
29-
}
24+
[
25+
{"domain": "example.com", "directive": ["connect-src", "script-src"]},
26+
{"domain": "test.com", "directive": ["script-src", "img-src", "style-src"]}
27+
]
3028
"#;
3129

3230
let domains = super::json(json).unwrap();
3331

34-
assert_eq!(domains.domains[0].domain, "example.com");
35-
assert_eq!(domains.domains[1].domain, "test.com");
36-
assert_eq!(domains.domains[1].directive[1], "img-src");
32+
assert_eq!(domains[0].domain, "example.com");
33+
assert_eq!(domains[1].domain, "test.com");
34+
assert_eq!(domains[1].directive[1], "img-src");
3735
}
3836

3937
#[test]
@@ -48,11 +46,9 @@ mod parse_json_test {
4846
#[test]
4947
fn test_parse_json_bad() {
5048
let json = r#"
51-
{
52-
"domains": [
53-
{"domain": "example.com", "diroctive": ["connect-src", "script-src"]}
54-
]
55-
}
49+
[
50+
{"domain": "example.com", "diroctive": ["connect-src", "script-src"]}
51+
]
5652
"#;
5753

5854
let domains = super::json(json);

tests/csp_generator_test.rs

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ mod csp_generator_test {
66
#[test]
77
fn test_enforce() {
88
let json = r#"
9-
{
10-
"domains": [
11-
{"domain": "example.com", "directive": ["connect-src"]},
12-
{"domain": "test.com", "directive": ["connect-src", "script-src"]}
13-
]
14-
}
9+
[
10+
{"domain": "example.com", "directive": ["connect-src"]},
11+
{"domain": "test.com", "directive": ["connect-src", "script-src"]}
12+
]
1513
"#;
1614

1715
let csp: csp_generator::Csp = csp_generator::enforce(config::get_directives(), json);
@@ -35,12 +33,10 @@ mod csp_generator_test {
3533
#[should_panic(expected = "Could not parse JSON: missing field")]
3634
fn test_enforce_format_fail() {
3735
let json = r#"
38-
{
39-
"domains": [
40-
{"domain": "example.com", "diroctive": ["connect-src"]},
41-
{"domain": "test.com", "directive": ["connect-src", "script-src"]}
42-
]
43-
}
36+
[
37+
{"domain": "example.com", "diroctive": ["connect-src"]},
38+
{"domain": "test.com", "directive": ["connect-src", "script-src"]}
39+
]
4440
"#;
4541

4642
csp_generator::enforce(config::get_directives(), json);
@@ -49,12 +45,10 @@ mod csp_generator_test {
4945
#[test]
5046
fn test_report_only() {
5147
let json = r#"
52-
{
53-
"domains": [
54-
{"domain": "example.com", "directive": ["connect-src"]},
55-
{"domain": "test.com", "directive": ["connect-src", "script-src"]}
56-
]
57-
}
48+
[
49+
{"domain": "example.com", "directive": ["connect-src"]},
50+
{"domain": "test.com", "directive": ["connect-src", "script-src"]}
51+
]
5852
"#;
5953

6054
let csp: csp_generator::Csp = csp_generator::report_only(config::get_directives(), json);
@@ -81,12 +75,10 @@ mod csp_generator_test {
8175
#[should_panic(expected = "Could not parse JSON: missing field")]
8276
fn test_report_only_format_fail() {
8377
let json = r#"
84-
{
85-
"domains": [
86-
{"domain": "example.com", "directive": ["connect-src"]},
87-
{"directive": ["connect-src", "script-src"]}
88-
]
89-
}
78+
[
79+
{"domain": "example.com", "directive": ["connect-src"]},
80+
{"directive": ["connect-src", "script-src"]}
81+
]
9082
"#;
9183

9284
csp_generator::report_only(config::get_directives(), json);
@@ -95,12 +87,10 @@ mod csp_generator_test {
9587
#[test]
9688
fn test_csp_only() {
9789
let json = r#"
98-
{
99-
"domains": [
100-
{"domain": "example.com", "directive": ["connect-src"]},
101-
{"domain": "test.com", "directive": ["connect-src", "script-src"]}
102-
]
103-
}
90+
[
91+
{"domain": "example.com", "directive": ["connect-src"]},
92+
{"domain": "test.com", "directive": ["connect-src", "script-src"]}
93+
]
10494
"#;
10595

10696
let csp: String = csp_generator::csp_only(config::get_directives(), json);

0 commit comments

Comments
 (0)