#!/usr/bin/suidperl -U

# ####### alter_pwd.cgi #######
# ------------------------------
# Desenvolvido por Cau Guanabara
# em 24 de setembro de 2003.
# copyleft � 2003 Cau Guanabara
# Licen�a: GNU-GPL
# Contato: caugb@netflash.com.br
# ------------------------------
#
# Script para modificar valores no arquivo passwd do linux.
# ---------------------------------------------------------
# Pode-se mudar o ID do usu�rio ou do grupo,
# o nome, a pasta home e o shell do usu�rio.
# 
# >> Este script aceita par�metros via GET ou POST.
# -------------------------------------------------
# Mande por GET os par�metros 'user', 'param' e 'value', assim:
# .../alter_pwd.cgi?user=username&param=shell&value=/sbin/nologin
# ou chame o script sem enviar par�metros e use o
# formul�rio (via POST) que ele mostrar�.
#
# Para usar:
# ----------
# Como este script grava em um arquivo administrativo do linux,
# precisamos rod�-lo com permiss�es de root. 
# Para isso salve o arquivo na sua pasta cgi-bin e execute: 
# chmod 755 alter_pwd.cgi 
# chown root.root alter_pwd.cgi 
# chmod a+s alter_pwd.cgi 
# ####### ###### ###### #######

use CGI qw(param());
use strict;

print "Content-type: text/html\n\n";
print qq!
<html><head>
<title>Alterar par&acirc;metros do usu&aacute;rio</title>
</head><body>
!;

my $in = "";
my $file = "/etc/passwd";

if(param("user") && param("param") && param("value")) {
&troca(param("user"),param("param"),param("value"));
} else {
&form();
}

sub form {
print qq!
<b>Alterar par&acirc;metros do usu&aacute;rio no passwd</b><br><br>
<form action="http://$ENV{'HTTP_HOST'}$ENV{'SCRIPT_NAME'}" method="post" name="altera">
Login:<input name="user" type="text" id="user"><br>
par&acirc;metro<select name="param" id="param">
<option value="uid">uid</option><option value="gid">gid</option>
<option value="name">nome</option><option value="home">home</option>
<option value="shell">shell</option></select><br>
Novo valor:<input name="value" type="text" id="value"><br>
<input type="submit" value="Alterar"></form>
!;
exit;
}

sub troca {
my $usuario = $_[0];
my $par = $_[1];
my $val = $_[2];

print "Modificando par�metro para o usu�rio '$usuario'<br>\n";

my $saida = `grep ^$usuario: $file`;
	if ($saida !~ /[A-Z]/i) {
	print "O usu�rio '$usuario' n�o existe no sistema!<br>\n";
	print "</body></html>";
	exit;
	}

	if($par ne "uid" && $par ne "gid" && $par ne "name" 
		&& $par ne "home" && $par ne "shell") {
	print "O par�metro '$par' n�o foi reconhecido...<br>\n";
	print "</body></html>";
	exit;
	}

open(R,$file);
	while (<R>) {
		if ($_ =~ /^$usuario:/) {
		my @parts = split(/:/,$_);
			if($par eq 'uid')   { $parts[2] = $val; }
			if($par eq 'gid')   { $parts[3] = $val; }
			if($par eq 'name')  { $parts[4] = $val; }
			if($par eq 'home')  { $parts[5] = $val; }
			if($par eq 'shell') { $parts[6] = $val; }
		$in .= join(":",@parts);
		} else {
		$in .= $_;
		}
	}
close(R);

open(W,"> $file");
print W $in;
close(W);

my $test = `grep ^$usuario: $file`;
	if ($test !~ /^$usuario:.*$val.*$/) {
	print "O par�metro '$par' n�o foi modificado, houve um erro...<br>\n";
	} else {
	print "O par�metro '$par' foi modificado para '$val' com sucesso.<br>\n";
	}
	
print "<hr align=left noshade width=400>";
&form();
}

print "</body></html>";
exit;