diff options
author | rhatto <rhatto> | 2005-08-06 16:42:19 +0000 |
---|---|---|
committer | rhatto <rhatto> | 2005-08-06 16:42:19 +0000 |
commit | c4642c3a4e23851ae99364450d4b9484e03a07d8 (patch) | |
tree | 515204e284d7db522ba33a5e3173003dd0a94aeb /firma | |
parent | 54fdfb9aff3ffca5cdd92606804957bc93b9c0f2 (diff) | |
download | firma-c4642c3a4e23851ae99364450d4b9484e03a07d8.tar.gz firma-c4642c3a4e23851ae99364450d4b9484e03a07d8.tar.bz2 |
desfazendo modificacoes das ultimas 2 revisoes
Diffstat (limited to 'firma')
-rwxr-xr-x | firma | 605 |
1 files changed, 173 insertions, 432 deletions
@@ -1,432 +1,173 @@ -#!/bin/bash -# -# firma: encrypted mailing list manager -# feedback: rhatto@riseup.net luis@riseup.net | GPL -# -# list configuration is passed thru the config file, -# where you put PARAMETER=value (whithout spaces) -# -# MAIL= path for smtp/wrapper binary (sendmail-like) -# MAIL_ARGS= smtp options (-oem -oi -t) -# GPG= path for gnupg binary -# LISTNAME= list email -# LISTADMIN= list administrator email addresses (space separated) -# GPGDIR= gpg dir for the lists' keyring -# PASSWD= passwd for the lists' keyring -# - -FIRMA_LIST_PATH="/usr/local/etc/lists" -VERSION="0.3" - -# todo: -# errase all vars before quit the game -# unset MESSAGE -# unset GPG_MESSAGE -# umask .... - -function usage { - echo "usage: $(basename $0) OPTION [LIST-NAME]" - echo " -a: admin commands" - echo " -c: create a new list" - echo " -h: display this help and exit" - echo " -p: process a message" - echo " -r: admin and user requests (mail only)" - echo " -v: output version information and exit" -} - -function version { - echo "firma $VERSION" - echo "Copyright (C) 2005 A Firma, Inc." - echo "This program comes with ABSOLUTELY NO WARRANTY." - echo "This is free software, and you are welcome to redistribute it" - echo "under certain conditions. See the GNU General Public License" - echo "for more details." -} - -function check_config { - # check configuration file parameters - if [ ! -f $GPG -o ! -x $GPG ]; then - echo "$CONFIG_FILE: GPG binary ($GPG) could not be found." - exit 1 - elif [ ! -f $MAIL -o ! -x $MAIL ]; then - echo "$CONFIG_FILE: Mail program ($MAIL) could not be found." - exit 1 - elif [ ! -d $GPGDIR -o ! -f $GPGDIR/pubring.gpg -o ! -f $GPGDIR/secring.gpg ]; then - echo "$CONFIG_FILE: GPG home directory ($GPGDIR) or the GPG keyrings could not be found." - exit 1 - elif [ -z "$(cat $CONFIG | grep -o ^PASSWD=\'[^\']*\'$)" -o \ - -z "$(echo -n $PASSWD)" -o \ - "$(echo -n $PASSWD | wc -m)" -lt "25" -o \ - -z "$(echo -n $PASSWD | grep -o [[:lower:][:upper:]])" -o \ - -z "$(echo -n $PASSWD | grep -o [[:digit:]])" -o \ - "$(echo -n $PASSWD | grep -o [[:punct:]] | wc -l)" -lt "5" ]; then - echo "$CONFIG_FILE: PASSWD is empty or does not meet the minimum complexity requirements." - echo "$CONFIG_FILE: Please set a new passphrase for the list's private key. Make it at least" - echo "$CONFIG_FILE: 25 characters long (using a combination of letters, numbers and at least" - echo "$CONFIG_FILE: 5 special characters) and enclose it in 'single quotes'. The passphrase" - echo "$CONFIG_FILE: itself, though, cannot contain any single quote." - exit 1 - elif [ -z "$($GPGLIST | grep ^pub | cut -d : -f 10 | grep -i \<$LISTNAME\>$)" ]; then - echo "$CONFIG_FILE: GPG key for list \"$LISTNAME\" could not be found." - echo "$CONFIG_FILE: Note that this parameter expects an email address." - exit 1 - else - for ADMIN in $LISTADMIN; do { - if [ -z "$($GPGLIST | grep ^pub | cut -d : -f 10 | grep -i \<$ADMIN\>$)" ]; then - echo "$CONFIG_FILE: GPG key for list administrator \"$ADMIN\" could not be found." - echo "$CONFIG_FILE: Note that this parameter expects one or more space separated email addresses." - exit 1 - fi; } - done - fi -} - -function get_gpg_stderr { - # discard $GPGDECRYPT STDOUT and get its STDERR instead, for signature checking - echo -e "$PASSWD\n${GPG_MESSAGE[@]}" | sed -e 's/^ //' | ($GPGDECRYPT --status-fd 2 1> /dev/null) 2>&1 -} - -function get_subscribers_list { - # get list susbscriber's addresses - $GPGLIST | sed -ne "/$LISTNAME/Id" -e '/pub/p' | cut -d : -f 10 | grep -o '<[^<>]*>$' | sed -e 's/[<>]//g' -} - -function get_message { - n=0 - while read STDIN; do - MESSAGE[$n]="$STDIN\n" - ((++n)) - done - echo $n -} - -function get_gpg_message { - signal=0 - x=0 ; n=$1 - for ((count=0;count<=n;count++)); do - if [[ $signal == "0" ]] && [[ "$(echo "${MESSAGE[$count]}" | grep -v -e "-----BEGIN PGP MESSAGE-----")" == "" ]]; then - GPG_MESSAGE[$x]=${MESSAGE[$count]} - ((++x)) - signal=1 - elif [[ $signal == "1" ]]; then - GPG_MESSAGE[$x]=${MESSAGE[$count]} - ((++x)) - if [[ "$(echo "${MESSAGE[$count]}" | grep -v -e "-----END PGP MESSAGE-----")" == "" ]]; then - signal=0 - fi - fi - done -} - -function get_message_headers { - # get the message headers and the sender's email address - FROM=$(echo -e "${MESSAGE[@]}" | grep -m 1 "From:" | cut -d : -f 2- | sed -e 's/^ //') - FROMADD=$( - if [ -z "$(echo $FROM | grep '>$')" ]; then - echo $FROM - else - echo $FROM | grep -o '<[^<>]*>$' | sed -e 's/[<>]//g' - fi - ) - DATE=$(echo -e "${MESSAGE[@]}" | grep -m 1 "Date:" | sed -e 's/^ //') - SUBJECT=$(echo -e "${MESSAGE[@]}" | grep -m 1 "Subject:" | cut -d : -f 2- | sed -e 's/^ //') -} - -function message_list { -# compose and send a message to the list -# $1: subscriber email -# sorry no identation :P -n=0 -echo "$PASSWD -Message from: $FROM -Subject: $SUBJECT -$DATE - -$(get_gpg_stderr | grep -F 'gpg: Signature made') -$(get_gpg_stderr | grep -F 'gpg: Good signature from') - -$(echo -e "$PASSWD\n${GPG_MESSAGE[@]}" | $GPGDECRYPT 2> /dev/null)" | sed -e 's/=20$//' | $GPGENCRYPT $1 | while read STDIN; do - LIST_MESSAGE[$n]="$STDIN\n" - ((++n)) -done - -# send the message to the list -echo "From: $LISTNAME -To: $1 -Subject: none - -$(echo -e "${LIST_MESSAGE[@]}")" | $MAIL $MAIL_ARGS - -} - -function message_list_error { -# compose and send an error message -# sorry no identation :P -n=0 -echo "$PASSWD -Message from: $FROM -Subject: [BAD SIGNATURE] $SUBJECT -$DATE - -$(get_gpg_stderr | grep -F 'gpg: Signature made') -$(get_gpg_stderr | grep -F 'gpg: BAD signature from') - -$(echo -e "$PASSWD\n${GPG_MESSAGE[@]}" | $GPGDECRYPT 2> /dev/null)" | sed -e 's/=20$//' | $GPGENCRYPT $1 | while read STDIN; do - LIST_MESSAGE[$n]="$STDIN\n" - ((++n)) -done - -# send the message to the list -echo "From: $LISTNAME -To: $1 -Subject: none - -$(echo -e "${LIST_MESSAGE[@]}")" | $MAIL $MAIL_ARGS - -} - -function message_list_return { -# send a bounce message -# $1: sender email (usually $FROMADD) -# sorry no identation :P -echo "From: $LISTNAME -To: $1 -Subject: none - -Message from: $FROM -Subject: [RETURNED MAIL] $SUBJECT -$DATE - - [ It was not possible to process this message. Either or both - the message was not encrypted and/or signed, or you are not - subscribed to this list. Contact the list administrator if - you have any questions. ] - - -- - firma v$VERSION" | $MAIL $MAIL_ARGS -} - -function process_message { - # process a message sent to the list - - lines=$(get_message) - get_message_headers - get_gpg_message $lines - - # if signature is Good, encrypt and send it for each list subscriber - # todo: declare a function to decrypt, re-encrypt and send the list messages - if (get_gpg_stderr | grep -Fq GOODSIG); then - - for EMAIL in $(get_subscribers_list); do - message_list $EMAIL - done - - # else, if signature is BAD, email it back to the list admins and to sender - elif (get_gpg_stderr | grep -Fq BADSIG) ; then - - for EMAIL in $(echo $LISTADMIN $FROMADD); do - message_list_error $EMAIL - done - - # else, probably either the message was not signed or the sender is not subscribed to the list - # email the message back to sender including a note about this - # todo: parse STDERR to find out why the signature couldn't be checked and send more specific errors back to sender - else - message_list_return $FROMADD - fi - -} - -function newlist { - # create a list if it doesnt already exist - if [ ! -d "$CONFIG_PATH" ]; then - echo creating folder $CONFIG_PATH... - mkdir "$CONFIG_PATH" # || (echo "error creating $CONFIG_PATH: installation aborted"; exit 1) - echo "creating list config file and will ask some questions." - - read -p "path to nail command (eg, /usr/bin/nail): " MAIL - read -p "path to gpg binary (eg, /usr/bin/gpg): " GPG - - # if [ ! -x $GPG ]; then - - read -p "list keyring folder (defaults to $GPGDIR): " GPGDIR - - # todo: please no utf-8 (see DETAILS) - read -p "list email (eg, firma@domain.tld): " LISTNAME - read -p "list admins emails (space delimited): " LISTADMIN - read -p "list description (fake?): " DESCRIPTION - read -p "password for list keyring (use a huge one): " PASSWD - - # todo: key specs (size, expiry date...) - - echo "creating your config..." - touch $CONFIG - chown root.root $CONFIG - chmod 600 $CONFIG - if [ -f $CONFIG ]; then - gpg_args - echo -e "MAIL=$MAIL\nGPG=$GPG\nGPGDIR=$GPGDIR\nLISTNAME=$LISTNAME\nLISTADMIN=$LISTADMIN\nPASSWD=$PASSWD" > $CONFIG - echo "now generating your keyring..." - - $GPGCOMMAND --gen-key <<EOF - - Key-Type: DSA - Key-Length: 1024 - Subkey-Type: ELG-E - Subkey-Length: 1024 - - Name-Real: $DESCRIPTION - Name-Email: $LISTNAME - - Expire-Date: 0 - Passphrase: $PASSWD - %commit - -EOF - - fi - else - echo error creating $CONFIG_FILE: list already exists - exit 1 - fi -} - -function gpg_args { - # declare GPG variables - GPGFLAGS="--quiet --homedir $GPGDIR --batch --no-tty --no-use-agent --no-permission-warning" - GPGCOMMAND="$GPG $GPGFLAGS" - GPGLIST="$GPGCOMMAND --list-keys --with-colons" - GPGDECRYPT="$GPGCOMMAND --passphrase-fd 0 --decrypt" - GPGENCRYPT="$GPGCOMMAND --passphrase-fd 0 --always-trust --encrypt --sign --armor --recipient" -} - -function list_admin { - if [ "$1" = "use" ]; then - if [ "$#" -lt "2" ]; then - echo "$(basename $0): Too few arguments. Command \"use\" expects an email address as argument." - return 1 - elif [ "$#" -gt "2" ]; then - echo "$(basename $0): Too many arguments. Command \"use\" expects just one email address as argument." - return 1 - elif [ -z "$(echo -ne $2 | grep -o '[^@]\+@[^@]\+')" ]; then - echo "$(basename $0): Invalid argument. Command \"use\" expects an email address as argument." - return 1 - else - choose_uid $2 - fi - else - echo "$(basename $0): \"$1\": command not found" - fi -} - -function choose_uid { - - KEYID="$($GPGLIST --fixed-list-mode $1 2> /dev/null | grep ^pub | cut -d : -f 5 | grep -o '.\{8\}$')" - - if [ -z "$($GPGLIST --fingerprint --fixed-list-mode $1 2> /dev/null | grep -i \<$1\>:$ | cut -d : -f 10)" ]; then - echo "$CONFIG_FILE: \"$(echo -ne $1 | tr A-Z a-z)\" is not associated with any public key on this keyring." - return 1 - elif [ "$($GPGLIST --fixed-list-mode $1 2> /dev/null | grep ^uid | wc -l)" -eq "1" ]; then - echo "$CONFIG_FILE: \"$(echo -ne $1 | tr A-Z a-z)\" is part of the only UID on public key \"$KEYID\"." - return 1 - elif [ "$($GPGLIST --fixed-list-mode $1 2> /dev/null | grep -iF $1 | cut -d : -f 10 | wc -l)" -gt "1" ]; then - echo "$CONFIG_FILE: \"$(echo -ne $1 | tr A-Z a-z)\" is listed in more than one UID on this keyring. Narrow down your selection" - echo "$CONFIG_FILE: or delete all but one of the public keys associated with this email address." - return 1 - fi - - expect -nN -- << EOF - log_user 0 - set timeout 5 - - set keyid [eval exec $GPG --fingerprint --with-colons --fixed-list-mode $1 | grep ^fpr | cut -d : -f 10] - set uid_count [eval exec $GPG --list-keys --with-colons --fixed-list-mode \$keyid | grep ^uid | wc -l] - set chosen_uid [eval exec $GPG --list-keys --with-colons --fixed-list-mode \$keyid | grep ^uid | grep -ni $1 | cut -d : -f 1] - - eval spawn -noecho $GPG --with-colons --command-fd 0 --status-fd 1 --edit-key \$keyid - expect "GET_LINE keyedit.prompt" { - set uid 1 - while { \$uid <= \$uid_count } { - if { \$uid != \$chosen_uid } { - send "uid \$uid\n" - expect "GET_LINE keyedit.prompt" - } - set uid [incr uid] - } - send "deluid\n" - expect "GET_BOOL keyedit.remove.uid.okay" {send "yes\n"} - expect "GET_LINE keyedit.prompt" {send "save\n"} - expect "GOT_IT" - } - - wait - send_user "$CONFIG_FILE: \"$(echo -ne $1 | tr A-Z a-z)\" chosen successfully. [ expr \$uid_count - 1 ] UIDs deleted from public key \"$KEYID\".\n" - interact - -EOF -} - -# main - -# command line checking -if [ -z "$2" -a "$1" != "-c" -a "$1" != "-h" -a "$1" != "-v" ]; then - usage - exit 1 -else - CONFIG_FILE="$2" - CONFIG_PATH="$FIRMA_LIST_PATH/$2" - CONFIG="$CONFIG_PATH/$2.conf" -fi - -# if the configuration file exists, disable "sourcepath" and evaluate the parameters -if [ "$1" != "-c" -a "$1" != "-h" -a "$1" != "-v" ]; then - if [ -f $CONFIG ]; then - shopt -u sourcepath && source $CONFIG - else - echo "$(basename $0): Configuration file \"$CONFIG\" could not be found." - exit 1 - fi -fi - -declare -a MESSAGE -declare -a GPG_MESSAGE -declare n -export LANG=en_US - -# get gpg parameters and check the config -if [ "$1" = "-a" -o "$1" = "-p" -o "$1" = "-r" ]; then - gpg_args - check_config -fi - -# command line parsing -if [ "$1" = "-a" ]; then - - declare -a ADMINCOMMANDS - - n=0 - while read STDIN; do - ADMINCOMMANDS[$n]="$STDIN\n" - ((n++)) - done - - for i in $(seq 0 $((${#ADMINCOMMANDS[@]} - 1))); do - if [ ! -z "$(echo -ne ${ADMINCOMMANDS[$i]})" -a "$(echo -ne ${ADMINCOMMANDS[$i]} | cut -c1)" != "#" ]; then - list_admin $(echo -ne "${ADMINCOMMANDS[$i]}") - fi - done - -elif [ "$1" = "-c" ]; then - newlist -elif [ "$1" = "-h" ]; then - usage -elif [ "$1" = "-p" ]; then - process_message -elif [ "$1" = "-r" ]; then - list_request -elif [ "$1" = "-v" ]; then - version -else - usage - exit 1 -fi - +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en "> + + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <title>codecoop: Exiting with error</title> + <link rel="alternate" title="codecoop - Project News Highlights RSS" href="/export/rss_sfnews.php" type="application/rss+xml"/> + <link rel="alternate" title="codecoop - New Projects RSS" href="/export/rss_sfprojects.php" type="application/rss+xml"/> + + <script language="JavaScript" type="text/javascript"> + <!-- + + function admin_window(adminurl) { + AdminWin = window.open( adminurl, 'AdminWindow','scrollbars=yes,resizable=yes, toolbar=yes, height=400, width=400, top=2, left=2'); + AdminWin.focus(); + } + function help_window(helpurl) { + HelpWin = window.open( helpurl,'HelpWindow','scrollbars=yes,resizable=yes,toolbar=no,height=400,width=400'); + } + // --> + </script> + +<style type="text/css"> + <!-- + BODY { + margin-top: 3; + margin-left: 3; + margin-right: 3; + margin-bottom: 3; + background-image: url("/themes/gforge/images/theme-top-blue.png"); + } + ol,ul,p,body,td,tr,th,form { font-family: verdana,arial,helvetica,sans-serif; font-size:small; + color: #333333; } + + h1 { font-size: x-large; font-family: verdana,arial,helvetica,sans-serif; } + h2 { font-size: large; font-family: verdana,arial,helvetica,sans-serif; } + h3 { font-size: medium; font-family: verdana,arial,helvetica,sans-serif; } + h4 { font-size: small; font-family: verdana,arial,helvetica,sans-serif; } + h5 { font-size: x-small; font-family: verdana,arial,helvetica,sans-serif; } + h6 { font-size: xx-small; font-family: verdana,arial,helvetica,sans-serif; } + + pre,tt { font-family: courier,sans-serif } + + a:link { text-decoration:none; color: #0000be } + a:visited { text-decoration:none; color: #0000be } + a:active { text-decoration:none } + a:hover { text-decoration:underline; color:red } + + .titlebar { color: black; text-decoration: none; font-weight: bold; } + a.tablink { color: black; text-decoration: none; font-weight: bold; font-size: x-small; } + a.tablink:visited { color: black; text-decoration: none; font-weight: bold; font-size: x-small; } + a.tablink:hover { text-decoration: none; color: black; font-weight: bold; font-size: x-small; } + a.tabsellink { color: #0000be; text-decoration: none; font-weight: bold; font-size: x-small; } + a.tabsellink:visited { color: #0000be; text-decoration: none; font-weight: bold; font-size: x-small; } + a.tabsellink:hover { text-decoration: none; color: #0000be; font-weight: bold; font-size: x-small; } + --> +</style> +<link rel="stylesheet" type="text/css" href="/plugins/scmcvs/cvsweb/css/cvsweb.css" /></head> + +<body> + +<table border="0" width="100%" cellspacing="0" cellpadding="0"> + + <tr> + <td><a href="/"><img src="/themes/gforge/images/logo.png" border="0" alt="" width="198" height="52" /></a></td> + <td> + <form action="/search/" method="get"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><td> + <div align="center" style="font-size:smaller"><select name="type_of_search"><option value="soft">Software/Group</option> +<option value="people">People</option> +<option value="skill">Skill</option> +</select></div></td><td> </td><td><input type="text" size="12" name="words" value="" /></td><td> </td><td><input type="submit" name="Search" value="Search" /></td></tr></table></form></td> + <td align="right"> <b><a style="color: #FFFFFF" href="/account/login.php">Log In</a></b><br /> + <b><a style="color: #FFFFFF" href="/account/register.php">New Account</a></b> + </td> + <td> </td> + </tr> + +</table> + +<table border="0" width="100%" cellspacing="0" cellpadding="0"> + + <tr> + <td> </td> + <td colspan="3"> + + + + <!-- start tabs --> + + <table border="0" cellpadding="0" cellspacing="0" width="100%"> + <tr> + <td valign="top" width="10" background="/themes/gforge/images/theme-toptab-end-selected.png"><img src="/themes/gforge/images/clear.png" height="25" width="10" alt="" /></td><td background="/themes/gforge/images/theme-toptab-selected-bg.png" width="25%" align="center"><a class="tabsellink" href="/">Home</a></td> + <td colspan="2" valign="top" width="20" background="/themes/gforge/images/theme-toptab-selected-notselected.png"><img src="/themes/gforge/images/clear.png" height="2" width="20" alt="" /></td><td background="/themes/gforge/images/theme-toptab-notselected-bg.png" width="25%" align="center"><a class="tablink" href="/my/">My Page</a></td> + <td colspan="2" valign="top" width="20" background="/themes/gforge/images/theme-toptab-notselected-notselected.png"><img src="/themes/gforge/images/clear.png" height="2" width="20" alt="" /></td><td background="/themes/gforge/images/theme-toptab-notselected-bg.png" width="25%" align="center"><a class="tablink" href="/softwaremap/">Project Tree</a></td> + <td colspan="2" valign="top" width="20" background="/themes/gforge/images/theme-toptab-notselected-notselected.png"><img src="/themes/gforge/images/clear.png" height="2" width="20" alt="" /></td><td background="/themes/gforge/images/theme-toptab-notselected-bg.png" width="25%" align="center"><a class="tablink" href="/people/">Project Openings</a></td> + <td valign="top" width="10" background="/themes/gforge/images/theme-toptab-notselected-end.png"><img src="/themes/gforge/images/clear.png" height="2" width="10" alt="" /></td></tr><tr><td colspan="3" height="1" bgcolor="#e0e0e0"><img src="/themes/gforge/images/clear.png" height="1" width="10" /></td><td colspan="9" height="1" bgcolor="#909090"><img src="/themes/gforge/images/clear.png" height="1" width="10" /></td></tr> + </table> + + <!-- end tabs --> + + </td> + <td> </td> + </tr> + + <tr> + <td align="left" bgcolor="#E0E0E0" width="9"><img src="/themes/gforge/images/tabs/topleft.png" height="9" width="9" alt="" /></td> + <td bgcolor="#E0E0E0" width="30"><img src="/themes/gforge/images/clear.png" width="30" height="1" alt="" /></td> + <td bgcolor="#E0E0E0"><img src="/themes/gforge/images/clear.png" width="1" height="1" alt="" /></td> + <td bgcolor="#E0E0E0" width="30"><img src="/themes/gforge/images/clear.png" width="30" height="1" alt="" /></td> + <td align="right" bgcolor="#E0E0E0" width="9"><img src="/themes/gforge/images/tabs/topright.png" height="9" width="9" alt="" /></td> + </tr> + + <tr> + + <!-- Outer body row --> + + <td bgcolor="#E0E0E0"><img src="/themes/gforge/images/clear.png" width="10" height="1" alt="" /></td> + <td valign="top" width="99%" bgcolor="#E0E0E0" colspan="3"> + + <!-- Inner Tabs / Shell --> + + <table border="0" width="100%" cellspacing="0" cellpadding="0"> + <tr> + <td align="left" bgcolor="#ffffff" width="9"><img src="/themes/gforge/images/tabs/topleft-inner.png" height="9" width="9" alt="" /></td> + <td bgcolor="#ffffff"><img src="/themes/gforge/images/clear.png" width="1" height="1" alt="" /></td> + <td align="right" bgcolor="#ffffff" width="9"><img src="/themes/gforge/images/tabs/topright-inner.png" height="9" width="9" alt="" /></td> + </tr> + + <tr> + <td bgcolor="#ffffff"><img src="/themes/gforge/images/clear.png" width="10" height="1" alt="" /></td> + <td valign="top" width="99%" bgcolor="white"> + + <h2><span style="color:#FF3333">ERROR - No group_id was chosen</span></h2><p>No group Id was chosen</p> + <!-- end main body row --> + + + </td> + <td width="10" bgcolor="#ffffff"><img src="/themes/gforge/images/clear.png" width="2" height="1" alt="" /></td> + </tr> + <tr> + <td align="left" bgcolor="#E0E0E0" width="9"><img src="/themes/gforge/images/tabs/bottomleft-inner.png" height="11" width="11" alt="" /></td> + <td bgcolor="#ffffff"><img src="/themes/gforge/images/clear.png" width="1" height="1" alt="" /></td> + <td align="right" bgcolor="#E0E0E0" width="9"><img src="/themes/gforge/images/tabs/bottomright-inner.png" height="11" width="11" alt="" /></td> + </tr> + </table> + + <!-- end inner body row --> + + </td> + <td width="10" bgcolor="#E0E0E0"><img src="/themes/gforge/images/clear.png" width="2" height="1" alt="" /></td> + </tr> + <tr> + <td align="left" bgcolor="#E0E0E0" width="9"><img src="/themes/gforge/images/tabs/bottomleft.png" height="9" width="9" alt="" /></td> + <td bgcolor="#E0E0E0" colspan="3"><img src="/themes/gforge/images/clear.png" width="1" height="1" alt="" /></td> + <td align="right" bgcolor="#E0E0E0" width="9"><img src="/themes/gforge/images/tabs/bottomright.png" height="9" width="9" alt="" /></td> + </tr> +</table> + +<!-- PLEASE LEAVE "Powered By GForge" on your site --> +<br /> +<center> +<a href="http://gforge.org/"><img src="/images/pow-gforge.png" alt="Powered By GForge Collaborative Development Environment" border="0" /></a> +</center> + + +</body> +</html> |