diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 85e87c7bd24799cf0d99a7a0e640a393ed878959..85f4418c0567947628b2da7abbd9534c7cbd0191 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -21,7 +21,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.55 1997/12/01 22:02:32 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.56 1997/12/04 01:31:27 scrappy Exp $ * * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb * @@ -2138,6 +2138,117 @@ dumpAggs(FILE *fout, AggInfo *agginfo, int numAggs, } } +/* + * These are some support functions to fix the acl problem of pg_dump + * + * Matthew C. Aycock 12/02/97 + */ +/* + * This will return a new string: "s,add" + */ +char *AddAcl(char *s, const char *add) +{ + char *t; + + if (s == (char *)NULL) + return (strdup(add)); + + t=(char *)calloc((strlen(s) + strlen(add)+1),sizeof(char)); + sprintf(t,"%s,%s",s,add); + + return(t); +} +/* + * This will take a string of 'arwR' and return a + * comma delimited string of SELECT,INSERT,UPDATE,DELETE,RULE + */ +char *GetPrivledges(char *s) +{ + char *acls=NULL; + + /*Grant All == arwR */ + /* INSERT == ar */ + /* UPDATE/DELETE == rw */ + /* SELECT == r */ + /* RULE == R */ + + if (strstr(s,"arwR")) + return(strdup("ALL")); + + if (strstr(s,"ar")) + acls=AddAcl(acls,"INSERT"); + + if (strstr(s,"rw")) + acls=AddAcl(acls,"UPDATE,DELETE"); + else + if (strchr(s,'r')) + acls=AddAcl(acls,"SELECT"); + + if (strchr(s,'R')) + acls=AddAcl(acls,"RULES"); + + return(acls); +} +/* This will parse the acl string of TableInfo + * into a two deminsional aray: + * user | Privledges + * So to reset the acls I need to grant these priviledges + * to user + */ +ACL *ParseACL(const char *acls,int *count) +{ + ACL *ParsedAcl=NULL; + int i, + len, + NumAcls=1, /*There is always public*/ + AclLen=0; + char *s=NULL, + *user=NULL, + *priv=NULL, + *tok; + + AclLen=strlen(acls); + + if (AclLen == 0) { + *count=0; + return (ACL *) NULL; + } + + for (i=0;i<AclLen;i++) + if (acls[i] == ',') + NumAcls++; + + ParsedAcl=(ACL *)calloc(AclLen,sizeof(ACL)); + if (!ParsedAcl) { + fprintf(stderr,"Could not allocate space for ACLS!\n"); + return (ACL *)NULL; + } + + s=strdup(acls); + + /* Setup up public*/ + ParsedAcl[0].user=strdup("Public"); + tok=strtok(s,","); + ParsedAcl[0].privledges=GetPrivledges(strchr(tok,'=')); + + /*Do the rest of the users*/ + i=1; + while ((i < NumAcls) && ((tok=strtok(NULL,",")) != (char *)NULL)) { + /*User name is string up to = in tok*/ + len=strchr(tok,'=') - tok -1 ; + user=(char*)calloc(len+1,sizeof(char)); + strncpy(user,tok+1,len); + if (user[len-1] == '\"') + user[len-1]=(char)NULL; + priv=GetPrivledges(tok+len+2); + ParsedAcl[i].user=user; + ParsedAcl[i].privledges=priv; + i++; + } + + *count=NumAcls; + return (ParsedAcl); +} /* * dumpTables: * write out to fout all the user-define tables @@ -2151,11 +2262,13 @@ dumpTables(FILE *fout, TableInfo *tblinfo, int numTables, { int i, j, - k; + k, + l; char q[MAXQUERYLEN]; char **parentRels; /* list of names of parent relations */ int numParents; int actual_atts; /* number of attrs in this CREATE statment */ + ACL *ACLlist; /* First - dump SEQUENCEs */ for (i = 0; i < numTables; i++) @@ -2267,10 +2380,15 @@ dumpTables(FILE *fout, TableInfo *tblinfo, int numTables, strcat(q, ";\n"); fputs(q, fout); - if (acls) - fprintf(fout, - "UPDATE pg_class SET relacl='%s' where relname='%s';\n", - tblinfo[i].relacl, tblinfo[i].relname); + if (acls) { + ACLlist = ParseACL(tblinfo[i].relacl, &l); + for(k = 0; k < l; k++) { + fprintf(fout, + "GRANT %s on %s to %s;\n", + ACLlist[k].privledges, tblinfo[i].relname, + ACLlist[k].user); + } + } } } } diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 7d42eb0388fcd23a13fc3b105dc530d33e98560a..2e687105447891e5c96937c2642406e10fa6c1b6 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -5,7 +5,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: pg_dump.h,v 1.27 1997/11/21 18:11:41 momjian Exp $ + * $Id: pg_dump.h,v 1.28 1997/12/04 01:31:28 scrappy Exp $ * * Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2 * @@ -151,6 +151,16 @@ typedef struct _oprInfo char *usename; } OprInfo; +/* + * This is some support functions to fix the acl problem of pg_dump + * + * Matthew C. Aycock 12/02/97 + */ +typedef struct _AclType { + char *user; + char *privledges; +} ACL; + /* global decls */ extern bool g_verbose; /* verbose flag */