- 1052
let mut labels = Vec::new(); - 1053
let mut current: Option<String> = None; - 1054
let mut text = String::new(); - 1055
xml::walk(bytes, part, limits, |event| { - 1056
match event { - 1057
XmlEvent::Open(element) if element.local() == "property" => { - 1058
current = element - 1059
.attr("name") - 1060
.filter(|name| name.starts_with("MSIP_Label_") && name.ends_with("_Name")) - 1061
.map(str::to_string); - 1062
text.clear(); - 1063
} - 1064
XmlEvent::Text(value) if current.is_some() => text.push_str(&value), - 1065
XmlEvent::Close(name) if xml::local_name(&name) == "property" => { - 1066
let label = current.take().map(|_| text.trim().to_string()); - 1067
labels.extend(label.filter(|label| !label.is_empty())); - 1068
} - 1069
_ => {} - 1070
} - 1071
Ok(()) - 1072
})?; - 1073
labels.sort(); - 1074
labels.dedup(); - 1075
Ok(labels) - 1076
} - 1077
- 1078
#[cfg(test)] - 1079
#[allow(clippy::unwrap_used, clippy::expect_used)] - 1080
mod tests { - 1081
use super::*; - 1082
- 1083
#[test] - 1084
fn part_names_refuse_traversal_and_odd_shapes() { - 1085
for bad in [ - 1086
"../evil.xml", - 1087
"word/../../evil.xml", - 1088
"/abs.xml", - 1089
"word\\document.xml", - 1090
"word//document.xml", - 1091
"C:/x.xml", - 1092
"word/./document.xml", - 1093
"word/document.xml.", - 1094
"a\u{0}b", - 1095
] { - 1096
assert!(validate_part_name(bad).is_err(), "{bad} should be refused"); - 1097
} - 1098
validate_part_name("word/document.xml").unwrap(); - 1099
validate_part_name("[Content_Types].xml").unwrap(); - 1100
} - 1101
- 1102
#[test] - 1103
fn targets_resolve_relative_to_source_and_never_escape() { - 1104
assert_eq!( - 1105
resolve_target("word/document.xml", "media/image1.png").unwrap(), - 1106
"word/media/image1.png" - 1107
); - 1108
assert_eq!( - 1109
resolve_target("ppt/slides/slide1.xml", "../slideLayouts/slideLayout1.xml").unwrap(), - 1110
"ppt/slideLayouts/slideLayout1.xml" - 1111
); - 1112
assert_eq!( - 1113
resolve_target("", "/word/document.xml").unwrap(), - 1114
"word/document.xml" - 1115
); - 1116
assert_eq!( - 1117
resolve_target("", "word/a%20b.xml").unwrap(), - 1118
"word/a%20b.xml" - 1119
); - 1120
assert_eq!(part_key("word/a%20b.xml"), part_key("/Word/A B.xml")); - 1121
assert!(resolve_target("word/document.xml", "../../etc/passwd").is_err()); - 1122
assert!(resolve_target("word/document.xml", "%2e%2e/%2E%2E/x").is_err()); - 1123
assert!(resolve_target("", "..").is_err()); - 1124
assert!(resolve_target("", "a%2fb").is_err()); - 1125
assert!(has_uri_scheme("mailto:a@b.c") && has_uri_scheme("https://x")); - 1126
assert!(!has_uri_scheme("media/a:b.png") && !has_uri_scheme("../x.xml")); - 1127
} - 1128
- 1129
#[test] - 1130
fn rels_names_round_trip() { - 1131
for source in ["", "word/document.xml", "ppt/slides/slide1.xml"] { - 1132
assert_eq!(rels_source(&rels_part_name(source)).unwrap(), source); - 1133
} - 1134
assert_eq!(rels_source("word/document.xml"), None); - 1135
} - 1136
- 1137
#[test] - 1138
fn every_extension_maps_back_from_its_format() { - 1139
for extension in crate::EXTENSIONS { - 1140
assert!(crate::is_openxml_path(&format!("x.{extension}"))); - 1141
} - 1142
let format = - 1143
Format::from_main_content_type("application/vnd.ms-excel.sheet.macroEnabled.main+xml") - 1144
.unwrap(); - 1145
assert_eq!(format.extension(), "xlsm"); - 1146
assert!( - 1147
Format::from_main_content_type( - 1148
"application/vnd.ms-excel.sheet.binary.macroEnabled.main" - 1149
) - 1150
.is_err() - 1151
); - 1152
} - 1153
} - 1154
Indexing the workspace…
Vakyartha documentation is discovering safe artifacts, anchors, and source references.