Como já havia comentado, não sou programador em C, então estejam livres para fazerem as mudanças que acharem necessárias na aplicação para que ela se torne mais robusta ;)
Abaixo segue o seu código fonte, como compilar e como usar.
#include <stdio.h>
#include <netdb.h>
//define o tamanho máximo para os parâmetros enviados
#define BUFPARAMETRO 250
//define o tamanho máximo para os texto de retorno, se o tamanho do retorno for superior ele trunca o texto
#define BUFRETORNO 2500
#include <string.h>
/*desenvolvido por FBA - Fábio Adriél Beckert
copiado e alterado de acordo com as necessidades
do smb_auth.c que vem junto com o Squid
para compilar digitar no shell
gcc -o http_auth http_auth.c
para usar
echo "usuário senha" | http_auth "Host do servidor" "Porta do servidor" "Arquivo no servidor" "Nome do parâmetro usuário" "Nome do parâmetro da senha" "Parte do texto do retorno do servidor se o usuário for valido" "nodebug"
configurar no squid.conf para que ele use o http_auth
enviar como parâmetro o nome do usuário e a senha
*/
int
main(int argc, char *argv[])
{
char *s;
char *user;
char *pass;
char buf[BUFPARAMETRO];
char buft[BUFRETORNO];
char bufl[100];
int i;
char url [BUFPARAMETRO];
int fd;
struct sockaddr_in addr;
struct hostent *hostPtr;
if (setvbuf(stdout, NULL, _IOLBF, 0) != 0)
return 1;
while (1) {
if (fgets(buf, BUFPARAMETRO, stdin) == NULL)
break;
if ((s = strchr(buf, '\n')) == NULL)
continue;
*s = '{TEXTO}';
if ((s = strchr(buf, ' ')) == NULL) {
(void) printf("ERR\n");
continue;
}
*s = '{TEXTO}';
user = buf;
pass = s + 1;
//se o host não for encontrado retorna erro
if ((hostPtr = gethostbyname(argv[1])) == 0)
(void) printf("ERR\n");
// estabelece a conexão
bzero((void *) &addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = ((struct in_addr *)(hostPtr->h_addr))->s_addr;
addr.sin_port = htons((short) atoi(argv[2]));
if((fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
(void) printf("ERR\n");
if( connect(fd,(struct sockaddr *)&addr,sizeof (addr)) < 0)
(void) printf("ERR\n");
// envia GET para o servidor web
url[0] = '{TEXTO}';
strcat(url,"GET ");
strcat(url,argv[3]);
strcat(url,"?");
strcat(url,argv[4]);
strcat(url,"=");
strcat(url,user);
strcat(url,"&");
strcat(url,argv[5]);
strcat(url,"=");
strcat(url,pass);
strcat(url," HTTP/1.0\r\n\r\n");
write(fd,url , 1 + strlen(url));
//lê o conteúdo de retorno
buft[0] = '{TEXTO}';
do{
i = read(fd,bufl,100);
bufl[i] = '{TEXTO}';
//se o tamanho do texto de retorno estourar o tamanho do buf trunca o retorno
if(strlen(buft)+strlen(bufl) > BUFRETORNO ){break;}
strcat(buft,bufl);
}while (i > 0);
//verifica se existe o texto de validação no conteúdo de retorno
if(strstr(buft,argv[6]) != NULL){
(void) printf("OK\n");
}
else
(void) printf("ERR\n");
if(strstr("debug",argv[7]) != NULL) {
char separador[] = "--------------------------------------------------------------------------------\n";
(void) printf("%s[TEXTO ENVIADO PARA O SERVIDOR]\n%s\n%s[TEXTO RECEBIDO DO SERVIDOR]\n%s\n%s",separador,url,separador,buft,separador);
}
//zera as variáveis para a próxima requisição
close(fd);
buf[0] = '{TEXTO}';
}
return 0;
}
Copie o fonte da aplicação para um editor de texto, salve em qualquer diretório com o nome http_auth.c, depois em modo texto digite no diretório onde o arquivo fonte se encontra:
$ gcc -o http_auth http_auth.c
Se tudo ocorrer de forma correta, um arquivo binário com nome http_auth será gerado no diretório em questão.
Para testar:
echo "usuário senha" | http_auth "Host do servidor" "Porta do servidor" "Arquivo no servidor" "Nome do parâmetro usuário" "Nome do parâmetro da senha" "Parte do texto do retorno do servidor se o usuário for valido" "nodebug"
Exemplo:
$ echo "eu minhasenha" | http_auth "localhost" "80" "/login.php" "User" "Passwd" "logado123" "nodebug"
No exemplo a resposta do servidor deve conter em alguma parte do texto o termo "logado123", caso o login tenha sido efetuado com sucesso, altere o parâmetro "nodebug" para "debug" para saber o que está sendo enviado e o que está sendo recebido pela aplicação.