Re: Using substr with user defined types

Поиск
Список
Период
Сортировка
От darcy@druid.net (D'Arcy J.M. Cain)
Тема Re: Using substr with user defined types
Дата
Msg-id m135Rdt-000AY3C@druid.net
обсуждение исходный текст
Ответ на Re: Using substr with user defined types  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: Using substr with user defined types  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-sql
Thus spake Tom Lane
> darcy@druid.net (D'Arcy J.M. Cain) writes:
> > Any ideas?
> 
> Not with that much info.  Sooner or later you're going to have to
> show us your C code...

Oh, sure.  I was going to submit it to contrib when it was finished and
as I said, the fprintf test I added pretty much assures me that it isn't
in the code but just in case I am wrong, here it is.


/** PostgreSQL type definitions for chkpass* Written by D'Arcy J.M. Cain* darcy@druid.net*
http://www.druid.net/darcy/**$Id$* best viewed with tabs set to 4*/
 

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#include <postgres.h>
#include <utils/palloc.h>

/** This type encrypts it's input unless the first character is a colon.* The output is the encrypted form with a
leadingcolon.  The output* format is designed to allow dump and reload operations to work as* expected without doing
specialtricks.*/
 


/** This is the internal storage format for CHKPASSs.* 15 is all I need but add a little buffer*/

typedef struct chkpass
{char    password[16];
}            chkpass;

/** Various forward declarations:*/

chkpass       *chkpass_in(char *str);
char       *chkpass_out(chkpass * addr);
char       *chkpass_rout(chkpass * addr);

/* Only equal or not equal make sense */
bool        chkpass_eq(chkpass * a1, text * a2);
bool        chkpass_ne(chkpass * a1, text * a2);

/* This function checks that the password is a good one* It's just a placeholder for now */
static int
verify_pass(const char *str)
{return 0;
}

/** CHKPASS reader.*/
chkpass *
chkpass_in(char *str)
{chkpass       *result;char        mysalt[4];static bool    random_initialized = false;static char salt_chars[] =
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
/* special case to let us enter encrypted passwords */if (*str == ':'){    result = (chkpass *)
palloc(sizeof(chkpass));   strncpy(result->password, str + 1, 13);    result->password[13] = 0;    return (result);}
 
if (verify_pass(str) != 0){    elog(ERROR, "chkpass_in: purported CHKPASS \"%s\" is a weak password",         str);
returnNULL;}
 
result = (chkpass *) palloc(sizeof(chkpass));
if (!random_initialized){    srandom((unsigned int) time(NULL));    random_initialized = true;}
mysalt[0] = salt_chars[random() & 0x3f];mysalt[1] = salt_chars[random() & 0x3f];mysalt[2] = 0;                /*
technicallythe terminator is not                             * necessary but I like to play safe
*/strcpy(result->password,crypt(str, mysalt));return (result);
 
}

/** CHKPASS output function.* Just like any string but we know it is max 15 (13 plus colon and terminator.)*/

char *
chkpass_out(chkpass * password)
{char       *result;
if (password == NULL)    return (NULL);
if ((result = (char *) palloc(16)) != NULL){    result[0] = ':';    strcpy(result + 1, password->password);}
return (result);
}


/** special output function that doesn't output the colon*/

char *
chkpass_rout(chkpass *password)
{char       *result;
if (password == NULL)    return (NULL);
if ((result = (char *) palloc(16)) != NULL)    strcpy(result, password->password);
return (result);
}


/** Boolean tests*/

bool
chkpass_eq(chkpass * a1, text *a2)
{char    str[10];int        sz = 8;
if (a2->vl_len < 8) sz = a2->vl_len;if (!a1 || !a2) return 0;strncpy(str, a2->vl_dat, sz);str[sz] = 0;return
(strcmp(a1->password,crypt(str, a1->password)) == 0);
 
}

bool
chkpass_ne(chkpass * a1, text *a2)
{char    str[10];int        sz = 8;
if (!a1 || !a2) return 0;if (a2->vl_len < 8) sz = a2->vl_len;strncpy(str, a2->vl_dat, sz);str[sz] = 0;return
(strcmp(a1->password,crypt(str, a1->password)) != 0);
 
}


-- 
D'Arcy J.M. Cain <darcy@{druid|vex}.net>   |  Democracy is three wolves
http://www.druid.net/darcy/                |  and a sheep voting on
+1 416 425 1212     (DoD#0082)    (eNTP)   |  what's for dinner.


В списке pgsql-sql по дате отправления:

Предыдущее
От: "Oliver Elphick"
Дата:
Сообщение: Re: Merging two columns into one
Следующее
От: darcy@druid.net (D'Arcy J.M. Cain)
Дата:
Сообщение: Re: Merging two columns into one