On Wed, Sep 2, 2015 at 1:19 PM, Stefan Kaltenbrunner <
ste...@kaltenbrunner.cc> wrote:

> On 09/02/2015 10:10 PM, dinesh kumar wrote:
> > On Tue, Sep 1, 2015 at 10:58 PM, Stefan Kaltenbrunner
> > <ste...@kaltenbrunner.cc <mailto:ste...@kaltenbrunner.cc>> wrote:
> >
> >     On 07/25/2015 03:38 AM, dinesh kumar wrote:
> >     >
> >     >
> >     > On Fri, Jul 24, 2015 at 10:22 AM, Robert Haas <
> robertmh...@gmail.com <mailto:robertmh...@gmail.com>
> >     > <mailto:robertmh...@gmail.com <mailto:robertmh...@gmail.com>>>
> wrote:
> >     >
> >     >     On Thu, Jul 23, 2015 at 8:15 PM, dinesh kumar
> >     >     <dineshkuma...@gmail.com <mailto:dineshkuma...@gmail.com>
> >     <mailto:dineshkuma...@gmail.com <mailto:dineshkuma...@gmail.com>>>
> >     wrote:
> >     >     > On Thu, Jul 23, 2015 at 9:21 AM, Robert Haas
> >     >     <robertmh...@gmail.com <mailto:robertmh...@gmail.com>
> >     <mailto:robertmh...@gmail.com <mailto:robertmh...@gmail.com>>>
> wrote:
> >     >     >>
> >     >     >> On Thu, Jul 23, 2015 at 12:19 PM, dinesh kumar
> >     >     <dineshkuma...@gmail.com <mailto:dineshkuma...@gmail.com>
> >     <mailto:dineshkuma...@gmail.com <mailto:dineshkuma...@gmail.com>>>
> >     >     >> wrote:
> >     >     >> > Sorry for my  unclear description about the proposal.
> >     >     >> >
> >     >     >> > "WITH PERMISSIVE" is equal to our existing behavior. That
> >     is, chmod=644
> >     >     >> > on
> >     >     >> > the created files.
> >     >     >> >
> >     >     >> > If User don't specify "PERMISSIVE" as an option, then the
> >     chmod=600 on
> >     >     >> > created files. In this way, we can restrict the other
> >     users from reading
> >     >     >> > these files.
> >     >     >>
> >     >     >> There might be some benefit in allowing the user to choose
> the
> >     >     >> permissions, but (1) I doubt we want to change the default
> >     behavior
> >     >     >> and (2) providing only two options doesn't seem flexible
> >     enough.
> >     >     >>
> >     >     >
> >     >     > Thanks for your inputs Robert.
> >     >     >
> >     >     > 1) IMO, we will keep the exiting behavior as it is.
> >     >     >
> >     >     > 2) As the actual proposal talks about the permissions of
> >     group/others. So,
> >     >     > we can add few options as below to the WITH clause
> >     >     >
> >     >     > COPY
> >     >     > ..
> >     >     > ..
> >     >     > WITH
> >     >     > [
> >     >     > NO
> >     >     > (READ,WRITE)
> >     >     > PERMISSION TO
> >     >     > (GROUP,OTHERS)
> >     >     > ]
> >     >
> >     >     If we're going to do anything here, it should use COPY's
> >     >     extensible-options syntax, I think.
> >     >
> >     >
> >     > Thanks Robert. Let me send a patch for this.
> >
> >
> >     how are you going to handle windows or unix ACLs here?
> >     Its permission model is quite different and more powerful than
> (non-acl
> >     based) unix in general, handling this in a flexible way might soon
> get
> >     very complicated and complex for limited gain...
> >
> >
> > Hi Stefan,
> >
> > I had the same questions too. But, I believe, our initdb works in these
> > cases, after creating the data cluster. Isn't ?
>
> maybe - but having a fixed "default"  is very different from baking a
> classic unix permission concept of user/group/world^others into actual
> DDL or into a COPY option. The proposed syntax might make some sense to
> a admin used to a unix style system but it is likely utterly
> incomprehensible to somebody who is used to (windows style) ACLs.
>
> I dont have a good answer on what to do else atm but I dont think we
> should embedded traditional/historical unix permission models in our
> grammer unless really really needed..
>

Yes, I agree with you. We shouldn't embed the unix style access model into
COPY.

COPY's default behaviour umask 644 on output files, which is giving read
access to other users.
I see, there is a good reason behind it. Also, it would be good to have a
control on the READ ACCESS of a file, where we can secure our dump files,
from the non instance ownership users.

Adding a trivial patch to control this read ACL.

--Sample Test Case

