X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=db_pgsql.c;h=321133c2f328d4a787b5eae100b3342bc382e98e;hb=1a8e72c666b575c73e4d593d12631c4cc115aac9;hp=22725fe333e709debdbc77ecf82a612b836a8368;hpb=a4d53c2fe3dc1952c7c7d8a4283545389ba5aa64;p=tac_plus.git diff --git a/db_pgsql.c b/db_pgsql.c index 22725fe..321133c 100644 --- a/db_pgsql.c +++ b/db_pgsql.c @@ -1,218 +1,222 @@ -#if defined(DB_PGSQL) && defined(DB) - /* Writen by Devrim SERAL(devrim@tef.gazi.edu.tr) For PostgreSQL Authentication And Accounting 28-01-2001 -This program protected with GPL License. +This program protected with GPL License. */ + #include "tac_plus.h" + +#if defined(DB_PGSQL) && defined(DB) + #include -#include "libpq-fe.h" +#include +#include +#include + +#include "db_pgsql.h" +#include "main.h" +#include "report.h" +#include "utils.h" +#include "pwlib.h" + + +static void exit_nicely TAC_ARGS((PGconn *cn, PGresult *r)); + + #define SQLCMDL 1024 #define PWLEN 13 #define AUTHSQL "SELECT %s FROM %s WHERE %s='%s'" -#define ACCTSQL "INSERT INTO %s (usern,s_name,c_name,elapsed_time,bytes_in,bytes_out,fin_t) VALUES ('%s','%s','%s',%s,%s,%s,NOW())" +#define ACCTSQL "INSERT INTO %s (usern,s_name,c_name,elapsed_time,bytes_in,bytes_out,fin_t) VALUES ('%s','%s','%s',%s,%s,%s,NOW())" -PGconn *conn; -PGresult *res; - -int pgsql_db_verify(user, users_passwd, db_user, db_password, - db_hostname,db_name, db_table, dbfield_name, dbfield_passwd) +static PGconn *conn; +static PGresult *res; -char *user, *users_passwd; /* Username and gived password */ -char *db_user; /* db's parameters */ -char *db_password; -char *db_hostname; -char *db_name; -char *db_table; -char *dbfield_name; -char *dbfield_passwd; +int pgsql_db_verify TAC_ARGS((const char *user, const char *users_passwd, const char *db_user, const char *db_password, const char *db_hostname, const char *db_name, const char *db_table, const char *dbfield_name, const char *dbfield_passwd)); +int pgsql_db_verify(user, users_passwd, db_user, db_password, + db_hostname, db_name, db_table, dbfield_name, dbfield_passwd) +const char *user; /* username ... */ +const char *users_passwd; /* ... and given password */ +const char *db_user; /* db's parameters */ +const char *db_password; +const char *db_hostname; +const char *db_name; +const char *db_table; +const char *dbfield_name; +const char *dbfield_passwd; { + char *real_passwd; + char *pgsqlcmd; + int sql_len; + int nrow; -char *real_passwd; -char *pgsqlcmd; -int sql_len; -int nrow; + if (debug & DEBUG_AUTHEN_FLAG) + report(LOG_DEBUG, "PGSQL: verify %s", user); -if (debug & DEBUG_AUTHEN_FLAG) - report(LOG_DEBUG, "PGSQL: verify %s", user); - -/* Connect database server */ + /* Connect database server */ -conn=PQsetdbLogin(db_hostname,NULL,NULL,NULL,db_name,db_user,db_password); + conn=PQsetdbLogin(db_hostname,NULL,NULL,NULL,db_name,db_user,db_password); -if ( PQstatus(conn) == CONNECTION_BAD ) -{ - if (debug & DEBUG_AUTHEN_FLAG) - report(LOG_DEBUG, "PGSQL: Connection to database %s failed", db_name); + if ( PQstatus(conn) == CONNECTION_BAD ) { + if (debug & DEBUG_AUTHEN_FLAG) + report(LOG_DEBUG, "PGSQL: Connection to database %s failed", db_name); return(0); -} + } -/* Check select string length */ + /* Check select string length */ -sql_len=strlen(dbfield_passwd)+strlen(dbfield_name)+strlen(db_table)+strlen(user)+strlen(AUTHSQL); + sql_len=strlen(dbfield_passwd)+strlen(dbfield_name)+strlen(db_table)+strlen(user)+strlen(AUTHSQL); -if ( sql_len> SQLCMDL ) -{ - if (debug & DEBUG_AUTHEN_FLAG) - report(LOG_DEBUG, "PGSQL: Sql cmd exceed alowed limits"); - return(0); -} + if ( sql_len> SQLCMDL ) { + if (debug & DEBUG_AUTHEN_FLAG) + report(LOG_DEBUG, "PGSQL: Sql cmd exceed alowed limits"); + return(0); + } -/* Prepare select string */ + /* Prepare select string */ -pgsqlcmd=(char *) malloc(sql_len); + pgsqlcmd=(char *) tac_malloc(sql_len); -if(pgsqlcmd==NULL) -{ - if (debug & DEBUG_AUTHEN_FLAG) - report(LOG_ERR, "pgsql_db_verify: pgsqlcmd malloc error"); + sprintf(pgsqlcmd,AUTHSQL,dbfield_passwd,db_table,dbfield_name,user); + + /* Query database */ + res=PQexec(conn,pgsqlcmd); + + if (!res || PQresultStatus(res) != PGRES_TUPLES_OK) { + if (debug & DEBUG_AUTHEN_FLAG) { + report(LOG_DEBUG, "PGSQL: cannot query database "); + report(LOG_DEBUG, "PGSQL: Error message->%s", PQerrorMessage(conn) ); + } + free(pgsqlcmd); + exit_nicely(conn,res); return(0); -} + } -sprintf(pgsqlcmd,AUTHSQL,dbfield_passwd,db_table,dbfield_name,user); + free(pgsqlcmd); -/* Query database */ -res=PQexec(conn,pgsqlcmd); + if ( (nrow=PQntuples(res)) !=1 ) { + if (debug & DEBUG_AUTHEN_FLAG) + report(LOG_DEBUG, "PGSQL: Have we got more than one password!!"); + exit_nicely(conn,res); + return(0); + } -if (!res || PQresultStatus(res) != PGRES_TUPLES_OK) -{ - if (debug & DEBUG_AUTHEN_FLAG) { - report(LOG_DEBUG, "PGSQL: cannot query database "); - report(LOG_DEBUG, "PGSQL: Error message->%s", PQerrorMessage(conn) ); - } - free(pgsqlcmd); - exit_nicely(conn,res); + if ( PQgetisnull(res,0,PQfnumber(res,dbfield_passwd)) ) { + if (debug & DEBUG_AUTHEN_FLAG) + report(LOG_DEBUG, "PGSQL: DB passwd entry is NULL"); + exit_nicely(conn,res); return(0); -} + } -free(pgsqlcmd); + /* Allocate memory for real_passwd */ + real_passwd=(char *) tac_malloc(PWLEN+1); + strncpy(real_passwd,PQgetvalue(res,0,PQfnumber(res,dbfield_passwd)),PWLEN); + real_passwd[PWLEN]='\0'; + + exit_nicely(conn,res); -if( nrow=PQntuples(res)!=1) -{ - if (debug & DEBUG_AUTHEN_FLAG) - report(LOG_DEBUG, "PGSQL: Have we got more than one password!!"); - exit_nicely(conn,res); - return(0); -} - -if ( PQgetisnull(res,0,PQfnumber(res,dbfield_passwd)) ) -{ if (debug & DEBUG_AUTHEN_FLAG) - report(LOG_DEBUG, "PGSQL: DB passwd entry is NULL"); - exit_nicely(conn,res); - return(0); -} + report(LOG_DEBUG, "PGSQL: verify password '%s' to DES encrypted string '%s'", users_passwd, real_passwd); - /* Allocate memory for real_passwd */ - real_passwd=(char *) malloc(PWLEN+1); - strncpy(real_passwd,PQgetvalue(res,0,PQfnumber(res,dbfield_passwd)),PWLEN); - real_passwd[PWLEN]='\0'; - -exit_nicely(conn,res); - -if (debug & DEBUG_AUTHEN_FLAG) - report(LOG_DEBUG, "PGSQL: verify password '%s' to DES encrypted string '%s'", users_passwd, real_passwd); - - /* Try to verify the password */ - if (!des_verify(users_passwd, real_passwd)) - { - return (0); - } + /* Try to verify the password */ + if (!des_verify(users_passwd, real_passwd)) + return (0); return (1); /* Return 1 if verified, 0 otherwise. */ } -/* PGSQL ACCOUNTING function */ - -int pgsql_db_acct(db_user,db_password,db_hostname,db_name,db_table,s_name,c_name,a_username,elapsed_time,bytes_in,bytes_out) +/* PGSQL ACCOUNTING function */ -char *db_user; /* db's parameters */ -char *db_password; -char *db_hostname; -char *db_name; -char *db_table; -char *s_name, *c_name,*a_username,*elapsed_time,*bytes_in,*bytes_out; +int pgsql_db_acct TAC_ARGS((const char *db_user, const char *db_password, const char *db_hostname, const char *db_name, const char *db_table, const char *s_name, const char *c_name, const char *a_username, const char *elapsed_time, const char *bytes_in, const char *bytes_out)); +int pgsql_db_acct(db_user,db_password,db_hostname,db_name,db_table,s_name,c_name,a_username,elapsed_time,bytes_in,bytes_out) +const char *db_user; /* db's parameters */ +const char *db_password; +const char *db_hostname; +const char *db_name; +const char *db_table; +const char *s_name; +const char *c_name; +const char *a_username; +const char *elapsed_time; +const char *bytes_in; +const char *bytes_out; { + char *pgsqlcmd; + int sql_len; -char *pgsqlcmd; -int sql_len; - - if (debug & DEBUG_ACCT_FLAG) + if (debug & DEBUG_ACCT_FLAG) report(LOG_DEBUG, "PGSQL: Accounting for %s begin", a_username); - -/* Connect database server */ -conn=PQsetdbLogin(db_hostname,NULL,NULL,NULL,db_name,db_user,db_password); + /* Connect database server */ -if ( PQstatus(conn) == CONNECTION_BAD ) -{ - if (debug & DEBUG_ACCT_FLAG) { - report(LOG_DEBUG, "PGSQL: Connection to database %s failed", db_name); - report(LOG_DEBUG, "PGSQL: Error message->%s", PQerrorMessage(conn) ); - } + conn=PQsetdbLogin(db_hostname,NULL,NULL,NULL,db_name,db_user,db_password); + + if ( PQstatus(conn) == CONNECTION_BAD ) { + if (debug & DEBUG_ACCT_FLAG) { + report(LOG_DEBUG, "PGSQL: Connection to database %s failed", db_name); + report(LOG_DEBUG, "PGSQL: Error message->%s", PQerrorMessage(conn) ); + } return(0); -} + } -/* Check select string length */ + /* Check select string length */ -sql_len=strlen(db_table)+strlen(a_username)+strlen(s_name)+strlen(c_name)+strlen(elapsed_time)+strlen(bytes_in)+strlen(bytes_out)+strlen(ACCTSQL); + sql_len=strlen(db_table)+strlen(a_username)+strlen(s_name)+strlen(c_name)+strlen(elapsed_time)+strlen(bytes_in)+strlen(bytes_out)+strlen(ACCTSQL); -if ( sql_len> SQLCMDL ) -{ - if (debug & DEBUG_ACCT_FLAG) - report(LOG_DEBUG, "PGSQL: Sql cmd exceed alowed limits"); - return(0); -} + if ( sql_len> SQLCMDL ) { + if (debug & DEBUG_ACCT_FLAG) + report(LOG_DEBUG, "PGSQL: Sql cmd exceed alowed limits"); + return(0); + } -/* Prepare select string */ + /* Prepare select string */ -pgsqlcmd=(char *) malloc(sql_len); + pgsqlcmd=(char *) tac_malloc(sql_len); -if(pgsqlcmd==NULL) -{ -if (debug & DEBUG_ACCT_FLAG) - report(LOG_ERR, "pgsql_db_verify: pgsqlcmd malloc error"); - return(0); -} + sprintf(pgsqlcmd,ACCTSQL,db_table,a_username,s_name,c_name,elapsed_time,bytes_in,bytes_out); -sprintf(pgsqlcmd,ACCTSQL,db_table,a_username,s_name,c_name,elapsed_time,bytes_in,bytes_out); - -/* Query database */ -res=PQexec(conn,pgsqlcmd); + /* Query database */ + res=PQexec(conn,pgsqlcmd); -if (!res || PQresultStatus(res) != PGRES_COMMAND_OK ) -{ - if (debug & DEBUG_ACCT_FLAG) { - report(LOG_DEBUG, "PGSQL: cannot establish database query"); - report(LOG_DEBUG, "PGSQL: Error message->%s", PQerrorMessage(conn) ); -} + if (!res || PQresultStatus(res) != PGRES_COMMAND_OK ) { + if (debug & DEBUG_ACCT_FLAG) { + report(LOG_DEBUG, "PGSQL: cannot establish database query"); + report(LOG_DEBUG, "PGSQL: Error message->%s", PQerrorMessage(conn) ); + } free(pgsqlcmd); exit_nicely(conn,res); return(0); -} + } -free(pgsqlcmd); - -/* Flush all result and close connection */ -exit_nicely(conn,res); + free(pgsqlcmd); + + /* Flush all result and close connection */ + exit_nicely(conn,res); if (debug & DEBUG_ACCT_FLAG) report(LOG_DEBUG, "PGSQL: Accounting for %s finished", a_username); - + return (1); /* Return 1 if verified, 0 otherwise. */ } -int -exit_nicely(PGconn *cn,PGresult *r) + +static void exit_nicely TAC_ARGS((PGconn *cn, PGresult *r)); + +static void +exit_nicely(cn, r) +PGconn *cn; +PGresult *r; { PQclear(r); PQfinish(cn); } -#endif +#else /* defined(DB_PGSQL) && defined(DB) */ + +TAC_SOURCEFILE_EMPTY + +#endif /* defined(DB_PGSQL) && defined(DB) */