diff --git a/.gitignore b/.gitignore
index 9682114..226322e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,9 @@
-
xml/PenText.xpr
+# (Emacs) (temporary) files
+.#*
+\#*#
+.projectile
+# Compiled Python stuff
+*.pyc
.DS_Store
diff --git a/README.md b/README.md
index b657886..c998f7d 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,49 @@
-# pentext
-PenText system
+# Pentext
+
+The PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.
+
+### How it Works
+The OWASP PenText project is based on XML. A PenText Report, Quote, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.
+
+### The Structure
+The directories are used as follows:
+- chatops: contains bash and Python scripts that can be used with Hubot (chatOps), handy for automation while getting started or for checking document validity or spellchecking.
+- xml:
+ - contains the PenText XML system and templates in directories *dtd*, *source* and *xslt*
+ - your report or quote will go into *source*
+ - contains a *graphics* map for your company logo
+ - the *findings* and *non-findings* directories are for findings and non-findings
+
+## Getting Started
+
+What do you need ?
+
+1. Clone this repository
+
+2. Install the toolchain
+
+3. Edit the content
+
+Listo! That's all you need. Now you can build PDF reports using the content.
+
+
+### Toolchain
+To convert the XML content into PDF files the tools the *Apache FOP* library and the *Java* library *Saxon* will be used
+It is easiest to install the toolchain using Ansible: check out the role PeterMosmans.docbuilder (https://galaxy.ansible.com/PeterMosmans/docbuilder/)
+
+To edit (and view) the content you'll need a XML editor - which could be any text editor like *JEdit*, to a full IDE- for editing of course ;). Preferably something that can check XML file validity. To view the resulting PDF files a PDF viewer is necessary.
+
+### Building PDF's
+Manually compiling a quotation, report or other document can be done using `java -jar path-to-Saxon-jar -s:name-of-xml-file -xsl:name-of-xsl-file-in-xsl-directory -o:name-for-pdf-output`
+But why do it manually when the [ChatOps](https://github.com/radicallyopensecurity/pentext/tree/master/chatops) directory contains so much nice scripts to do just that ?
+
+See for more detailed information the [tools manual](https://github.com/radicallyopensecurity/pentext/blob/master/xml/doc/Tools%20manual.md)
+
+## Adding and Modifying Content
+### Guidelines
+- There is a guide for [report writing](xml/doc/report/Report%20Writing%20-%20Procedure.md)
+- There is also a guide for [quotation writing](xml/doc/offerte/Offerte%20Writing%20Procedure.md)
+
+### Example documents
+Besides the reports and quotations, generic documents can also be created.
+Those can be found [here](xml/doc/examples)
diff --git a/chatops/README.md b/chatops/README.md
new file mode 100644
index 0000000..8edf7e7
--- /dev/null
+++ b/chatops/README.md
@@ -0,0 +1,123 @@
+# Introduction
+This directory contains the ChatOps scripts, based on Hubot. It uses RocketChat and gitlab as the underlying framework (but can be modified to fit any other framework).
+
+This document describes the goal of the scripts, as well as installation instructions and their basic usage.
+
+
+## Workflow
+Scripts are ordered by workflow, not alphabetically.
+The workflow consists of
+1. setting up a repository for a quote with the PenText framework
+2. (optional: converting quickscope input to a quote)
+3. building a PDF quote
+4. setting up a repository for a pentest with the PenText framework, based on a quote
+5. (optional: converting gitlab issues to XML findings and non-findings)
+6. (optional: validating a PenText report)
+7. building a PDF report
+8. building a PDF invoice
+
+## Naming
+The scripts either take the **project name** as input, or the **repository name** (and optional namespace and branch). The project name is leading, repository names are derived from the project names: the quotation repository has `off-` as prefix, and the pentest repository will have `pen-` as prefix.
+As a rule of thumb, the handlers that are prefixed with `start` (startquote, startpentest) will take the **project name** as input. All other handlers take the **repository name** as input.
+
+Example: when the project's name is ros, then the corresponding quote repository and RocketChat channel's name will be `off-ros`.
+If this quote will result in a pentest project, then the corresponding repository and RocketChat channel will be named `pen-ros`.
+
+Note that git repository names are _lowercase_.
+
+
+# Scripts
+
+The scripts use multiple environment variables, that can be set by the user under which rosbot is running. These are
++ `GITLABCLI` :: the location of the python-gitlab command line interface (defaults to `gitlab`)
++ `GITSERVER` :: the name of the gitlab server (defaults to `gitlab.local`)
++ `GITWEB` :: the URL of the gitlab webinterface (defaults to `https://$GITSERVER`)
++ `NAMESPACE` :: the namespace of the user which is used to set up gitlab repositories (defaults to `ros`)
++ `PENTEXTREPO` :: the location of the PenText repository (defaults to `https://github.com/radicallyopensecurity/pentext`)
+
+## Prerequisites
+
+The Bash scripts use the python-gitlab command-line interface to talk to the gitlab instance. This interface can be installed using `sudo pip install git+https://github.com/gpocentek/python-gitlab`. Obviously, Python needs to be installed as well.
+This command line interface expects a configuration file `.python-gitlab.cfg` for the user under which rosbot is running, which it uses to connect to gitlab. Make sure it contains the correct details so that you can connect to gitlab.
+
+If you want to convert and build documents, the pentext toolchain is necessary. Use the ansible playbook https://galaxy.ansible.com/PeterMosmans/docbuilder/ or install the tools (Java, Saxon and Apache FOP) by hand, see https://github.com/radicallyopensecurity/pentext/blob/master/xml/doc/Tools%20manual.md for more information.
+
+## Test the configuration
+Test out whether the configuration is successful by manually executing the Bash script [bash/test_pentext](bash/test_pentext) - this should return an OK.
+
+
+## CoffeeScript
+
+### rosbot.coffee
+
+[scripts/rosbot.coffee](scripts/rosbot.coffee) - contains the various keywords and redirects to the proper handlers. All RocketChat-specific actions (e.g. the creation of rooms) is being handled by this script.
+
+The scripts contains an array of users that will be added to the newly created rooms by default.
+
+Example:
+`admins = ['admin']`
+
+## Bash
+
+### startquote
+Start the quotation process by setting up a repository with the PenText framework, and creating a RocketChat channel.
+
+Handled by [bash/handler_quote](bash/handler_quote)
+
+Sets up a pentest RocketChat channel named `off-PROJECT_NAME`, a gitlab repo named `off-PROJECT_NAME`, and installs the latest version of the Pentext framework. Note that this uses the `PROJECT_NAME` as input, so it will automatically append the `off-` prefix.
+
+Usage: `startquote PROJECT_NAME`
+
+
+### quickscope
+Converts a quickscope (`source/quickscope.xml`) into a full-blown XML quote.
+
+Handled by [bash/handler_quickscope](bash/handler_quickscope)
+
+
+Usage: `quickscope REPO_NAME [NAMESPACE [BRANCH]]]`
+
+
+### build
+Builds PDF files from XML quotes and reports.
+
+Handled by [bash/handler_build](bash/handler_build)
+
+Usage: `build quote|report REPO_NAME [NAMESPACE [[BRANCH]] [-PARAMETERS]`
+
+
+### startpentest
+Start the pentesting process by setting up a repository with the PenText framework, adding standard gitlab labels and issues, and creating a RocketChat channel.
+
+Handled by [bash/handler_pentest](bash/handler_pentest)
+
+Sets up a pentest RocketChat channel named `pen-PROJECT_NAME`, and a gitlab repo named `pen-PROJECT_NAME`. Will use the quotation found in the corresponding `off-PROJECT_NAME` as base. Note that the prefix `pen-` is set by the `rosbot.coffee` script.
+
+Usage: `startpentest PROJECT_NAME`
+
+
+### convert
+Converts gitlab issues labeled with `finding` and `non-finding` into XML files, and adds those to the repository
+Handled by [bash/handler_convert](bash/hander_convert)
+
+Converts gitlab items to XML findings
+
+Usage: `convert REPO_NAME`
+
+
+### validate
+Validates quotes and reports.
+Handled by [bash/handler_validate](bash/handler_validate)
+
+Validates quotes and reports using the `validate_report.py` script (proper casing, spell checking, long lines, cross-checks)
+
+Usage: `validate [OPTIONAL PARAMETERS]`
+
+
+### invoice
+Builds PDF invoices from quotes.
+
+Handled by [bash/handler_invoice](bash/handler_invoice)
+
+
+Usage: `invoice REPO_NAME INVOICE_NO [NAMESPACE [[BRANCH]] [-PARAMETERS]`
diff --git a/chatops/bash/handler_build b/chatops/bash/handler_build
new file mode 100644
index 0000000..01cce2a
--- /dev/null
+++ b/chatops/bash/handler_build
@@ -0,0 +1,126 @@
+#!/bin/bash
+
+# handler_build - builds PDF quotes and reports from XML files
+#
+# This script is part of the PenText framework
+# https://pentext.org
+#
+# Copyright (C) 2016 Radically Open Security
+# https://www.radicallyopensecurity.com
+#
+# Author(s): Peter Mosmans
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+
+VERSION=0.11
+DOCBUILDER=/usr/local/bin/docbuilder.py
+TEMPLOC=$(mktemp -d)
+
+# These variables should be set environment-specific
+[ -z $GITSERVER ] && GITSERVER=gitlab.local
+[ -z $GITWEB ] && GITWEB=https://${GITSERVER}
+[ -z $NAMESPACE ] && NAMESPACE=ros
+BRANCH=master
+
+# Read standard 'command line' variables
+[[ ! -z $1 ]] && TARGET=$1
+[[ ! -z $2 ]] && REPO=$2
+
+# Reading positional parms is a bit ugly, shifting parms or getopt would be nicer
+if [[ ! -z $3 ]]; then
+ if [[ ! $3 == -* ]]; then
+ NAMESPACE=$3
+ else
+ PARMS=$3
+ fi
+fi
+if [[ ! -z $4 ]]; then
+ if [[ ! $3 == -* ]]; then
+ BRANCH=$4
+ else
+ PARMS="$PARMS $4"
+ fi
+fi
+if [[ $# -ge 5 ]]; then
+ shift 4
+ PARMS="$PARMS $@"
+fi
+
+trap cleanup EXIT QUIT
+
+# Make sure that the temporary files are always removed
+cleanup() {
+ trap '' EXIT INT QUIT
+ [ -d $TEMPLOC ] && rm -rf $TEMPLOC &>/dev/null
+ exit
+}
+
+# As quote used to be called offer or even offer,
+# this function retains backward compatibility - v0.1
+backwards_compatible() {
+ if [[ $TARGET == "quote" ]] && [ ! -f $TARGET.xml ]; then
+ TARGET="offerte"
+ fi
+}
+
+# Clones repo using global (!) variables - v0.2
+clone_repo() {
+ pushd $TEMPLOC 1>/dev/null
+ git clone -b $BRANCH --depth=1 -q ssh://git@${GITSERVER}/${NAMESPACE}/${REPO}.git &>/dev/null
+ if [ ! -d $TEMPLOC/$REPO ]; then
+ echo "[-] could not clone repo ${NAMESPACE}/${REPO}"
+ exit 1
+ else
+ cd $REPO
+ fi
+}
+
+# Preflight checks using global (!) variables - v0.2
+preflight_checks() {
+ if ([[ $TARGET != "quote" ]] && [[ $TARGET != "report" ]]) || [ -z $REPO ]; then
+ echo "Usage: build quote|report REPOSITORY [NAMESPACE [BRANCH] [-v]"
+ exit
+ fi
+ if [ ! -f $DOCBUILDER ]; then
+ echo "[-] this script needs docbuilder.py ($DOCBUILDER)"
+ fi
+}
+
+build() {
+ if [ ! -d source ]; then
+ echo "[-] missing necessary pentext framework files"
+ exit 1
+ fi
+ pushd source &>/dev/null
+ backwards_compatible
+ targetpdf=target/$TARGET-latest.pdf
+ $DOCBUILDER -c -i $TARGET.xml -o ../$targetpdf -x ../xslt/generate_$TARGET.xsl $PARMS
+ if [[ $? -ne 0 ]]; then
+ echo "[-] Sorry, failed to parse $TARGET. Use \`builder $TARGET $REPO $NAMESPACE $BRANCH -v\` for more information."
+ exit 1
+ fi
+ popd &>/dev/null
+ if [ ! -f $targetpdf ]; then
+ echo "[-] hmmm... failed to build PDF file (could not find $targetpdf)"
+ exit 1
+ fi
+}
+
+add_to_repo() {
+ git add target/$TARGET-latest.pdf
+ git add target/waiver_?*.pdf &>/dev/null
+ git commit -q -m "$targetpdf proudly manufactured using ChatOps" &>/dev/null
+ git push -q >/dev/null
+}
+
+preflight_checks
+echo "builder v$VERSION - Rocking your world, one build at a time..."
+clone_repo
+build
+add_to_repo
+echo "[+] listo! Check out $GITWEB/$NAMESPACE/$REPO/raw/$BRANCH/$targetpdf"
+exit 0
diff --git a/chatops/bash/handler_convert b/chatops/bash/handler_convert
new file mode 100644
index 0000000..b5961c5
--- /dev/null
+++ b/chatops/bash/handler_convert
@@ -0,0 +1,131 @@
+#!/bin/bash
+
+# handler_convert - converts gitlab issues into XML files
+#
+# This script is part of the PenText framework
+# https://pentext.org
+#
+# Copyright (C) 2016 Radically Open Security
+# https://www.radicallyopensecurity.com
+#
+# Author(s): Peter Mosmans
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+
+VERSION=0.2
+CONVERTER=/usr/local/bin/gitlab-to-pentext.py
+TEMPLOC=$(mktemp -d)
+
+# These variables should be set environment-specific
+[ -z $GITLABCLI ] && GITLABCLI=gitlab
+[ -z $GITSERVER ] && GITSERVER=gitlab.local
+[ -z $NAMESPACE ] && NAMESPACE=ros
+BRANCH=master
+
+# Read standard 'command line' variables
+[[ ! -z $1 ]] && REPO=$1
+# Reading parms is a bit ugly, shifting parms or actually using getopt would be nicer
+if [[ ! -z $2 ]]; then
+ if [[ ! $2 == -* ]]; then
+ NAMESPACE=$2
+ else
+ PARMS=$2
+ fi
+fi
+if [[ ! -z $3 ]]; then
+ if [[ ! $3 == -* ]]; then
+ BRANCH=$3
+ else
+ PARMS="$PARMS $3"
+ fi
+fi
+
+if [[ $# -ge 4 ]]; then
+ shift 3
+ PARMS="$PARMS $@"
+fi
+
+trap cleanup EXIT QUIT
+
+# Make sure that the temporary files are always removed
+cleanup() {
+ trap '' EXIT INT QUIT
+ [ -d $TEMPLOC ] && rm -rf $TEMPLOC &>/dev/null
+ exit
+}
+
+# As quote used to be called offerte or offer,
+# this function retains backward compatibility - v0.2
+backwards_compatible() {
+ if [[ $TARGET == "quote" ]] && [ ! -f $TARGET.xml ]; then
+ TARGET="offerte"
+ fi
+}
+
+# Clones repo using global (!) variables - v0.2
+clone_repo() {
+ pushd $TEMPLOC 1>/dev/null
+ git clone -b $BRANCH --depth=1 -q ssh://git@${GITSERVER}/${NAMESPACE}/${REPO}.git &>/dev/null
+ if [ ! -d $TEMPLOC/$REPO ]; then
+ echo "[-] could not clone repo ${NAMESPACE}/${REPO}"
+ exit 1
+ else
+ cd $REPO
+ fi
+}
+
+# Preflight checks using global (!) variables - v0.2
+preflight_checks() {
+ if [ -z $REPO ]; then
+ echo "[-] repository name needed"
+ exit
+ fi
+ if [ ! -f $CONVERTER ]; then
+ echo "[-] this script needs gitlab-to-pentext.py ($CONVERTER)"
+ exit
+ fi
+}
+
+get_id() {
+ project_id=$($GITLABCLI project search --query $REPO|awk '/id:/{print $2}')
+ if [ -z $project_id ]; then
+ echo "[-] could not find $REPO in gitlab"
+ exit
+ fi
+ return $project_id
+}
+
+convert() {
+ $CONVERTER --issues $project_id -y
+}
+
+add_to_repo() {
+ git add * &>/dev/null
+ git commit -q -m "Converted gitlab (non) findings to XML using ChatOps" &>/dev/null
+ git push -q >/dev/null
+}
+
+validate() {
+ if [ ! -d source ]; then
+ echo "[-] missing necessary pentext framework files"
+ exit 1
+ fi
+ $VALIDATOR $PARMS
+ if [[ -f project-vocabulary.pws ]]; then
+ git add project-vocabulary.pws
+ git commit -q -m 'Added spellcheck vocabulary using ChatOps' >/dev/null
+ git push -q >/dev/null
+ fi
+}
+
+preflight_checks
+echo "convert v$VERSION - Convert all the things!"
+get_id
+clone_repo
+convert
+add_to_repo
+echo "[+] Listo!"
diff --git a/chatops/bash/handler_invoice b/chatops/bash/handler_invoice
new file mode 100644
index 0000000..0c8b7b0
--- /dev/null
+++ b/chatops/bash/handler_invoice
@@ -0,0 +1,126 @@
+#!/bin/bash
+
+# handler_invoice - builds PDF invoices from quotes
+#
+# This script is part of the PenText framework
+# https://pentext.org
+#
+# Copyright (C) 2016 Radically Open Security
+# https://www.radicallyopensecurity.com
+#
+# Author(s): Peter Mosmans
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+
+VERSION=0.5
+DOCBUILDER=/usr/local/bin/docbuilder.py
+TEMPLOC=$(mktemp -d)
+DATESTAMP=$(date +"%Y-%m-%d")
+INVOICE="00/000"
+
+# These variables should be set environment-specific
+[ -z $GITSERVER ] && GITSERVER=gitlab.local
+[ -z $GITWEB ] && GITWEB=https://${GITSERVER}
+[ -z $NAMESPACE ] && NAMESPACE=ros
+BRANCH=master
+TARGET=quote
+
+# Read standard 'command line' variables
+[[ ! -z $1 ]] && REPO=$1
+[[ ! -z $2 ]] && INVOICE=$2
+
+# Reading positional parms is a bit ugly, shifting parms or getopt would be nicer
+if [[ ! -z $3 ]]; then
+ if [[ ! $3 == -* ]]; then
+ NAMESPACE=$3
+ else
+ PARMS=$3
+ fi
+fi
+if [[ ! -z $4 ]]; then
+ if [[ ! $3 == -* ]]; then
+ BRANCH=$4
+ else
+ PARMS="$PARMS $4"
+ fi
+fi
+if [[ $# -ge 5 ]]; then
+ shift 4
+ PARMS="$PARMS $@"
+fi
+trap cleanup EXIT QUIT
+
+# Make sure that the temporary files are always removed
+cleanup() {
+ trap '' EXIT INT QUIT
+ [ -d $TEMPLOC ] && rm -rf $TEMPLOC &>/dev/null
+ exit
+}
+
+# As quote used to be called offerte or offer,
+# this function retains backward compatibility - v0.2
+backwards_compatible() {
+ if [[ $TARGET == "quote" ]] && [ ! -f $TARGET.xml ]; then
+ TARGET="offerte"
+ fi
+}
+
+# Clones repo using global (!) variables - v0.2
+clone_repo() {
+ pushd $TEMPLOC 1>/dev/null
+ git clone -b $BRANCH --depth=1 -q ssh://git@${GITSERVER}/${NAMESPACE}/${REPO}.git &>/dev/null
+ if [ ! -d $TEMPLOC/$REPO ]; then
+ echo "[-] could not clone repo ${NAMESPACE}/${REPO}"
+ exit 1
+ else
+ cd $REPO
+ fi
+}
+
+# Preflight checks using global (!) variables - v0.2
+preflight_checks() {
+ if [ -z $REPO ]; then
+ echo "Usage: invoice REPOSITORY [INVOICE_NUMBER [NAMESPACE [BRANCH]]] [-v]"
+ exit
+ fi
+ if [ ! -f $DOCBUILDER ]; then
+ echo "[-] this script needs docbuilder.py ($DOCBUILDER)"
+ fi
+}
+
+build() {
+ if [ ! -d source ]; then
+ echo "[-] missing necessary pentext framework files"
+ exit 1
+ fi
+ pushd source &>/dev/null
+ backwards_compatible
+ targetpdf=target/invoice-latest.pdf
+ $DOCBUILDER -c -i $TARGET.xml -o ../$targetpdf -x ../xslt/generate_invoice.xsl -invoice "$INVOICE" -date $DATESTAMP --fop ../target/invoice.fo $PARMS
+ if [[ $? -ne 0 ]]; then
+ echo "[-] Sorry, failed to generate $targetpdf"
+ exit 1
+ fi
+ popd &>/dev/null
+ if [ ! -f target/invoice-latest.pdf ]; then
+ echo "[-] hmmm... failed to build PDF file (could not find $targetpdf)"
+ exit 1
+ fi
+}
+
+add_to_repo() {
+ git add target/invoice-latest.pdf
+ git commit -q -m "Invoice $INVOICE automatically generated using ChatOps" &>/dev/null
+ git push -q >/dev/null
+}
+
+preflight_checks
+echo "invoice v$VERSION - Congrats, another project from conception to ka-CHING"
+clone_repo
+build
+add_to_repo
+echo "[+] listo! Check out $GITWEB/$NAMESPACE/$REPO/raw/$BRANCH/$targetpdf"
diff --git a/chatops/bash/handler_pentest b/chatops/bash/handler_pentest
new file mode 100644
index 0000000..88595ea
--- /dev/null
+++ b/chatops/bash/handler_pentest
@@ -0,0 +1,163 @@
+#!/bin/bash
+
+# handler_pentest - sets up a pentest repo with PenText based on a quote repo
+#
+# This script is part of the PenText framework
+# https://pentext.org
+#
+# Copyright (C) 2016 Radically Open Security
+# https://www.radicallyopensecurity.com
+#
+# Author(s): Peter Mosmans
+# John Sinteur
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+
+VERSION=0.9
+SAXON=/usr/local/bin/saxon/saxon9he.jar
+TEMPLATEREPO=ssh://git@gitlab.local/peter/templates
+
+# These variables should be set environment-specific
+[ -z $GITLABCLI ] && GITLABCLI=gitlab
+[ -z $GITSERVER ] && GITSERVER=gitlab.local
+[ -z $NAMESPACE ] && NAMESPACE=ros
+[ -z $NAMESPACEID ] && NAMESPACEID=1
+[ -z $PENTEXTREPO ] && PENTEXTREPO=https://github.com/radicallyopensecurity/pentext
+
+TEMPLOC=$(mktemp -d)
+pentext=$(echo $PENTEXTREPO|awk -F '/' '{print $5}')
+# Read standard 'command line' variables
+[[ ! -z $1 ]] && REPO=$1
+[[ ! -z $2 ]] && NAMESPACE=$2
+[[ ! -z $3 ]] && PREVIOUS=$3
+BRANCH=master
+TARGET=quote
+
+trap cleanup EXIT QUIT
+
+# Make sure that the temporary files are always removed
+cleanup() {
+ trap '' EXIT INT QUIT
+ # remove repo if not finished successfully
+ if [ -z $finished ] && [ ! -z $project_id ]; then
+ $GITLABCLI project delete --id $project_id
+ echo "[-] deleted project $project_id"
+ fi
+ [ -d $TEMPLOC ] && rm -rf $TEMPLOC &>/dev/null
+ exit
+}
+
+# As quote used to be called offerte or offer,
+# this function retains backward compatibility - v0.2
+backwards_compatible() {
+ if [[ $TARGET == "quote" ]] && [ ! -f $TARGET.xml ]; then
+ TARGET="offerte"
+ fi
+}
+
+# Clones repo using global (!) variables - v0.3
+clone_repo() {
+ pushd $TEMPLOC 1>/dev/null
+ git clone --depth=1 -q ssh://git@${GITSERVER}/${NAMESPACE}/${REPO}.git &>/dev/null
+ if [ ! -d $TEMPLOC/$REPO ]; then
+ echo "[-] could not clone repo ${NAMESPACE}/${REPO}"
+ exit 1
+ else
+ cd $REPO
+ fi
+}
+
+# Preflight checks using global (!) variables
+preflight_checks() {
+ if [ -z $REPO ]; then
+ echo "[-] repository name needed (without leading pen- or off-)"
+ exit
+ fi
+ if [ ! -f $SAXON ]; then
+ echo "[-] this script needs saxon ($SAXON)"
+ fi
+}
+
+setup_repo() {
+ project_id=$($GITLABCLI project create --name $REPO --namespace $NAMESPACEID --issues-enabled true --wiki-enabled true --snippets-enabled true --wall-enabled true --merge-requests-enabled true 2>/dev/null| awk '/id:/{print $2}')
+ if [ ! -z $project_id ]; then
+ echo "[+] successfully created gitlab project $REPO with id ${project_id}"
+ $GITLABCLI project-label create --project-id ${project_id} --name documentation --color "#0000FF" &>/dev/null
+ $GITLABCLI project-label create --project-id ${project_id} --name finding --color "#00c800" &>/dev/null
+ $GITLABCLI project-label create --project-id ${project_id} --name lead --color "#e4d700" &>/dev/null
+ $GITLABCLI project-label create --project-id ${project_id} --name non-finding --color "#c80000" &>/dev/null
+ $GITLABCLI project-label create --project-id ${project_id} --name future-work --color "#f8b7b2" &>/dev/null
+ $GITLABCLI project-issue create --project-id ${project_id} --description "Please drop all your positive/negative comments here, so that we can keep on improving our processes. It is important that we learn from what. No need for namecalling, who is unimportant
Our penetration tests are run a bit like a Capture The Flag - (CTF) competition: +
The workflow of our penetration testing team is modeled on that of a Capture The Flag (CTF) team:
Onze winst worden dus niet uitgekeerd aan aandeelhouders, investeerders of eigenaren. - Met de winst dienen we de maatschappij. Omdat wij geen winstoogmerk hebben kunnen we de beste ethische - veiligheidsexperts rekruteren. Met onze kernwaarden trekken we gelijkgestemde klanten aan. Wij stellen onze klanten - in staat om met IT veiligheidsbudgetten sociaal verantwoord ondernemen te ondersteunen. - Het hoge tempo waarmee wij groeien weerspiegelt de positieve respons van de markt op onze idealistische - filosofie en ons innovatieve business model.
+Onze winst wordt dus niet uitgekeerd aan aandeelhouders, investeerders of eigenaren, maar ingezet om de maatschappij te dienen. Omdat we geen winstoogmerk hebben, kunnen we de beste ethische + veiligheidsexperts rekruteren. Met onze kernwaarden trekken we gelijkgestemde klanten aan, die we + in staat stellen om met hun IT-veiligheidsbudget het sociaal verantwoord ondernemen te ondersteunen. + Ons hoge groeitempo weerspiegelt de positieve respons van de markt op onze idealistische + filosofie en ons innovatieve businessmodel.
-De waarden die
Voor meer informatie over
- Crystal-Box vs. Black-Box pentesting verwijst naar de hoeveelheid - informatie over het doelwit; de omgeving, architectuur, en/of applicaties die de klant +
+ Crystal-Box vs. Black-Box pentesting verwijst naar de hoeveelheid
+ informatie over de doelwit omgeving, architectuur, en/of applicaties die de klant
in eerste instantie deelt met de pentesters. Bij Black-Box testing ontvangen de
- pentesters helemaal geen informatie over het doelwit. Bij Crystal-Box tests
+ pentester helemaal geen informatie over het doelwit. Bij Crystal-Box tests
ontvangen de pentesters alle informatie die opgevraagd wordt betreffende het doelwit,
- inclusief broncode (wanneer dit relevant is), toegang tot ontwikkelaars of systeembeheer, etc...
-
-
- In dit geval zal
+ In dit geval zal
Tijdens het code audit gedeelte van penetratie tests nemen wij de volgende criteria mee:
+ documenteren wij deze en komen met suggesties om deze op te lossen. De audit wordt uitgevoerd + door goed getrainde penetratietesters die zowel raw code kunnen herzien + als de bevindingen van geautomatiseerde scans interpreteren en in context brengen. +Tijdens het code-audit-gedeelte van penetratietests nemen wij de volgende criteria mee:
Voor meer informatie verwijzen wij u naar de volgende link: https://www.owasp.org/index.php/OWASP_Code_Review_V2_Table_of_Contents
diff --git a/xml/source/snippets/offerte/nl/conditions.xml b/xml/source/snippets/offerte/nl/conditions.xml index 1fc4e71..8ab5737 100644 --- a/xml/source/snippets/offerte/nl/conditions.xml +++ b/xml/source/snippets/offerte/nl/conditions.xml @@ -3,15 +3,15 @@Om akkoord te gaan met dit aanbod, tekent u deze brief in tweevoud en retourneert - deze naar:
+Om akkoord te gaan met dit aanbod dient u deze brief in tweevoud te tekenen en te + retourneren naar:
+
Crystal-Box vs. Black-Box pentesting verwijst naar de hoeveelheid
informatie over de doelwit omgeving, architectuur, en/of applicaties die de klant
in eerste instantie deelt met de pentesters. Bij Black-Box testing ontvangen de
pentester helemaal geen informatie over het doelwit. Bij Crystal-Box tests
ontvangen de pentesters alle informatie die opgevraagd wordt betreffende het doelwit,
inclusief source code (wanneer dit relevant is), toegang tot developers of systeembeheer, etc...
-
-
-
+
Het is mogelijk dat in de loop van het penetratie testen
Het is mogelijk dat
Het is van belang om de limitaties van de diensten van
Laat duidelijk zijn dat er grenzen zijn aan wat
Gebaseerd op de verstrekte informatie, verwachten wij dat het dienstverband
Op basis van de verstrekte informatie verwachten wij dat het uitvoeren van de opdracht
What is this document?
-These are the general terms and conditions (in Dutch: “algemene voorwaarden”)
-of
In the spirit of
What is
To what do these terms and conditions apply?
-These general terms and conditions apply to all agreements between
How does
What can the customer expect from
It is important to understand the limits of
What can
The customer will provide
How do the parties handle confidential information?
-What does
If
What does
If
Who owns the products developed in the course of the assignment?
-For software it developed, this means that
For other products it developed, such as reports and analyses,
Who will perform the assignment?
-Due to the nature of
What happens when the scope of the assignment is bigger than agreed?
-How is payment arranged?
-All amounts in
For assignments where the parties agreed to an hourly fee,
If the payment is not received before the agreed term, the client will be
-deemed to be in default without prior notice.
If the customer cancels or delays the assignment two weeks before it starts,
-
For what can
Any liability of
To make things clear,
What happens when third parties lodge a claim or initiate criminal proceedings
-against
The customer shall indemnify
Should a third party lodge a claim against
The customer shall reimburse
When is this agreement terminated and what happens then?
-Each of the parties may terminate the agreement wholly or partly without -prior notice if the other party is declared bankrupt or is being wound up or if -the other party's affairs are being administered by the court -(in Dutch: “surséance van betaling”).
-When can
In the case of force majeure (in Dutch: “overmacht”) as a result of
-which
Which law applies and which court is competent?
-Dutch law applies to the legal relationship between
+ Wat houdt dit document in? +
+
+ Dit zijn de algemene voorwaarden van
+ In lijn met de filosofie van
+ Wat is Radically Open Security? +
+
+
+ Waarop zijn deze algemene voorwaarden van toepassing? +
+
+ Deze algemene voorwaarden zijn van toepassing op alle overeenkomsten tussen
+
+ Hoe stemt
+
+ Wat kan de klant verwachten van
+ Het is belangrijk om op de hoogte te zijn van de grenzen van de diensten van
+
+
+
+ Wat kan
+ De klant zal
+ Hoe gaan de partijen om met vertrouwelijk informatie? +
+
+
+ Wat doet
+ Indien
+ Wat doet
+ Indien
+ Wie is eigenaar van de producten die tijdens de opdracht worden ontwikkeld? +
+
+
+ Voor software die
+ Voor overige producten die
+
+ Wie zal de opdracht uitvoeren? +
+
+
+ Vanwege de aard van de zaken van
+ Wat gebeurt er wanneer de omvang van de opdracht groter is dan afgesproken? +
+
+
+ Hoe is de betaling geregeld? +
+
+ Alle bedragen in de offertes van
+ Voor opdrachten waarbij de partijen een uurtarief hebben afgesproken stuurt
+
+
+ Indien de betaling niet voor de afgesproken termijn is ontvangen wordt de
+ klant zonder voorafgaande kennisgeving geacht in verzuim te zijn.
+ Indien de klant de opdracht binnen twee weken voor de start annuleert of
+ uitstelt heeft
+ Waarvoor kan
+ Een aansprakelijkheid van
+ Elke vordering tot schadevergoeding verloopt na een periode van een maand + vanaf de dag volgend op de dag waarop de klant kennis had gekregen van of + redelijkerwijs kennis zou kunnen krijgen van het bestaan van de schadevergoeding. +
+
+ Ter verduidelijking,
+ Wat gebeurt er wanneer derden een vordering indienen of een strafrechtelijke
+ procedure instellen tegen
+ De klant vrijwaart
+ Indien een derde partij een vordering indient tegen
+ Wanneer wordt deze overeenkomst beëindigd en wat gebeurt er dan? +
++ Elk van de partijen kan de overeenkomst zonder voorafgaande kennisgeving + geheel of gedeeltelijk beëindigen indien de andere partij failliet is verklaard + of is ontbonden of indien de andere partij in surseance van betaling verkeert. +
+ +
+ Wanneer kan er niet van
+ In het geval van overmacht als gevolg waarvan van
+ Welk recht is van toepassing en welke rechtbank is bevoegd? +
+
+ Op de rechtsverhouding tussen
Tijdens het uitvoeren van de penetratie tests volgt
Tijdens het uitvoeren van de penetratietests volgt
Step 1: Benodigdheden Verzamelen en Scoping
+
Stap 1: Vaststellen voorwaarden/vereisten en Scoping
De verwachtingen van beide partijen worden besproken en overeenkomsten worden gemaakt
-betreffende het uitvoeren van de test(s). Bijvoorbeeld, contactgegevens en de
-scope van de pentest worden vastgelegd.
Step 2: Ontdekking
-Zo veel mogelijk informatie betreffende de "target" organisatie en de "target" objecten
-wordt verzameld. Deze informatie wordt passief verzameld, voornamelijk uit publieke bronnen.
Stap 2: Onderzoek
+Er word zo veel mogelijk informatie betreffende de te testen organisatie en doelwitten verzameld. Deze informatie wordt passief verzameld, voornamelijk uit publieke bronnen.
Step 3: Validatie
-Alle door de klant gespecificeerde systemen worden kruisverwezen met de bevindingen
-van de Ontdekking stap. Wij doen dit om te garanderen dat de ontdekte systemen
+
Stap 3: Validatie
+Alle door de klant gespecificeerde systemen worden nagelopen aan de hand van wat tijdens de Onderzoeksstap is ontdekt. We doen dit om te garanderen dat de ontdekte systemen
wettelijk eigendom van de klant zijn en om de scope met de klant te verifiëren.
Step 4: Informatieverzameling
+
Stap 4: Verzamelen gegevens
Informatie uit Stap 2 wordt hier gebruikt om actief informatie betreffende de
-systemen te verzamelen. Activiteiten gedurende deze fase kunnen het volgende inhouden:
-Vaststellen welke onderdelen van de verscheidene componenten zullen worden onderzocht;
-Testen op de aanwezigheid van bekende kwetsbaarheden, gebruikmakend van automatische tests;
-De aangeboden diensten identificeren en de voor hen gebruikte software te "fingerprinten."
Step 5: Analyse van Bedreigingen en Kwetsbaarheden
-Potentiële bedrijgingen en kwetsbaarheden worden geïndexeerd, gebaseerd op de verzamelde informatie.
Stap 5: Analyse van Risico's en Kwetsbaarheden
+Potentiële risico's en kwetsbaarheden worden geïndexeerd op basis van de verzamelde informatie.
Step 6: Exploitatie
-Hier wordt gepoogd om kwetsbaarheden van de verscheidene componenten te gebruiken.
-De diverse applicaties en componenten van de klants infrastructuur worden
-meedogenloos gesondeerd voor frequent voorkomende design-, configuratie- en programmeerfouten.
Stap 6: Exploitatie
+Hier wordt gepoogd om kwetsbaarheden in de verscheidene componenten uit te buiten.
+De diverse applicaties en componenten van de infrastructuur van de klant worden
+grondig gecontroleerd op vaak voorkomende ontwerp-, configuratie- en programmeerfouten.
Notitie:
Opmerking:
Step 7: Rapportage
-Na het afronden van de verificatie zal een rapport worden geleverd met een stapsgewijze benadering,
-waarbij resultaten en ontdekte kwetsbaarheden worden beschreven. Het rapport en de resultaten
-zullen worden gepresenteerd aan de verantwoordelijke projectleider of -manager in het kantoor van de klant.
Stap 7: Rapportage
+Na het afronden van de test zal een rapport worden geleverd waarin de resultaten en ontdekte kwetsbaarheden stap voor stap worden beschreven. Het rapport en de resultaten worden eventueel gepresenteerd aan de verantwoordelijke projectleider of -manager in het kantoor van de klant.
Stappen 4-6 kunnen meerdere malen herhaald worden per test. Voorbeeld: Toegang kan worden -verkregen in een extern systeem dat fungeert als een opstapje tot het interne netwerk. +
Stappen 4-6 kunnen meerdere malen herhaald worden per test. Zo kan er bijvoorbeeld door exploitatie van kwetsbaarheden toegang worden +verkregen tot een extern systeem dat fungeert als een opstapje tot het interne netwerk. Het interne netwerk zal vervolgens worden verkend in Stappen 4 en 5, om vervolgens te worden geëxploiteerd in Stap 6.
Ons vaste tarief voor de bovenstaand beschreven +
Ons vaste tarief voor de bovenstaand beschreven
Eventuele extra werkzaamheden zullen apart worden verrekend. +
Eventuele extra werkzaamheden zullen apart worden verrekend. Een uurtarief zal hieraan voorafgaand worden besproken.
Om de diensten naar behoren uit te kunnen voeren heeft
De onderliggende netwerkinfrastructuur, ..., ... en eventuele loadbalancing-infrastructuur maken geen deel uit van de scope. + Uitgesloten zijn ook:
+