#! /usr/bin/perl -w

{

$DBNAME="iddb";
$DBHOST="localhost";
$DBUSER="iddb";
$DBPASS="wreckless";
$DBPORT="5432";
$CONN="";

use Pg;

sub main () {
    my $arglen = $#ARGV;
    if( $arglen != 1 ) {
        print_useage();
        exit( 1 );
    }
    my( $op, $username ) = @ARGV;
    if( valid_user( $username ) ) {
        connect_db();
        if( $op eq "setpass" ) {
            my $pass = <STDIN>;
            chomp $pass;
            if( valid_pass( $pass ) ) {
                create_or_update_password( $username, $pass );
            }
        } elsif( $op eq "show_crypt_md5" ) {
            show_crypt_md5( $username );
        } elsif( $op eq "show_all" ) {
            show_all( $username );
        } elsif( $op eq "show_history" ) {
            show_history( $username );
        }
    } else {
        print STDERR "Error: invalid username: \'$username\'\n";
        exit( 1 );
    }
}

sub print_useage () {
    print << "EOTEXT";

Useage: $0 <op> <username>

op: setpass | show_crypt_md5 | show_all | show_history

If op is 'setpass', then $0 expects the password to be
found on STDIN, e.g.

echo -n "badpass" | $0 setpass wilecoyo

EOTEXT
}

sub valid_user ($) {
    my( $username ) = @_;
    return 1 if $username =~ /^[_a-z]{1}[-_a-z0-9]{0,7}$/;
    return 0;
}

sub valid_pass ($) {
    my( $pass ) = @_;
    return 1;
}

sub connect_db () {
    $CONN = Pg::connectdb("dbname=$DBNAME
                           host=$DBHOST
                           user=$DBUSER
                           password=$DBPASS
                           port=$DBPORT");
    if( $CONN->status eq PGRES_CONNECTION_OK ) {
        print STDERR sprintf( 'Connected to PostgreSQL database \'%s\'... ',
                              $DBNAME );
    } else {
        print STDERR sprintf( 'Connection to PostgreSQL database \'%s\' failed: %s',
                              $DBNAME,
                              $CONN->errorMessage ), "\n";
    }

    my $sqlstr = <<EOSQL;
SET
  search_path
TO
  iddb, pgcrypto;
EOSQL

    my $result = $CONN->exec( $sqlstr );
    my $status = $result->resultStatus;
    my $oid = $result->cmdTuples;

    if( $CONN->errorMessage &&
        ! ( $oid eq "" || $status eq PGRES_COMMAND_OK ) ) {
        print STDERR sprintf( 'SQL exec failed: %s',
                              $CONN->errorMessage ), "\n";
    }
}

sub create_or_update_password ($$) {
    my( $username, $password ) = @_;

    my $sqlstr = <<EOSQL;
INSERT INTO
    id_insert
VALUES
    ( \'$username\', \'$password\' );
EOSQL

    my $result = $CONN->exec( $sqlstr );
    my $status = $result->resultStatus;
    my $oid = $result->cmdTuples;

    if( $CONN->errorMessage &&
        ! ( $oid eq "" || $status eq PGRES_COMMAND_OK ) ) {
        print STDERR sprintf( 'SQL exec failed: %s',
                              $CONN->errorMessage ), "\n";
    } else {
        print STDERR "success\n";
    }
}

sub show_crypt_md5 ($) {
    my( $username ) = @_;

    my $sqlstr = <<EOSQL;
SELECT
    crypt_md5
FROM
    id
WHERE
    username = \'$username\';
EOSQL

    my $result = $CONN->exec( $sqlstr );
    my $status = $result->resultStatus;
    my $oid = $result->cmdTuples;

    if( $CONN->errorMessage &&
        ! ( $oid eq "" || $status eq PGRES_COMMAND_OK ) ) {
        print STDERR sprintf( 'SQL exec failed: %s',
                              $CONN->errorMessage ), "\n";
        exit 1;
    }

    my $ntuples = $result->ntuples;
    if( $ntuples != 1 ) {
        print STDERR "Error: invalid result\n";
    }

    $result->print( STDOUT, 0, 0, 0, 0, 0, 0, ",", "", "" );
}

sub show_all ($) {
    my( $username ) = @_;

    my $sqlstr = <<EOSQL;
SELECT
    created, crypt_des, crypt_xdes, crypt_md5, crypt_bf, pass_md5, pass_sha1
FROM
    id
WHERE
    username = \'$username\';
EOSQL

    my $result = $CONN->exec( $sqlstr );
    my $status = $result->resultStatus;
    my $oid = $result->cmdTuples;

    if( $CONN->errorMessage &&
        ! ( $oid eq "" || $status eq PGRES_COMMAND_OK ) ) {
        print STDERR sprintf( 'SQL exec failed: %s',
                              $CONN->errorMessage ), "\n";
        exit 1;
    }

    my $ntuples = $result->ntuples;
    if( $ntuples != 1 ) {
        print STDERR "Error: invalid result\n";
    }

    $result->print( STDOUT, 0, 0, 0, 0, 1, 0, ": ", "", "" );
}

sub show_history ($) {
    my( $username ) = @_;

    my $sqlstr = <<EOSQL;
SELECT
    created, crypt_des, crypt_xdes, crypt_md5, crypt_bf, pass_md5, pass_sha1
FROM
    id_log
WHERE
    username = \'$username\';
EOSQL

    my $result = $CONN->exec( $sqlstr );
    my $status = $result->resultStatus;
    my $oid = $result->cmdTuples;

    if( $CONN->errorMessage &&
        ! ( $oid eq "" || $status eq PGRES_COMMAND_OK ) ) {
        print STDERR sprintf( 'SQL exec failed: %s',
                              $CONN->errorMessage ), "\n";
        exit 1;
    }

    $result->print( STDOUT, 0, 0, 0, 0, 1, 0, ": ", "", "" );
}

main();

}

