Skip to content

Commit def3115

Browse files
authored
Merge branch 'main' into update-diesel
2 parents 6b7d173 + b599aec commit def3115

File tree

17 files changed

+890
-224
lines changed

17 files changed

+890
-224
lines changed

Cargo.lock

Lines changed: 517 additions & 114 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

db/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ where
5656
/// Gets an OV
5757
fn get_ov(guid: &str, conn: &mut T) -> Result<OwnerOV>;
5858

59+
/// Returns all the OVs in the DB
60+
fn get_all_ovs(conn: &mut T) -> Result<Vec<OwnerOV>>;
61+
5962
/// Deletes an OV
6063
fn delete_ov(guid: &str, conn: &mut T) -> Result<()>;
6164

@@ -101,6 +104,9 @@ where
101104
/// Gets an OV
102105
fn get_ov(guid: &str, conn: &mut T) -> Result<RendezvousOV>;
103106

107+
/// Returns all the OVs in the DB
108+
fn get_all_ovs(conn: &mut T) -> Result<Vec<RendezvousOV>>;
109+
104110
/// Deletes an OV
105111
fn delete_ov(guid: &str, conn: &mut T) -> Result<()>;
106112

db/src/postgres.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@ impl DBStoreOwner<PgConnection> for PostgresOwnerDB {
113113
Ok(result)
114114
}
115115

