Import current version from ftp.isc.org /pub/pgpcontrol.
This commit is contained in:
parent
0d307c03e1
commit
13f6c08718
1 changed files with 210 additions and 0 deletions
210
sign.sh
Executable file
210
sign.sh
Executable file
|
@ -0,0 +1,210 @@
|
|||
#!/bin/sh
|
||||
# vi:ts=4:ai
|
||||
# $Id$
|
||||
#
|
||||
# Unterzeichnet Newsartikel mittels PGP
|
||||
# Heiko Schlichting (heiko@fu-berlin.de)
|
||||
#
|
||||
# $Log$
|
||||
# Revision 1.1 2003/07/06 18:58:06 eagle
|
||||
# Import current version from ftp.isc.org /pub/pgpcontrol.
|
||||
#
|
||||
# Revision 1.8 1996/08/09 22:25:27 heiko
|
||||
# ignore case in headers but keep the right case to sign
|
||||
# filter unwanted headerlines
|
||||
# sign an already signed article works now
|
||||
#
|
||||
# Revision 1.7 1996/08/07 19:00:08 heiko
|
||||
# SIGNER could contain spaces.
|
||||
#
|
||||
# Revision 1.6 1996/08/07 18:17:13 lutz
|
||||
# SIGNER might be preset. (lutz@as-node.jena.thur.de)
|
||||
#
|
||||
# Revision 1.5 1996/08/07 01:36:35 heiko
|
||||
# Skip articles if not found.
|
||||
#
|
||||
# Revision 1.4 1996/08/07 01:15:38 heiko
|
||||
# Debug statement removed
|
||||
#
|
||||
# Revision 1.3 1996/08/07 01:14:22 heiko
|
||||
# Initial Version
|
||||
#
|
||||
#
|
||||
|
||||
###################### START OF CONFIGURATION SECTION ######################
|
||||
|
||||
# Configure pathnames to required programs
|
||||
GAWK=/usr/local/bin/gawk
|
||||
PGP=/usr/local/bin/pgp
|
||||
|
||||
# Who should sign the article?
|
||||
if [ -z "$SIGNER" ]; then
|
||||
SIGNER="de.admin.news.announce"
|
||||
fi
|
||||
|
||||
|
||||
# STORING YOUR PASS PHRASE IN A FILE IS A SECURITY HOLE!
|
||||
# If you don't define PGPPASSFILE, you can use this script interactively.
|
||||
PGPPASSFILE=""
|
||||
|
||||
####################### END OF CONFIGURATION SECTION #######################
|
||||
|
||||
PRG=$0
|
||||
|
||||
check()
|
||||
{
|
||||
if [ ! -x $1 ]; then
|
||||
echo "Required executable $1 not found."
|
||||
echo "You should configure $PRG."
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
# Usage message
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $PRG article ..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Are the executables available?
|
||||
for EXE in $GAWK $PGP;
|
||||
do
|
||||
check "$EXE"
|
||||
done
|
||||
|
||||
if [ ! -z "$PGPPASSFILE" -a -f "$PGPPASSFILE" ];
|
||||
then
|
||||
PGPPASS=`cat "$PGPPASSFILE"`
|
||||
export PGPPASS
|
||||
fi
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
article=$1
|
||||
if [ ! -f ${article} ]; then
|
||||
echo "${article}: not found - skipped"
|
||||
shift
|
||||
continue
|
||||
fi
|
||||
rm -f ${article}.new
|
||||
trap "rm -f ${article}.new; exit 0" 0 1 2 3 15
|
||||
$GAWK -F: '
|
||||
BEGIN{
|
||||
# Which headers should be signed?
|
||||
headernames="Subject:Control:Message-ID:Date:From:Sender:Newsgroups:Approved:Followup-To"
|
||||
split(headernames,header)
|
||||
IGNORECASE=1
|
||||
body=0
|
||||
i=0
|
||||
last=0
|
||||
}
|
||||
|
||||
# After processing the header, print it
|
||||
!NF&&!body{
|
||||
body=1
|
||||
print "X-Signed-Headers:",sig
|
||||
for (h=0; h < i; h++) {
|
||||
print ph[h]
|
||||
}
|
||||
}
|
||||
|
||||
# Article body
|
||||
body{print;next}
|
||||
|
||||
# For continuation header lines
|
||||
$0~/^[ \t]/ {
|
||||
if (last==1) {
|
||||
ph[i-1]=ph[i-1]"\n"$0
|
||||
}
|
||||
next
|
||||
}
|
||||
|
||||
# Normal header lines
|
||||
{
|
||||
for (h in header) {
|
||||
if (match($1,"^"header[h]"$")){
|
||||
ph[i]=$0
|
||||
if (i) {
|
||||
sig=sig","$1
|
||||
}else{
|
||||
sig=$1
|
||||
}
|
||||
i++
|
||||
last=1
|
||||
next
|
||||
}else{
|
||||
last=0
|
||||
}
|
||||
}
|
||||
}
|
||||
' $article | $PGP -fast -u "$SIGNER" +verbose=0 +language="en" |
|
||||
$GAWK -v artfile="$article" '
|
||||
BEGIN{
|
||||
body=0
|
||||
skip=0
|
||||
version="unknown"
|
||||
# Which header should be filtered?
|
||||
filternames="X-PGP-Sig:NNTP-Posting-Host:NNTP-Posting-User:Path:To:Cc:X-Access:Lines:X-Newsreader"
|
||||
split(filternames,filter,":")
|
||||
IGNORECASE=1
|
||||
while ((getline header < artfile) >0) {
|
||||
if (length(header)>0) {
|
||||
if (skip && match(header,/^[ \t]/)){
|
||||
continue
|
||||
}
|
||||
skip=0
|
||||
for (f in filter) {
|
||||
if (match(header,"^"filter[f]":[ \t]")){
|
||||
skip=1
|
||||
}
|
||||
}
|
||||
if (!skip) {
|
||||
print header
|
||||
}
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
IGNORECASE=0
|
||||
}
|
||||
$1~/^X-Signed-Headers:/&&!body{
|
||||
sig=$2
|
||||
next
|
||||
}
|
||||
$0~/^-----BEGIN PGP SIGNATURE-----$/{
|
||||
body=1
|
||||
next
|
||||
}
|
||||
$0~/^Version:/&&(body==1){
|
||||
version=$2
|
||||
next
|
||||
}
|
||||
$0~/^-----END PGP SIGNATURE-----$/{
|
||||
body=0
|
||||
next
|
||||
}
|
||||
!NF&&(body==1){
|
||||
body=2
|
||||
print "X-PGP-Sig:",version,sig
|
||||
next
|
||||
}
|
||||
body==2{
|
||||
print "\t"$0
|
||||
}
|
||||
END{
|
||||
print ""
|
||||
while ((getline < artfile) >0) {
|
||||
print $0
|
||||
}
|
||||
close (artfile)
|
||||
}
|
||||
' > ${article}.new
|
||||
if [ -s ${article}.new ]; then
|
||||
mv ${article} ${article}.bak
|
||||
mv ${article}.new $article
|
||||
echo "${article}: ok"
|
||||
else
|
||||
echo "${article}: FAILED"
|
||||
rm -f ${article}.new
|
||||
fi
|
||||
shift
|
||||
done
|
Loading…
Reference in a new issue