#!/bin/bash
# visitas.cgi - Livro de Visitas em Shell Script
#
# Site....: http://thobias.org
# Autor...: Thobias Salazar Trevisan 
# Licença.: GPL
#
# Changelog:
# 14/03/2005 - limpeza/reescrita do codigo. (ta **muito** mais legivel)
#            - nao usa mais arquivos temporarios (valeu aurelio pelas dicas)
#            - urldecode (sai sed gigante, entra 'echo -e' e um sedizinho) 
#            - adicionado opcao para 'esconder' o mail
#            - adicionado limite maximo para o tamanho da mensagem
#            - pequenos bugs fixed
# 25/03/2004 - primeira versao
#
#############################################################################
### CONFIGS
#
# arquivo que contera todas as mensagens do livro
# o usuario do apache deve ter permissao de escrever neste arquivo
file='/tmp/visitas.html'
#
# titulo da pagina
titulo='Livro de Visitas da Página do Thobias'
#
# cores da pagina
page_color='black'
text_color='snow'
link_color='lightgreen'
#
# tamanho maximo da mensagem
# (o form atual gera um input de 44 caracteres)
# ,ie, o limite real para o usuario eh de 956 caracteres
max_size='1000'
#
# link e texto do rodape da pagina
link_rodape='http://thobias.org'
texto_rodape='Voltar para a página inicial.'
#
# email que recebera uma copia de cada novo post do livro.
# se nao especificado, nenhum mail eh enviado
MAILTO=''
# mascara os mails (esconde dos robos de spam). 1 liga 0 desliga
mask_mail='1'
#
#############################################################################

#############################################################################
# Mostra o cabecalho HTML da pagina
#############################################################################
cabecalho_html(){
cat <<FIM_HEADER
content-type: text/html

<html> <head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<title> $titulo </title> 
</head>
<body bgcolor="$page_color" text="$text_color" link="$link_color">
<center><h1>$titulo</h1></center>
<hr size=6 noshade>
FIM_HEADER
}

#############################################################################
# Monta o formulario para a postagem de uma nova mensgem
#############################################################################
monta_formulario(){
local estados="AC AL AM AP BA CE DF ES GO MA MG MS MT PA PB PE PI PR RJ \
RN RO RR RS SC SE SP TO"

cat <<FIM_FORM
<form method="post" action="${0##*/}">
nome: <input type="text" name="nome" maxlength="50" size="30"><p>
email: <input type="text" name="email" maxlength="50" size="30"><p>
cidade: <input type="text" name="cidade" maxlength="50" size="30">
Estado:
  <select name="estado">
  <option value="none">---
  $(for i in $estados;do echo \<option value="$i"\> $i;done)
  </select><p>
  Sua mensagem:<br>
  <textarea name="mensagem" wrap="physical" rows="6" cols="65"></textarea><p>
<input type="submit" value="Enviar Mensagem">
<input type="reset" value="Limpar">
</form>
<hr size=6 noshade>
FIM_FORM
}

#############################################################################
# Recebe e formata a nova mensagem 
#############################################################################
read_msg(){
local nome email cidade estado mensagem POST

# testa tamanho do input
[ $CONTENT_LENGTH -gt $max_size ] && {
echo "Sua mensagem ultrapassou o limite de $max_size caracteres. 
Por favor, diminua o tamanho da mensagem. Obrigado."; exit; }

# variavel no shell recebe conteudo da variavel do form
POST=$(sed 's/&/\
/g') ; eval "$POST"
# URL decode
nome=$(echo "$nome" | sed 's/+/ /g;s/%/\\x/g;s/.*/echo -e "&"/' | bash)
email=$(echo "$email" | sed 's/+/ /g;s/%/\\x/g;s/.*/echo -e "&"/' | bash)
cidade=$(echo "$cidade" | sed 's/+/ /g;s/%/\\x/g;s/.*/echo -e "&"/' | bash)
mensagem=$(echo "$mensagem" | sed 's/+/ /g;s/%/\\x/g;s/.*/echo -e "&"/' |bash)

# arruma as variaveis
[ "$mask_mail" = "1" -a "$email" ] &&
    email=$(echo "$email" | sed 's/@/ [at] /;s/\./ dot /g')
email="${email:=no mail}";  nome="${nome:=anônimo}"
mensagem="$(echo "$mensagem" | sed 's/[\r\n]/<br>/g')"
# a variavel POST contem a mensagem no template utilizado no livro.
# facil de modificar para um formato diferente
POST="
$(date '+%d/%m/%Y') - <b>$nome</b> &lt;$email&gt; ($cidade - $estado)<br>
$mensagem <hr noshade>
"
# adiciona a nova mensagem
adiciona_msg "$POST"
}

#############################################################################
# Adiciona a nova mensagem no inicio do arquivo
#############################################################################
adiciona_msg(){
# adiciona a nova mensagem no arquivo
echo "<!-- inicio msg --> $1 <!-- fim msg -->" >> $file
echo >> $file
# se necessario, envia copia do novo post por mail 
[ "$MAILTO" ] && echo "$1" | mail -s "Livro de Visitas - $titulo" $MAILTO
}


#############################################################################
###### Principal 
#############################################################################

cabecalho_html         # mostra o cabecalho do html
monta_formulario       # mostra o formulario 
[ "$REQUEST_METHOD" = "POST" ] && read_msg # recebe a nova mensagem 

# mostra as mensagens atuais
# as ultimas mensagens estao no final do arquivo. esses seds fazem o
# trabalho sujo de ajeitar o arquivo para mostrar as ultimas primeiro 
sed '1!G;h;$!d' $file 2> /dev/null |
sed '/^ <!-- fim msg -->/{:a;/<!-- inicio msg -->/!{N;ba;};s/^[^\n]*/\
&§/;s/$/\
/;:b;s/\(.*\)§\(\n[^\n]*\)\n/\2\1§\
/;tb;s/^\n\(.*\).\n$/\1/;}'

# termina o html
echo "<a href=\"$link_rodape\">$texto_rodape</a>"
echo "</body>"
echo "</html>"