Add 'CONFIDENTIAL', 'DRAFT', and TLP marks to the cover
This commit is contained in:
parent
35e7ca67f3
commit
f9cb3e474d
@ -7,6 +7,7 @@ Penetration Test report template written in [typst](https://typst.app).
|
|||||||
- Provides a *Management Summary*, *Test Scope*, *Findings*, and *Appendix* section
|
- Provides a *Management Summary*, *Test Scope*, *Findings*, and *Appendix* section
|
||||||
- Easy to use, handles the formatting and typesetting hassle for you - as well as all those text you copy-paste anyway
|
- Easy to use, handles the formatting and typesetting hassle for you - as well as all those text you copy-paste anyway
|
||||||
- Supports [CVSS V3.1](https://www.first.org/cvss/v3-1/)
|
- Supports [CVSS V3.1](https://www.first.org/cvss/v3-1/)
|
||||||
|
- Supports [TLP V2.0](https://www.first.org/tlp/)
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
|||||||
75
helper.typ
75
helper.typ
@ -133,3 +133,78 @@
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// confidentialMark draws a "CONFIDENTIAL" stamp, used on the cover page
|
||||||
|
#let confidentialMark() = {
|
||||||
|
rect(
|
||||||
|
height: 100%,
|
||||||
|
width: 100%,
|
||||||
|
stroke: (paint: red, thickness: 2pt, dash: "solid"),
|
||||||
|
align(center + horizon,
|
||||||
|
text(
|
||||||
|
size: 18pt,
|
||||||
|
weight: "semibold",
|
||||||
|
fill: red,
|
||||||
|
"CONFIDENTIAL"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#let draftMark() = {
|
||||||
|
rect(
|
||||||
|
height: 100%,
|
||||||
|
width: 100%,
|
||||||
|
stroke: (paint: blue, thickness: 2pt, dash: "solid"),
|
||||||
|
align(center + horizon,
|
||||||
|
text(
|
||||||
|
size: 18pt,
|
||||||
|
weight: "semibold",
|
||||||
|
fill: blue,
|
||||||
|
"DRAFT"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// tlpMark draws a Traffic Light Protocol mark, used on the cover page
|
||||||
|
// light may be one of "RED", "AMBER", "AMBER+STRICT", "GREEN", or "CLEAR"
|
||||||
|
#let tlpMark(light) = {
|
||||||
|
light = upper(light)
|
||||||
|
let lightMap = (
|
||||||
|
"RED": (color: rgb("#FF2B2B"), title: "TLP:RED", content: "recipient only"),
|
||||||
|
"AMBER": (color: rgb("#FFC000"), title: "TLP:AMBER", content: "organisation only"),
|
||||||
|
"AMBER+STRICT": (color: rgb("#FFC000"), title: "TLP:AMBER+STRICT", content: "organisation\nand its clients"),
|
||||||
|
"GREEN": (color: rgb("#33FF00"), title: "TLP:GREEN", content: "within community"),
|
||||||
|
"CLEAR": (color: rgb("#FFFFFF"), title: "TLP:CLEAR", content: "public")
|
||||||
|
)
|
||||||
|
// check argument
|
||||||
|
panicOnInvalid(light, lightMap.keys())
|
||||||
|
|
||||||
|
rect(
|
||||||
|
height: 100%,
|
||||||
|
width: 100%,
|
||||||
|
stroke: (paint: lightMap.at(light).color.darken(10%), thickness: 2pt, dash: "solid"),
|
||||||
|
align(center + horizon,
|
||||||
|
grid(
|
||||||
|
columns: (80%),
|
||||||
|
rows: (18pt, auto),
|
||||||
|
gutter: 8pt,
|
||||||
|
highlight(
|
||||||
|
fill: black,
|
||||||
|
text(
|
||||||
|
size: if light == "AMBER+STRICT" { 13pt } else { 18pt },
|
||||||
|
weight: "semibold",
|
||||||
|
fill: lightMap.at(light).color,
|
||||||
|
lightMap.at(light).title
|
||||||
|
)
|
||||||
|
),
|
||||||
|
text(
|
||||||
|
size: 12pt,
|
||||||
|
fill: if light == "CLEAR" { black } else { lightMap.at(light).color.darken(10%) },
|
||||||
|
lightMap.at(light).content
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
6
main.typ
6
main.typ
@ -18,7 +18,11 @@
|
|||||||
#set par(justify: true)
|
#set par(justify: true)
|
||||||
|
|
||||||
// ----- Cover & Legal disclaimer(s) -----
|
// ----- Cover & Legal disclaimer(s) -----
|
||||||
#pages.cover(targetFull, place, author)
|
#pages.cover(targetFull, place, author,
|
||||||
|
confidential: false, // set to true for a "CONFIDENTIAL" mark on the cover
|
||||||
|
tlp: "red", // set to one of "RED", "AMBER+STRICT", "AMBER", "GREEN", "CLEAR", or none. See https://www.first.org/tlp/
|
||||||
|
draft: true // set to true for a "DRAFT" mark on the cover
|
||||||
|
)
|
||||||
#pages.legal(author)
|
#pages.legal(author)
|
||||||
|
|
||||||
#set page(
|
#set page(
|
||||||
|
|||||||
24
pages.typ
24
pages.typ
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#import "helper.typ"
|
#import "helper.typ"
|
||||||
|
|
||||||
#let cover(title, place, author) = {
|
#let cover(title, place, author, confidential: false, tlp: none, draft: false) = {
|
||||||
// Define page
|
// Define page
|
||||||
set page(
|
set page(
|
||||||
paper: "a4",
|
paper: "a4",
|
||||||
@ -21,11 +21,31 @@
|
|||||||
#text(title, weight: "black")
|
#text(title, weight: "black")
|
||||||
])
|
])
|
||||||
|
|
||||||
v(0pt)
|
v(0.25pt)
|
||||||
|
|
||||||
text(size: 16pt, [
|
text(size: 16pt, [
|
||||||
#place, #datetime.today().display("[day].[month].[year]") • #author
|
#place, #datetime.today().display("[day].[month].[year]") • #author
|
||||||
])
|
])
|
||||||
|
|
||||||
|
v(1fr)
|
||||||
|
|
||||||
|
grid(
|
||||||
|
columns: (1fr, 1fr, 1fr),
|
||||||
|
gutter: 5pt,
|
||||||
|
rows: (75pt),
|
||||||
|
// "Confidential" marking
|
||||||
|
if confidential {
|
||||||
|
helper.confidentialMark()
|
||||||
|
},
|
||||||
|
// "Draft" marking
|
||||||
|
if draft {
|
||||||
|
helper.draftMark()
|
||||||
|
},
|
||||||
|
// TLP marking, see https://www.first.org/tlp/
|
||||||
|
if tlp != none {
|
||||||
|
helper.tlpMark(tlp)
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#let legal(author) = {
|
#let legal(author) = {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user