From ebffd9460f266191f02550cf92ec8b03b0d5807f Mon Sep 17 00:00:00 2001 From: skyanth Date: Mon, 20 Mar 2017 14:48:37 +0100 Subject: [PATCH 01/10] Implemented Rate Cards --- xml/RELEASE_NOTES.md | 32 ++++- xml/dtd/common.xsd | 32 +++++ xml/dtd/invoice.xsd | 10 +- xml/dtd/ratecard.xsd | 58 ++++++++ xml/source/client_info.xml | 48 ++++--- xml/source/snippets/company_info.xml | 6 +- xml/xslt/att-set.xslt | 33 +++-- xml/xslt/auto.xslt | 17 +++ xml/xslt/block.xslt | 45 +++--- xml/xslt/generate_ratecard.xsl | 170 ++++++++++++++++++++++ xml/xslt/placeholders.xslt | 201 ++++++++++++++++----------- xml/xslt/styles.xslt | 1 + xml/xslt/styles_rat.xslt | 119 ++++++++++++++++ xml/xslt/table.xslt | 2 +- 14 files changed, 617 insertions(+), 157 deletions(-) create mode 100644 xml/dtd/ratecard.xsd create mode 100644 xml/xslt/generate_ratecard.xsl create mode 100644 xml/xslt/styles_rat.xslt diff --git a/xml/RELEASE_NOTES.md b/xml/RELEASE_NOTES.md index 3ad834c..4b70ae4 100644 --- a/xml/RELEASE_NOTES.md +++ b/xml/RELEASE_NOTES.md @@ -1,17 +1,41 @@ RELEASE NOTES ============= +March 20th, 2017 +---------------- + +### Rate cards + +The file client_info.xml, now accepts standard rates for the client. These can be called from the snippet ratecard.xml to generate a rate card, i.e. a PDF specifying the rates a client can expect to pay. Note that the 'average rate per hour per pentester' indication is currently based on the average of the junior and medior pentester rate, rounded up to the nearest 5, +/- 10. + +In client_info.xml, we want the following info (everything except junior and medior pentester is optional, other entries can be added if needed): + +``` + + 100 + 200 + 500 + 1000 + 100 + 125 + +``` + + +Usage: `snippets/ratecard/ratecard.xml --> ratecard.pdf (using generate_ratecard.xsl and fop)` + + February 27th, 2017 ------------------- -###Optional extra info field in invoices +### Optional extra info field in invoices An extra element with the imaginative name `` has been added to client_info.xml. In this field you can enter a line requested by the client, such as creditor number, cost centre, internal account number or whatever info they need for their internal administration. If not needed, delete or leave empty. February 24th, 2017 ------------------- -###Pie chart linking +### Pie chart linking All pie charts now show a finding count in the legend label. @@ -21,7 +45,7 @@ The summary table is now ordered on threat level severity and each finding ID in Generated links (e.g. ``) now have an optional attribute `@includepage` which can be set to `yes` or `no` (default is `yes`). If set to `yes`, the link will be generated as it was up till now (e.g. "SID-001 (page 4)"); if set to `no`, the link will be generated without the page number in parenthesis. -###The big pre/code/monospace switch +### The big pre/code/monospace switch To have better compatibility with HTML and markdown-to-xml scripts, we have slimmed down and mixed up the `
`, `` and `` tags. I tried to describe what was what and is now something else, but it became way too confusing. To keep it simple, just know this:
 
@@ -31,7 +55,7 @@ To have better compatibility with HTML and markdown-to-xml scripts, we have slim
 January 12th, 2017
 ------------------
 
-###Pie charts
+### Pie charts
 
 You can now generate pie charts for any countable data that might be in the report. You can do so using the element ``, where `x` is the attribute value of any element `y` in the document (useful charts would be `threatLevel` for `x` and `finding` for `y` to show a pie chart of the share of findings by threat level, or `type` for `x` and `finding` for `y` to show a pie chart of the share of findings by type). The height (and width) of the pie is set in the pieHeight attribute, where `z` is the height of the pie chart in px.
 
diff --git a/xml/dtd/common.xsd b/xml/dtd/common.xsd
index 44071e2..8b79b8d 100644
--- a/xml/dtd/common.xsd
+++ b/xml/dtd/common.xsd
@@ -99,6 +99,7 @@
         
         
         
+        
       
       
       
@@ -106,6 +107,24 @@
     
   
 
+  
+    
+      
+        
+      
+      
+      
+    
+  
+  
+    
+      
+        
+          
+        
+      
+    
+  
   
     
       
@@ -242,8 +261,11 @@
         
       
       
+      
     
   
+  
+  
 
   
     
@@ -430,6 +452,16 @@
     
   
 
+  
+    
+      
+        
+        
+        
+      
+    
+  
+
   
     
       
diff --git a/xml/dtd/invoice.xsd b/xml/dtd/invoice.xsd
index 71c7e27..d080f44 100644
--- a/xml/dtd/invoice.xsd
+++ b/xml/dtd/invoice.xsd
@@ -17,15 +17,7 @@
             
             
             
-            
-                
-                    
-                        
-                        
-                        
-                    
-                
-            
+            
         
     
     
diff --git a/xml/dtd/ratecard.xsd b/xml/dtd/ratecard.xsd
new file mode 100644
index 0000000..ca664dd
--- /dev/null
+++ b/xml/dtd/ratecard.xsd
@@ -0,0 +1,58 @@
+
+
+    
+    
+    
+    
+        
+            
+                
+                
+                
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                
+            
+            
+        
+    
+    
+        
+            
+                
+                
+            
+        
+    
+    
+    
+        
+            
+            
+            
+        
+        
+        
+    
+    
+    
+        
+            
+            
+            
+            
+            
+            
+            
+        
+    
+
diff --git a/xml/source/client_info.xml b/xml/source/client_info.xml
index c09af69..e6b973a 100644
--- a/xml/source/client_info.xml
+++ b/xml/source/client_info.xml
@@ -7,24 +7,32 @@
 
 
-  Sitting Duck B.V.
-  
-  Sitting Duck
-  
-  I.M. Portant
-  
-  B.I.G. Wig
-  
-  Sir Knowsalot
-  
-  
Reed Street 42
- 0000 - Pond City - Amazonia - 9999999 - - - freemoney@sittingduck.com - - 0000000000B01 + Sitting Duck B.V. + + Sitting Duck + + I.M. Portant + + B.I.G. Wig + + Sir Knowsalot + +
Reed Street 42
+ 0000 + Pond City + Amazonia + 9999999 + + + freemoney@sittingduck.com + + 0000000000B01 + + 100 + 125 + 150 + 1000 + 100 + 125 +
diff --git a/xml/source/snippets/company_info.xml b/xml/source/snippets/company_info.xml index 0e7f2b7..42916ea 100644 --- a/xml/source/snippets/company_info.xml +++ b/xml/source/snippets/company_info.xml @@ -5,9 +5,9 @@ Melanie Rieback Melanie Rieback -
Overdiemerweg 28
- 1111 PP - Diemen +
Zieseniskade 21
+ 1017 RT + Amsterdam The Netherlands +31 6 10 21 32 40 info@radicallyopensecurity.com diff --git a/xml/xslt/att-set.xslt b/xml/xslt/att-set.xslt index 603f416..f797e34 100644 --- a/xml/xslt/att-set.xslt +++ b/xml/xslt/att-set.xslt @@ -1,11 +1,14 @@ - - - + xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" + xmlns:fo="http://www.w3.org/1999/XSL/Format" version="2.0"> + + + + + + + @@ -27,22 +30,22 @@ - + - + - + - + + select="$CLASSES[@name = $CLASS]/@use-attribute-sets"/> - - + + @@ -50,5 +53,5 @@ - - \ No newline at end of file + + diff --git a/xml/xslt/auto.xslt b/xml/xslt/auto.xslt index 4e3d6d0..dbcb76b 100644 --- a/xml/xslt/auto.xslt +++ b/xml/xslt/auto.xslt @@ -833,5 +833,22 @@ black + + + + Generated average rate is based on 'juniorpentester' and 'mediorpentester' roles, which cannot be found in client_info.xml + + + + + + +   + + - + +   + + diff --git a/xml/xslt/block.xslt b/xml/xslt/block.xslt index 8c8e4b6..39f6f92 100644 --- a/xml/xslt/block.xslt +++ b/xml/xslt/block.xslt @@ -1,60 +1,61 @@ - + xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" + xmlns:fo="http://www.w3.org/1999/XSL/Format" version="2.0"> + + test=" + (parent::section and not(following-sibling::*)) or + (parent::appendix and not(following-sibling::*)) or + (ancestor::section and not(following-sibling::*) and not(parent::*/following-sibling::*) and not(parent::div) and not(parent::li)) or + (ancestor::appendix and not(following-sibling::*) and not(parent::*/following-sibling::*) and not(parent::div) and not(parent::li)) or + (not(self::title) and following-sibling::*[1][self::section]) or + (not(self::title) and following-sibling::*[1][self::finding]) or + (not(self::title) and following-sibling::*[1][self::non-finding])"> - + - + - + - + - + - + - - + + + - + - - \ No newline at end of file + + diff --git a/xml/xslt/generate_ratecard.xsl b/xml/xslt/generate_ratecard.xsl new file mode 100644 index 0000000..6204405 --- /dev/null +++ b/xml/xslt/generate_ratecard.xsl @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + £ + $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xml/xslt/placeholders.xslt b/xml/xslt/placeholders.xslt index 90d903e..059db2d 100644 --- a/xml/xslt/placeholders.xslt +++ b/xml/xslt/placeholders.xslt @@ -1,8 +1,7 @@ + xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fo="http://www.w3.org/1999/XSL/Format" + xmlns:my="http://radical.sexy" exclude-result-prefixes="xs" version="2.0"> @@ -35,8 +34,7 @@ - + @@ -59,6 +57,13 @@ + + + + + + + @@ -246,9 +251,9 @@ ( - - - + + + ) @@ -334,6 +339,12 @@ + + + + + + @@ -341,21 +352,20 @@ + + +   + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + @@ -458,28 +486,28 @@ - - 31 - - - - 28 - 29 - 28 - 29 - - - 31 - 30 - 31 - 30 - 31 - 31 - 30 - 31 - 30 - 31 - + + 31 + + + + 28 + 29 + 28 + 29 + + + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + @@ -525,8 +553,12 @@ --> - - + + + + + + @@ -535,12 +567,15 @@ s - - and - - - , - + + + and + + + , + + @@ -560,4 +595,4 @@ - \ No newline at end of file + diff --git a/xml/xslt/styles.xslt b/xml/xslt/styles.xslt index 1e3bac5..b4036f4 100644 --- a/xml/xslt/styles.xslt +++ b/xml/xslt/styles.xslt @@ -28,6 +28,7 @@ LiberationSansNarrow 12pt black + disregard-shifts diff --git a/xml/xslt/styles_rat.xslt b/xml/xslt/styles_rat.xslt new file mode 100644 index 0000000..3719e77 --- /dev/null +++ b/xml/xslt/styles_rat.xslt @@ -0,0 +1,119 @@ + + + + + + + + 12pt + + + always + center + white + bold + uppercase + + + + + + + 0.5cm + 1.5cm + 1.5cm + 1.5cm + 29.7cm + 21.0cm + + + 3.6cm + 1cm + + + true + 2.7cm + + + true + 0.6cm + 0 + + + 2cm + 1cm + + + true + 0.6cm + + + true + 0.6cm + 0 + + + right + normal + + + center + + + 0cm + 0cm + url(../graphics/logo_alt.png) + 30mm + scale-to-fit + scale-to-fit + uniform + + + 18pt + #FF5C00 + 1cm + + + normal + 18pt + + + + + + + + + + + + + + separate + 5mm + + + + 5pt + + + #EEEEEE + + + center + 16pt + 1cm + 1cm + bold + + + + + + diff --git a/xml/xslt/table.xslt b/xml/xslt/table.xslt index 278270b..72a28b2 100644 --- a/xml/xslt/table.xslt +++ b/xml/xslt/table.xslt @@ -5,7 +5,7 @@ version="2.0"> - + From 5eda197d75356f8c7865704e27926dc2bb459531 Mon Sep 17 00:00:00 2001 From: skyanth Date: Mon, 20 Mar 2017 14:48:54 +0100 Subject: [PATCH 02/10] Fixed ToC block attribute call --- xml/xslt/toc.xslt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xml/xslt/toc.xslt b/xml/xslt/toc.xslt index 082fa03..cc8978a 100644 --- a/xml/xslt/toc.xslt +++ b/xml/xslt/toc.xslt @@ -7,7 +7,7 @@ Table of Contents - + From 7754c7497c74ec8ab545367a565dc12d774ab633 Mon Sep 17 00:00:00 2001 From: skyanth Date: Mon, 20 Mar 2017 14:51:46 +0100 Subject: [PATCH 03/10] Fixed retest quote language selector --- xml/xslt/rep2off.xsl | 46 +++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/xml/xslt/rep2off.xsl b/xml/xslt/rep2off.xsl index d95c268..507b8c8 100644 --- a/xml/xslt/rep2off.xsl +++ b/xml/xslt/rep2off.xsl @@ -6,11 +6,18 @@ - + - + + + + + + en + + @@ -31,18 +38,16 @@ - - + + if there is a shorter way of saying the same thing, you can type it here (it makes for more dynamic offerte text). If not, just repeat the long name. - - + + snippets/company_info.xml @@ -61,7 +66,8 @@ client_info.xml - + + @@ -75,27 +81,35 @@ duration of pentest, in mandays - + + + TBD date or date range in text, e.g. May 18th until May 25th, 2015 - + + + TBD date or date range in text, e.g. May 18th until May 25th, 2015 - + + + time-boxed - + + + crystal-box @@ -140,6 +154,6 @@ - + From 2d41a37d13a783464755e7e3c9fe6edf018b3826 Mon Sep 17 00:00:00 2001 From: skyanth Date: Mon, 20 Mar 2017 15:12:11 +0100 Subject: [PATCH 04/10] =?UTF-8?q?fixed=20=E2=80=98my=E2=80=99=20namespace?= =?UTF-8?q?=20in=20result=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xml/xslt/placeholders.xslt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xml/xslt/placeholders.xslt b/xml/xslt/placeholders.xslt index 059db2d..a5b4759 100644 --- a/xml/xslt/placeholders.xslt +++ b/xml/xslt/placeholders.xslt @@ -1,7 +1,7 @@ + xmlns:my="http://radical.sexy" exclude-result-prefixes="xs my" version="2.0"> From 626f2b7d617a91b10ea1fa5bf73156fa3a023c64 Mon Sep 17 00:00:00 2001 From: skyanth Date: Mon, 20 Mar 2017 15:12:46 +0100 Subject: [PATCH 05/10] =?UTF-8?q?fixed=20space=20between=20=E2=80=98[N]?= =?UTF-8?q?=E2=80=99=20and=20=E2=80=98-day=E2=80=99=20in=20service=20desc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xml/xslt/generate_invoice.xsl | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/xml/xslt/generate_invoice.xsl b/xml/xslt/generate_invoice.xsl index 1a7a991..4eaf837 100644 --- a/xml/xslt/generate_invoice.xsl +++ b/xml/xslt/generate_invoice.xsl @@ -1,7 +1,7 @@ + xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:my="http://radical.sexy" exclude-result-prefixes="xs my" version="2.0"> @@ -72,6 +72,15 @@ + + -   + @@ -80,14 +89,7 @@ - - -    + Date: Mon, 20 Mar 2017 15:16:03 +0100 Subject: [PATCH 06/10] added generate_average_rate placeholder --- xml/dtd/ratecard.xsd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xml/dtd/ratecard.xsd b/xml/dtd/ratecard.xsd index ca664dd..5aab931 100644 --- a/xml/dtd/ratecard.xsd +++ b/xml/dtd/ratecard.xsd @@ -49,7 +49,7 @@ - + From 1b9d7175b79bfde761b6adf0ca29f0b48d6c0dd7 Mon Sep 17 00:00:00 2001 From: skyanth Date: Mon, 20 Mar 2017 15:34:13 +0100 Subject: [PATCH 07/10] Added handler for rate cards --- chatops/bash/handler_ratecard | 124 ++++++++++++++++++++++++++++++++++ chatops/scripts/rosbot.coffee | 7 ++ 2 files changed, 131 insertions(+) create mode 100644 chatops/bash/handler_ratecard diff --git a/chatops/bash/handler_ratecard b/chatops/bash/handler_ratecard new file mode 100644 index 0000000..5a1a4da --- /dev/null +++ b/chatops/bash/handler_ratecard @@ -0,0 +1,124 @@ +#!/bin/bash + +# handler_ratecard - builds PDF ratecards from thin air (using client_info.xml) +# +# 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.1 +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 +TARGET=snippets/ratecard/ratecard + +# Read standard 'command line' variables +[[ ! -z $1 ]] && REPO=$1 +[[ ! -z $2 ]] && RATECARD=$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: ratecard 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/ratecard-latest.pdf + $DOCBUILDER -c -i $TARGET.xml -o ../$targetpdf -x ../xslt/generate_ratecard.xsl --fop ../target/ratecard.fo $PARMS + if [[ $? -ne 0 ]]; then + echo "[-] Sorry, failed to generate $targetpdf" + exit 1 + fi + popd &>/dev/null + if [ ! -f target/ratecard-latest.pdf ]; then + echo "[-] hmmm... failed to build PDF file (could not find $targetpdf)" + exit 1 + fi +} + +add_to_repo() { + git add target/ratecard-latest.pdf + git commit -q -m "Ratecard automatically generated using ChatOps" &>/dev/null + git push -q >/dev/null +} + +preflight_checks +echo "Ratecard 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/scripts/rosbot.coffee b/chatops/scripts/rosbot.coffee index 30eba0b..b0d0796 100644 --- a/chatops/scripts/rosbot.coffee +++ b/chatops/scripts/rosbot.coffee @@ -192,6 +192,13 @@ module.exports = (robot) -> cmd = "bash/handler_invoice"; run_cmd cmd, args, (text) -> msg.send text.replace("\n",""); + robot.respond /ratecard (.*)/i, id:'chatops.ratecard', (msg) -> + msg.match[0] = msg.match[0].replace(/^[a-z0-9]+$/i); + msg.match.shift(); + args = msg.match[0].split(" "); + cmd = "bash/handler_ratecard"; + run_cmd cmd, args, (text) -> msg.send text.replace("\n",""); + robot.respond /quickscope (.*)/i, id:'chatops.quickscope', (msg) -> msg.match[0] = msg.match[0].replace(/^[a-z0-9]+$/i); msg.match.shift(); From 9db9b50bfedd8b819ff36f0aa5cea6e004422931 Mon Sep 17 00:00:00 2001 From: skyanth Date: Tue, 21 Mar 2017 11:10:26 +0100 Subject: [PATCH 08/10] Added extra line to clarify invoice_extra_field --- xml/source/client_info.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xml/source/client_info.xml b/xml/source/client_info.xml index e6b973a..9e57e18 100644 --- a/xml/source/client_info.xml +++ b/xml/source/client_info.xml @@ -23,9 +23,10 @@ Amazonia 9999999 - + freemoney@sittingduck.com - + + 0000000000B01 100 From 9425242a818207838fd4f0684031777d39ebdd59 Mon Sep 17 00:00:00 2001 From: skyanth Date: Tue, 21 Mar 2017 11:20:38 +0100 Subject: [PATCH 09/10] Updated Rate Card text From 1ce4dea272a33fc654472e4bb55dc482b568ea90 Mon Sep 17 00:00:00 2001 From: skyanth Date: Tue, 21 Mar 2017 12:14:55 +0100 Subject: [PATCH 10/10] Updated readme with correct rate card info --- xml/RELEASE_NOTES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xml/RELEASE_NOTES.md b/xml/RELEASE_NOTES.md index 4b70ae4..e665000 100644 --- a/xml/RELEASE_NOTES.md +++ b/xml/RELEASE_NOTES.md @@ -6,9 +6,9 @@ March 20th, 2017 ### Rate cards -The file client_info.xml, now accepts standard rates for the client. These can be called from the snippet ratecard.xml to generate a rate card, i.e. a PDF specifying the rates a client can expect to pay. Note that the 'average rate per hour per pentester' indication is currently based on the average of the junior and medior pentester rate, rounded up to the nearest 5, +/- 10. +The file client_info.xml, now accepts standard rates for the client. These can be called from the snippet ratecard.xml to generate a rate card, i.e. a PDF specifying the rates a client can expect to pay. -In client_info.xml, we want the following info (everything except junior and medior pentester is optional, other entries can be added if needed): +In client_info.xml, we want the following info: ```