--Default behaviour
postgres=# COPY test_table TO '/tmp/readacs.txt';
COPY 1000

$ ls -l /tmp/readacs.txt
-rw-r--r--  /tmp/test1.txt

--With applied patch
postgres=# COPY test_table TO '/tmp/noreadacs.txt' NO READ ACCESS;
COPY 1000

$ ls -l /tmp/noreadacs.txt
-rw------- /tmp/noreadacs.txt

We can also use "PROGRAM 'cat > Output.csv' " to achieve this "NO READ
ACCESS", since the program is always running as a instance owner.

Let me know your inputs and thoughts.

Stefan
>


-- 

Regards,
Dinesh
manojadinesh.blogspot.com
diff --git a/doc/src/sgml/ref/copy.sgml b/doc/src/sgml/ref/copy.sgml
index 2850b47..eb53ddf 100644
--- a/doc/src/sgml/ref/copy.sgml
+++ b/doc/src/sgml/ref/copy.sgml
@@ -44,6 +44,7 @@ COPY { <replaceable 
class="parameter">table_name</replaceable> [ ( <replaceable
     FORCE_NOT_NULL ( <replaceable class="parameter">column_name</replaceable> 
[, ...] )
     FORCE_NULL ( <replaceable class="parameter">column_name</replaceable> [, 
...] )
     ENCODING '<replaceable class="parameter">encoding_name</replaceable>'
+    NO READ ACCESS
 </synopsis>
  </refsynopsisdiv>
 
@@ -356,7 +357,17 @@ COPY { <replaceable 
class="parameter">table_name</replaceable> [ ( <replaceable
      </para>
     </listitem>
    </varlistentry>
-
+   
+   <varlistentry>
+    <term><literal>NO READ ACCESS</></term>
+    <listitem>
+     <para>
+     This specifies, do not give any read access to non instance owner members.
+     If this option is omitted, copy gives read access to all members, which 
is the default behaviour.
+     </para>
+    </listitem>
+   </varlistentry>
+   
   </variablelist>
  </refsect1>
 
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 8db1b35..367d430 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -133,7 +133,7 @@ typedef struct CopyStateData
        bool            convert_selectively;    /* do selective binary 
conversion? */
        List       *convert_select; /* list of column names (can be NIL) */
        bool       *convert_select_flags;       /* per-column CSV/TEXT CS flags 
*/
-
+       bool            is_no_read_acc;
        /* these are just for error messages, see CopyFromErrorCallback */
        const char *cur_relname;        /* table name for error messages */
        int                     cur_lineno;             /* line number for 
error messages */
@@ -1153,6 +1153,14 @@ ProcessCopyOptions(CopyState cstate,
                                                 errmsg("argument to option 
\"%s\" must be a valid encoding name",
                                                                
defel->defname)));
                }
+               else if (strcmp(defel->defname, "is_no_read_acc") == 0)
+               {
+                       if (cstate->is_no_read_acc)
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                errmsg("conflicting or 
redundant options")));
+                       cstate->is_no_read_acc = true;
+               }
                else
                        ereport(ERROR,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
@@ -1302,6 +1310,11 @@ ProcessCopyOptions(CopyState cstate,
                ereport(ERROR,
                                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                 errmsg("CSV quote character must not appear in 
the NULL specification")));
+
+       if ( cstate->is_no_read_acc && is_from )
+               ereport(ERROR,
+                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                errmsg("COPY owner access only available using 
COPY TO file")));
 }
 
 /*
@@ -1723,7 +1736,11 @@ BeginCopyTo(Relation rel,
                                                (errcode(ERRCODE_INVALID_NAME),
                                          errmsg("relative path not allowed for 
COPY to file")));
 
-                       oumask = umask(S_IWGRP | S_IWOTH);
+                       if (cstate->is_no_read_acc)
+                               oumask = umask(S_IWGRP | S_IRGRP | S_IWOTH | 
S_IROTH);
+                       else
+                               oumask = umask(S_IWGRP | S_IWOTH);
+
                        cstate->copy_file = AllocateFile(cstate->filename, 
PG_BINARY_W);
                        umask(oumask);
                        if (cstate->copy_file == NULL)
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 1efc6d6..5dc5cbd 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -2712,6 +2712,10 @@ copy_opt_item:
                                {
                                        $$ = makeDefElem("encoding", (Node 
*)makeString($2));
                                }
+                       | NO READ ACCESS
+                               {
+                                       $$ = makeDefElem("is_no_read_acc", 
(Node *)makeInteger(TRUE));
+                               }
                ;
 
 /* The following exist for backward compatibility with very old versions */
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to