pg_password utility. Cleanup for psql passwords. New datetime contrib stuff for new version. Fix for strutils needing config.h.

This commit is contained in:
Bruce Momjian 1997-08-25 19:41:52 +00:00
parent 8d0e658d06
commit f8fda03d12
8 changed files with 195 additions and 161 deletions

69
README
View File

@ -1,3 +1,72 @@
The pathces and a prototype tool to manipulate the ``flat password file
'' functionality of PostgreSQL6.1
1. File
Makefile
pg_passwd.c the source file of the tool.
2. How to specify pasword files and their format.
Specify the password file in the same style of Ident authentication in
$PGDATA/pg_hba.conf
host unv 133.65.96.250 255.255.255.255 password passwd
The above line allows access from 133.65.96.250 using the passwords listed
in $PGDATA/passwd.
The format of the password files follows those of /etc/passwd and
/etc/shadow: the first field is the user name, and the second field
is the encrypted password. The rest is completely ignored. Thus
the following three sample lines specify the same user and password pair:.
pg_guest:/nB7.w5Auq.BY:10031::::::
pg_guest:/nB7.w5Auq.BY:93001:930::/home/guest:/bin/tcsh
pg_guest:/nB7.w5Auq.BY:93001
Note that the original src/backend/libpq/password.c has a bug, which
disallows the first and the second format. If you want to use these
formats, please make sure you've applied the patch accompanied with
this tool.
3. Usage of pg_passwd
Supply the password file to the pg_passwd command. In the case described
above, after ``cd'ing to $PGDATA, the following command execution specify
the new password for pg_guest:
% pg_passwd passwd
Username: pg_guest
Password:
Re-enter password:
where the Password: and Re-enter password: prompts require the same
password input which are not displayed on the terminal.
The original password file is renamed to ``passwd.bk''.
4. How to specify pasasword authentication
You can use the password authentication fro psq, perl, or pg{tcl,tk}sh.
4.1 psql
Use the -u option. Note that the original distribution includes a bug.
Please make sure you've applied the patch distributed with this tool.
The following lines show the sample usage of the option:
% psql -h hyalos -u unv
Username: pg_guest
Password:
Welcome to the POSTGRESQL interactive sql monitor:
Please read the file COPYRIGHT for copyright terms of POSTGRESQL
type \? for help on slash commands
type \q to quit
type \g or terminate with semicolon to execute query
You are currently connected to the database: unv
unv=>
4.2 perl5
Use the new style of the Pg.pm like this
$conn = Pg::connectdb("host=hyalos authtype=password dbname=unv
user=pg_guest password=xxxxxxx");
For more details, the users refer to to ``src/pgsql_perl5/Pg.pm''.
4.3 pg{tcl,tk}sh
Use the pg_connect comamnd with -conninfo option thus
% set conn [pg_connect -conninfo \
"host=hyalos authtype=password dbname=unv \
user=pg_guest password=xxxxxxx "]
Use can list all of the keys for the option by executing the following
command:
% puts [ pg_conndefaults]
5. Acknowledgment
Mr. Ishii, SRA, pointed out the original bugs in the tool. He also
supplied the Makefile for this distribution.
-------------------------------------------------------------------------
July 2, 1997
Yoshihiko Ichikawa, Dept of Info Sci, Fac of Sci, Ochanomizu University
E-mail: ichikawa@is.ocha.ac.jp
PostgreSQL Data Base Management System (formerly known as Postgres, then PostgreSQL Data Base Management System (formerly known as Postgres, then
as Postgres95). as Postgres95).

View File

@ -9,139 +9,90 @@
#include <time.h> #include <time.h>
#include "postgres.h" #include "postgres.h"
#include "pg_type.h"
#include "utils/palloc.h" #include "utils/palloc.h"
#include "utils/datetime.h"
typedef struct DateADT {
char day;
char month;
short year;
} DateADT;
typedef struct TimeADT { TimeADT *time_difference(TimeADT * time1, TimeADT * time2)
short hr;
short min;
float sec;
} TimeADT;
TimeADT *
time_difference(TimeADT *time1, TimeADT *time2)
{ {
TimeADT *time = (TimeADT*)palloc(sizeof(TimeADT)); TimeADT *result = (TimeADT *) palloc(sizeof(TimeADT));
*result = *time1 - *time2;
time->sec = time1->sec - time2->sec;
time->min = time1->min - time2->min;
time->hr = time1->hr - time2->hr;
if (time->sec < 0) {
time->sec += 60.0;
time->min--;
} else if (time->sec >= 60.0) {
time->sec -= 60.0;
time->min++;
}
if (time->min < 0) {
time->min += 60;
time->hr--;
} else if (time->min >= 60) {
time->min -= 60;
time->hr++;
}
if (time->hr < 0) {
time->hr += 24;
} else if (time->hr >= 24) {
time->hr -= 24;
}
return (time);
}
TimeADT *
currentTime()
{
time_t current_time;
struct tm *tm;
TimeADT *result = (TimeADT*)palloc(sizeof(TimeADT));
current_time = time(NULL);
tm = localtime(&current_time);
result->sec = tm->tm_sec;
result->min = tm->tm_min;
result->hr = tm->tm_hour;
return (result); return (result);
} }
int4 TimeADT *currenttime()
currentDate()
{ {
time_t current_time; time_t current_time;
struct tm *tm; struct tm *tm;
int4 result; TimeADT *result = (TimeADT *) palloc(sizeof(TimeADT));
DateADT *date = (DateADT*)&result;
current_time = time(NULL); current_time = time(NULL);
tm = localtime(&current_time); tm = localtime(&current_time);
date->day = tm->tm_mday; *result = ((((tm->tm_hour*60)+tm->tm_min)*60)+tm->tm_sec);
date->month = tm->tm_mon+1;
date->year = tm->tm_year+1900;
return (result); return (result);
} }
DateADT currentdate()
int4
hours(TimeADT *time)
{ {
return (time->hr); time_t current_time;
struct tm *tm;
DateADT result;
current_time = time(NULL);
tm = localtime(&current_time);
result = date2j(tm->tm_year,tm->tm_mon + 1,tm->tm_mday) -
date2j(100,1,1);
return (result);
}
int4 hours(TimeADT * time)
{
return(*time / (60*60));
} }
int4 int4 minutes(TimeADT * time)
minutes(TimeADT *time)
{ {
return (time->min); return(((int) (*time / 60)) % 60);
} }
int4 int4 seconds(TimeADT * time)
seconds(TimeADT *time)
{ {
int seconds = (int)time->sec; return(((int) *time) % 60);
}
int4 day(DateADT *date)
{
struct tm tm;
j2date( (*date + date2j(2000,1,1)),
&tm.tm_year, &tm.tm_mon, &tm.tm_mday);
return (tm.tm_mday);
}
int4 month(DateADT *date)
{
struct tm tm;
j2date( (*date + date2j(2000,1,1)),
&tm.tm_year, &tm.tm_mon, &tm.tm_mday);
return (tm.tm_mon);
}
int4 year(DateADT *date)
{
struct tm tm;
j2date( (*date + date2j(2000,1,1)),
&tm.tm_year, &tm.tm_mon, &tm.tm_mday);
return (tm.tm_year);
}
int4 asminutes(TimeADT * time)
{
int seconds = (int) *time;
return (seconds / 60);
}
int4 asseconds(TimeADT * time)
{
int seconds = (int) *time;
return (seconds); return (seconds);
} }
int4
day(int4 val)
{
DateADT *date = (DateADT*)&val;
return (date->day);
}
int4
month(int4 val)
{
DateADT *date = (DateADT*)&val;
return (date->month);
}
int4
year(int4 val)
{
DateADT *date = (DateADT*)&val;
return (date->year);
}
int4
asMinutes(TimeADT *time)
{
int seconds = (int)time->sec;
return (time->min + 60*time->hr);
}
int4
asSeconds(TimeADT *time)
{
int seconds = (int)time->sec;
return (seconds + 60*time->min + 3600*time->hr);
}

View File

@ -1,25 +1,16 @@
From: Massimo Dal Zotto <dz@cs.unitn.it> Date & time functions for use in Postgres version 6.1 & up
Date: Tue, 14 May 1996 14:31:18 +0200 (MET DST)
Subject: [PG95]: new postgres functions
- -----BEGIN PGP SIGNED MESSAGE----- This functions replaces the original ones from the postgresql.org
because the date & time structures has changed.
Some time ago I read in the mailing list requests of people looking There is a Makefile that should be "ajusted"
for more time and date functions. I have now written some of them: for directories where postgres home after install.
time_difference(time1, time2) ,also defined as operator '-' In this case: /usr/postgres.
hour(time)
minutes(time)
seconds(time)
asMinutes(time)
asSeconds(time)
currentTime()
currentDate()
The file can be compiled as shared library and loaded as dynamic module Hope this can help,
without need to recompile the backend. This can also be taken as an example
of the extensibility of postgres (user-defined functions, operators, etc).
I would be nice to see more of these user contributed modules posted to this Sergio Lenzi (lenzi@bsi.com.br)
list and hopefully accessible from the Postgres home page.

View File

@ -1,69 +1,75 @@
func=$1
-- SQL code to load and define 'datetime' functions cat <<% > datetime_functions.sql
drop function time_difference(time,time);
-- load the new functions drop function currentdate();
drop function currenttime();
load '/home/dz/lib/postgres/datetime_functions.so'; drop function hours(time);
drop function minutes(time);
-- define the new functions in postgres drop function seconds(time);
drop function day(date);
drop function month(date);
drop function year(date);
drop function asminutes(time);
drop function asseconds(time);
drop operator - (time,time);
create function time_difference(time,time) create function time_difference(time,time)
returns time returns time
as '/home/dz/lib/postgres/datetime_functions.so' as '$func'
language 'c'; language 'c';
create function currentDate() create function currentdate()
returns date returns date
as '/home/dz/lib/postgres/datetime_functions.so' as '$func'
language 'c'; language 'c';
create function currentTime() create function currenttime()
returns time returns time
as '/home/dz/lib/postgres/datetime_functions.so' as '$func'
language 'c'; language 'c';
create function hours(time) create function hours(time)
returns int4 returns int4
as '/home/dz/lib/postgres/datetime_functions.so' as '$func'
language 'c'; language 'c';
create function minutes(time) create function minutes(time)
returns int4 returns int4
as '/home/dz/lib/postgres/datetime_functions.so' as '$func'
language 'c'; language 'c';
create function seconds(time) create function seconds(time)
returns int4 returns int4
as '/home/dz/lib/postgres/datetime_functions.so' as '$func'
language 'c'; language 'c';
create function day(date) create function day(date)
returns int4 returns int4
as '/home/dz/lib/postgres/datetime_functions.so' as '$func'
language 'c'; language 'c';
create function month(date) create function month(date)
returns int4 returns int4
as '/home/dz/lib/postgres/datetime_functions.so' as '$func'
language 'c'; language 'c';
create function year(date) create function year(date)
returns int4 returns int4
as '/home/dz/lib/postgres/datetime_functions.so' as '$func'
language 'c'; language 'c';
create function asMinutes(time) create function asminutes(time)
returns int4 returns int4
as '/home/dz/lib/postgres/datetime_functions.so' as '$func'
language 'c'; language 'c';
create function asSeconds(time) create function asseconds(time)
returns int4 returns int4
as '/home/dz/lib/postgres/datetime_functions.so' as '$func'
language 'c'; language 'c';
create operator - ( create operator - (
leftarg=time, leftarg=time,
rightarg=time, rightarg=time,
procedure=time_difference); procedure=time_difference);
%

View File

@ -79,7 +79,8 @@ verify_password(char *user, char *password, Port *port,
} }
/* kill the newline */ /* kill the newline */
test_pw[strlen(test_pw)-1] = '\0'; if (test_pw[strlen(test_pw)-1] == '\n')
test_pw[strlen(test_pw)-1] = '\0';
strNcpy(salt, test_pw, 2); strNcpy(salt, test_pw, 2);