116+
fn get_all_ovs(conn: &mut PgConnection) -> Result<Vec<OwnerOV>> {
117+
let result = super::schema::owner_vouchers::dsl::owner_vouchers
118+
.select(OwnerOV::as_select())
119+
.load(conn)?;
120+
Ok(result)
121+
}
122+
116123
fn delete_ov(guid: &str, conn: &mut PgConnection) -> Result<()> {
117124
diesel::delete(owner_vouchers::dsl::owner_vouchers)
118125
.filter(super::schema::owner_vouchers::guid.eq(guid))
@@ -222,6 +229,13 @@ impl DBStoreRendezvous<PgConnection> for PostgresRendezvousDB {
222229
Ok(result)
223230
}
224231

232+
fn get_all_ovs(conn: &mut PgConnection) -> Result<Vec<RendezvousOV>> {
233+
let result = super::schema::rendezvous_vouchers::dsl::rendezvous_vouchers
234+
.select(RendezvousOV::as_select())
235+
.load(conn)?;
236+
Ok(result)
237+
}
238+
225239
fn delete_ov(guid: &str, conn: &mut PgConnection) -> Result<()> {
226240
diesel::delete(rendezvous_vouchers::dsl::rendezvous_vouchers)
227241
.filter(super::schema::rendezvous_vouchers::guid.eq(guid))

db/src/sqlite.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,13 @@ impl DBStoreOwner<SqliteConnection> for SqliteOwnerDB {
115115
Ok(result)
116116
}
117117

118+
fn get_all_ovs(conn: &mut SqliteConnection) -> Result<Vec<OwnerOV>> {
119+
let result = super::schema::owner_vouchers::dsl::owner_vouchers
120+
.select(OwnerOV::as_select())
121+
.load(conn)?;
122+
Ok(result)
123+
}
124+
118125
fn delete_ov(guid: &str, conn: &mut SqliteConnection) -> Result<()> {
119126
diesel::delete(owner_vouchers::dsl::owner_vouchers)
120127
.filter(super::schema::owner_vouchers::guid.eq(guid))
@@ -224,6 +231,13 @@ impl DBStoreRendezvous<SqliteConnection> for SqliteRendezvousDB {
224231
Ok(result)
225232
}
226233

234+
fn get_all_ovs(conn: &mut SqliteConnection) -> Result<Vec<RendezvousOV>> {
235+
let result = super::schema::rendezvous_vouchers::dsl::rendezvous_vouchers
236+
.select(RendezvousOV::as_select())
237+
.load(conn)?;
238+
Ok(result)
239+
}
240+
227241
fn delete_ov(guid: &str, conn: &mut SqliteConnection) -> Result<()> {
228242
diesel::delete(rendezvous_vouchers::dsl::rendezvous_vouchers)
229243
.filter(super::schema::rendezvous_vouchers::guid.eq(guid))

dracut/52fdo/manufacturing-client-generator

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,28 @@ diun_pub_key_insecure=$(getarg fdo.diun_pub_key_insecure= ||:)
2020
diun_pub_key_hash=$(getarg fdo.diun_pub_key_hash= ||:)
2121
diun_pub_key_root_certs=$(getarg fdo.diun_pub_key_root_certs= ||:)
2222
mfg_string_type_mac_iface=$(getarg fdo.di_mfg_string_type_mac_iface= ||:)
23-
cat >"/etc/manufacturing-client-config" <<EOF
23+
cat >"/run/manufacturing-client-config" <<EOF
2424
# Automatically generated by live-generator
2525
MANUFACTURING_SERVER_URL="${manufacturing_server_url}"
2626
EOF
2727
if [ -n "${diun_pub_key_insecure}" ]; then
28-
cat >>"/etc/manufacturing-client-config" <<EOF
28+
cat >>"/run/manufacturing-client-config" <<EOF
2929
DIUN_PUB_KEY_INSECURE="${diun_pub_key_insecure}"
3030
EOF
3131
fi
3232
if [ -n "${diun_pub_key_hash}" ]; then
33-
cat >>"/etc/manufacturing-client-config" <<EOF
33+
cat >>"/run/manufacturing-client-config" <<EOF
3434
DIUN_PUB_KEY_HASH="${diun_pub_key_hash}"
3535
EOF
3636
fi
3737
if [ -n "${diun_pub_key_root_certs}" ]; then
38-
cat >>"/etc/manufacturing-client-config" <<EOF
38+
cat >>"/run/manufacturing-client-config" <<EOF
3939
DIUN_PUB_KEY_ROOTCERTS="${diun_pub_key_root_certs}"
4040
EOF
4141
fi
4242

4343
if [ -n "${mfg_string_type_mac_iface}" ]; then
44-
cat >>"/etc/manufacturing-client-config" <<EOF
44+
cat >>"/run/manufacturing-client-config" <<EOF
4545
DI_MFG_STRING_TYPE_MAC_IFACE="${mfg_string_type_mac_iface}"
4646
EOF
4747
fi

dracut/52fdo/manufacturing-client.service

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ Description=Manufacturing client DIUN
33
DefaultDependencies=false
44

55
After=coreos-installer.service
6+
Before=coreos-installer-poweroff.service
7+
Before=coreos-installer-noreboot.service
68
Before=coreos-installer-reboot.service
7-
ConditionPathExists=/etc/manufacturing-client-config
9+
ConditionPathExists=/run/manufacturing-client-config
810
Requires=dev-disk-by\x2dlabel-boot.device
911

1012
OnFailure=emergency.target
11-
OnFailureJobMode=replace-irreversibly
13+
OnFailureJobMode=isolate
1214

1315
[Service]
1416
Type=oneshot
1517
Environment=LOG_LEVEL=info
16-
EnvironmentFile=/etc/manufacturing-client-config
18+
EnvironmentFile=/run/manufacturing-client-config
1719
ExecStart=/usr/libexec/manufacturing-client-service
18-
RemainAfterExit=yes
20+
RemainAfterExit=yes

manufacturing-server/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ warp = "0.3.6"
1717
log = "0.4"
1818
hex = "0.4"
1919
serde_yaml = "0.9"
20+
tar = "0.4.41"
21+
flate2 = "1.0.31"
22+
tempdir = "0.3.7"
2023

2124
fdo-data-formats = { path = "../data-formats", version = "0.5.0" }
2225
fdo-http-wrapper = { path = "../http-wrapper", version = "0.5.0", features = ["server"] }

manufacturing-server/src/main.rs

Lines changed: 107 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,32 @@
11
use std::collections::BTreeMap;
22
use std::convert::{TryFrom, TryInto};
3-
use std::fs;
3+
use std::fs::{self, File};
4+
use std::io::Read;
45
use std::str::FromStr;
56
use std::sync::Arc;
67

8+
use fdo_data_formats::{constants::ErrorCode, ProtocolVersion};
9+
use fdo_store::Store;
10+
11+
use warp::{Filter, Rejection};
12+
713
use anyhow::{bail, Context, Error, Result};
814
use openssl::{
915
pkey::{PKey, Private},
1016
x509::X509,
1117
};
1218
use serde_yaml::Value;
19+
use tempdir::TempDir;
1320
use tokio::signal::unix::{signal, SignalKind};
14-
use warp::Filter;
21+
use warp::reply::Response;
1522

1623
use fdo_data_formats::{
1724
constants::{KeyStorageType, MfgStringType, PublicKeyType, RendezvousVariable},
1825
ownershipvoucher::OwnershipVoucher,
1926
publickey::{PublicKey, X5Chain},
2027
types::{Guid, RendezvousInfo},
21-
ProtocolVersion,
28+
Serializable,
2229
};
23-
use fdo_store::Store;
2430
use fdo_util::servers::{
2531
configuration::manufacturing_server::{DiunSettings, ManufacturingServerSettings},
2632
settings_for, yaml_to_cbor, OwnershipVoucherStoreMetadataKey,
@@ -56,7 +62,7 @@ struct ManufacturingServiceUD {
5662
session_store: Arc<fdo_http_wrapper::server::SessionStore>,
5763
ownership_voucher_store: Box<
5864
dyn Store<
59-
fdo_store::WriteOnlyOpen,
65+
fdo_store::ReadWriteOpen,
6066
Guid,
6167
OwnershipVoucher,
6268
OwnershipVoucherStoreMetadataKey,
@@ -267,8 +273,99 @@ async fn main() -> Result<()> {
267273
});
268274

269275
// Initialize handlers
270-
let hello = warp::get().map(|| "Hello from the manufacturing server");
271-
let handler_ping = fdo_http_wrapper::server::ping_handler();
276+
let hello = warp::path::end().map(|| "Hello from the manufacturing server");
277+
let ud = user_data.clone();
278+
let handler_ovs = warp::path!("ov" / String)
279+
.map(move |guid| (guid, ud.clone()))
280+
.and_then(
281+
|(guid, ud): (String, Arc<ManufacturingServiceUD>)| async move {
282+
let typed_guid = match Guid::from_str(&guid) {
283+
Ok(v) => v,
284+
Err(e) => {
285+
return Err(Rejection::from(fdo_http_wrapper::server::Error::new(
286+
ErrorCode::InternalServerError,
287+
fdo_data_formats::constants::MessageType::Invalid,
288+
&e.to_string(),
289+
)))
290+
}
291+
};
292+
let ov = match ud.ownership_voucher_store.load_data(&typed_guid).await {
293+
Ok(ov) => ov.unwrap(),
294+
Err(e) => {
295+
return Err(Rejection::from(fdo_http_wrapper::server::Error::new(
296+
ErrorCode::InternalServerError,
297+
fdo_data_formats::constants::MessageType::Invalid,
298+
&format!("Error loading ownership voucher with guid {}: {}", guid, e),
299+
)))
300+
}
301+
};
302+
let ov_pem = match ov.to_pem() {
303+
Ok(v) => v,
304+
Err(e) => {
305+
return Err(Rejection::from(fdo_http_wrapper::server::Error::new(
306+
ErrorCode::InternalServerError,
307+
fdo_data_formats::constants::MessageType::Invalid,
308+
&format!("Error converting ownership voucher to pem: {}", e),
309+
)))
310+
}
311+
};
312+
let mut res = Response::new(ov_pem.into());
313+
res.headers_mut().insert(
314+
"Content-Type",
315+
warp::http::header::HeaderValue::from_static("application/x-pem-file"),
316+
);
317+
Ok(res)
318+
},
319+
);
320+
let ud = user_data.clone();
321+
let handler_export = warp::post()
322+
.and(warp::path("export").map(move || (ud.clone())).and_then(
323+
|ud: Arc<ManufacturingServiceUD>| async move {
324+
match ud.ownership_voucher_store.load_all_data().await {
325+
Ok(ovs) => Ok(ovs),
326+
Err(_) => Err(Rejection::from(fdo_http_wrapper::server::Error::new(
327+
ErrorCode::InternalServerError,
328+
fdo_data_formats::constants::MessageType::Invalid,
329+
"Error loading ownership vouchers",
330+
))),
331+
}
332+
},
333+
))
334+
.map(|ovs: Vec<OwnershipVoucher>| {
335+
if ovs.is_empty() {
336+
let mut res = Response::new("".into());
337+
*res.status_mut() = warp::http::StatusCode::NOT_FOUND;
338+
return res;
339+
}
340+
let tmp_dir = TempDir::new("manufacturer-server-ovs").unwrap();
341+
for ov in ovs {
342+
let file_path = tmp_dir.path().join(ov.header().guid().to_string());
343+
let tmp_file = File::create(file_path).unwrap();
344+
OwnershipVoucher::serialize_to_writer(&ov, &tmp_file).unwrap();
345+
}
346+
let tmp_dir_archive = TempDir::new("manufacturer-server-ovs-archive").unwrap();
347+
let tar_gz = File::create(tmp_dir_archive.path().join("ovs.tar.gz")).unwrap();
348+
let mut tar = tar::Builder::new(tar_gz);
349+
tar.append_dir_all(".", tmp_dir).unwrap();
350+
tar.finish().unwrap();
351+
let mut file = File::open(tmp_dir_archive.path().join("ovs.tar.gz")).unwrap();
352+
let mut data: Vec<u8> = Vec::new();
353+
match file.read_to_end(&mut data) {
354+
Err(why) => {
355+
let mut res = Response::new(why.to_string().into());
356+
*res.status_mut() = warp::http::StatusCode::INTERNAL_SERVER_ERROR;
357+
res
358+
}
359+
Ok(_) => {
360+
let mut res = Response::new(data.into());
361+
res.headers_mut().insert(
362+
"Content-Type",
363+
warp::http::header::HeaderValue::from_static("application/x-tar"),
364+
);
365+
res
366+
}
367+
}
368+
});
272369

273370
// DI
274371
let handler_di_app_start = fdo_http_wrapper::server::fdo_request_filter(
@@ -307,7 +404,7 @@ async fn main() -> Result<()> {
307404
let routes = warp::post()
308405
.and(
309406
hello
310-
.or(handler_ping)
407+
.or(fdo_http_wrapper::server::ping_handler())
311408
// DI
312409
.or(handler_di_app_start)
313410
.or(handler_di_set_hmac)
@@ -316,6 +413,8 @@ async fn main() -> Result<()> {
316413
.or(handler_diun_request_key_parameters)
317414
.or(handler_diun_provide_key),
318415
)
416+
.or(handler_export)
417+
.or(handler_ovs)
319418
.recover(fdo_http_wrapper::server::handle_rejection)
320419
.with(warp::log("manufacturing-server"));
321420

owner-onboarding-server/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ async fn _handle_report_to_rendezvous(udt: &OwnerServiceUDT, ov: &OwnershipVouch
117117
}
118118

119119
async fn report_to_rendezvous(udt: OwnerServiceUDT) -> Result<()> {
120+
// TODO: this below (query_data vs query_ovs_db) should be abstracted into the store's Filter's query stuff
120121
match udt.ownership_voucher_store.query_data().await {
121122
Ok(mut ft) => {
122123
ft.neq(

owner-tool/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ serde = { version = "1", features = ["derive"] }
1515
serde_yaml = "0.9"
1616
tokio = { version = "1", features = ["full"] }
1717
tss-esapi = { version = "7.4", features = ["generate-bindings"] }
18+
reqwest = { version = "0.12.7", features = ["blocking"] }
1819

1920
fdo-util = { path = "../util", version = "0.5.0" }
2021
fdo-data-formats = { path = "../data-formats", version = "0.5.0" }

0 commit comments

Comments
 (0)