1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
extern crate base64;
extern crate futures;
extern crate hyper;
extern crate hyper_rustls;
extern crate tokio_core;
extern crate serde;
extern crate serde_json;
#[macro_use]
extern crate error_chain;
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate log;
extern crate libflate;
extern crate tar;
extern crate strum;
#[macro_use]
extern crate strum_macros;
pub mod errors;
pub mod mediatypes;
pub mod reference;
pub mod render;
pub mod v2;
use std::collections::HashMap;
use std::io::Read;
use errors::Result;
pub static USER_AGENT: &'static str = "camallo-dkregistry/0.0";
pub fn get_credentials<T: Read>(
reader: T,
index: &str,
) -> Result<(Option<String>, Option<String>)> {
let map: Auths = try!(serde_json::from_reader(reader));
let real_index = match index {
"docker.io" |
"registry-1.docker.io" => "https://index.docker.io/v1/",
other => other,
};
let auth = match map.auths.get(real_index) {
Some(x) => try!(base64::decode(x.auth.as_str())),
None => bail!("no auth for index"),
};
let s = try!(String::from_utf8(auth));
let creds: Vec<&str> = s.splitn(2, ':').collect();
let up = match (creds.get(0), creds.get(1)) {
(Some(&""), Some(p)) => (None, Some(p.to_string())),
(Some(u), Some(&"")) => (Some(u.to_string()), None),
(Some(u), Some(p)) => (Some(u.to_string()), Some(p.to_string())),
(_, _) => (None, None),
};
trace!("Found credentials for user={:?} on {}", up.0, index);
Ok(up)
}
#[derive(Debug, Deserialize, Serialize)]
struct Auths {
auths: HashMap<String, AuthObj>,
}
#[derive(Debug, Default, Deserialize, Serialize)]
struct AuthObj {
auth: String,
}