View File

@ -7,7 +7,7 @@
# #
# #
# IDENTIFICATION # IDENTIFICATION
# $Header: /cvsroot/pgsql/src/bin/Makefile,v 1.7 1997/04/26 05:04:21 scrappy Exp $ # $Header: /cvsroot/pgsql/src/bin/Makefile,v 1.8 1997/08/25 19:41:39 momjian Exp $
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -21,6 +21,7 @@
$(MAKE) -C pg_version $@ $(MAKE) -C pg_version $@
$(MAKE) -C psql $@ $(MAKE) -C psql $@
$(MAKE) -C pg_dump $@ $(MAKE) -C pg_dump $@
$(MAKE) -C pg_passwd $@
# #
# Shell scripts # Shell scripts
# #

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.86 1997/08/22 04:13:18 momjian Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.87 1997/08/25 19:41:48 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -1239,8 +1239,8 @@ HandleSlashCmds(PsqlSettings * settings,
} else if (!optarg) { /* show tables, sequences and indices */ } else if (!optarg) { /* show tables, sequences and indices */
tableList(settings, 0, 'b'); tableList(settings, 0, 'b');
} else if (strcmp(optarg, "*") == 0) { /* show everything */ } else if (strcmp(optarg, "*") == 0) { /* show everything */
tableList(settings, 0, 'b'); if (tableList(settings, 0, 'b') == 0)
tableList(settings, 1, 'b'); tableList(settings, 1, 'b');
} else { /* describe the specified table */ } else { /* describe the specified table */
tableDesc(settings, optarg); tableDesc(settings, optarg);
} }
@ -1945,6 +1945,13 @@ static void prompt_for_password(char *username, char *password)
printf("Username: "); printf("Username: ");
fgets(username, 9, stdin); fgets(username, 9, stdin);
length = strlen(username); length = strlen(username);
/* skip rest of the line */
if (length > 0 && username[length-1] != '\n') {
static char buf[512];
do {
fgets(buf, 512, stdin);
} while (buf[strlen(buf)-1] != '\n');
}
if(length > 0 && username[length-1] == '\n') username[length-1] = '\0'; if(length > 0 && username[length-1] == '\n') username[length-1] = '\0';
printf("Password: "); printf("Password: ");
@ -1960,6 +1967,13 @@ static void prompt_for_password(char *username, char *password)
#endif #endif
length = strlen(password); length = strlen(password);
/* skip rest of the line */
if (length > 0 && password[length-1] != '\n') {
static char buf[512];
do {
fgets(buf, 512, stdin);
} while (buf[strlen(buf)-1] != '\n');
}
if(length > 0 && password[length-1] == '\n') password[length-1] = '\0'; if(length > 0 && password[length-1] == '\n') password[length-1] = '\0';
printf("\n\n"); printf("\n\n");

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/bin/psql/stringutils.c,v 1.9 1997/08/19 21:36:56 momjian Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/stringutils.c,v 1.10 1997/08/25 19:41:52 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -16,6 +16,7 @@
#include <ctype.h> #include <ctype.h>
#include <stdlib.h> #include <stdlib.h>
#include "postgres.h"
#ifndef HAVE_STRDUP #ifndef HAVE_STRDUP
#include "strdup.h" #include "strdup.h"
#endif #endif