aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/src/sgml/plpython.sgml29
-rw-r--r--doc/src/sgml/release.sgml3
-rw-r--r--doc/src/sgml/xplang.sgml19
-rw-r--r--src/bin/scripts/createlang.c8
-rw-r--r--src/pl/plpython/README39
-rw-r--r--src/pl/plpython/TODO5
-rw-r--r--src/pl/plpython/error.expected29
-rw-r--r--src/pl/plpython/feature.expected2
-rw-r--r--src/pl/plpython/plpython_drop.sql2
-rw-r--r--src/pl/plpython/plpython_function.sql54
-rw-r--r--src/pl/plpython/plpython_setof.sql2
-rwxr-xr-xsrc/pl/plpython/test.sh2
12 files changed, 86 insertions, 108 deletions
diff --git a/doc/src/sgml/plpython.sgml b/doc/src/sgml/plpython.sgml
index 6ec19c6e8ea..2de2e746b5f 100644
--- a/doc/src/sgml/plpython.sgml
+++ b/doc/src/sgml/plpython.sgml
@@ -1,4 +1,4 @@
-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/plpython.sgml,v 1.16 2003/04/07 01:29:25 petere Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/plpython.sgml,v 1.17 2003/06/30 18:31:41 tgl Exp $ -->
<chapter id="plpython">
<title>PL/Python - Python Procedural Language</title>
@@ -14,9 +14,21 @@
<para>
To install PL/Python in a particular database, use
- <literal>createlang plpython <replaceable>dbname</></literal>.
+ <literal>createlang plpythonu <replaceable>dbname</></literal>.
</para>
+ <note>
+ <para>
+ As of <productname>PostgreSQL</productname> 7.4,
+ PL/Python is only available as an <quote>untrusted</> language
+ (meaning it does not offer any way of restricting what users
+ can do in it). It has therefore been renamed to <literal>plpythonu</>.
+ The trusted variant <literal>plpython</> may become available again in
+ future, if a new secure execution mechanism is developed by the Python
+ community.
+ </para>
+ </note>
+
<tip>
<para>
If a language is installed into <literal>template1</>, all subsequently
@@ -41,7 +53,7 @@
<programlisting>
CREATE FUNCTION myfunc(text) RETURNS text
AS 'return args[0]'
- LANGUAGE plpython;
+ LANGUAGE plpythonu;
</programlisting>
gets transformed into
@@ -78,6 +90,8 @@ def __plpython_procedure_myfunc_23456():
available to all Python functions within a session. Use with care.
</para>
+<!-- NOT CORRECT ANYMORE, IS IT?
+
<para>
Each function gets its own restricted execution object in the
Python interpreter, so that global data and function arguments from
@@ -85,6 +99,9 @@ def __plpython_procedure_myfunc_23456():
<function>myfunc2</function>. The exception is the data in the
<varname>GD</varname> dictionary, as mentioned above.
</para>
+
+-->
+
</sect1>
<sect1 id="plpython-trigger">
@@ -218,11 +235,13 @@ CREATE FUNCTION usesavedplan() RETURNS trigger AS '
plan = plpy.prepare("SELECT 1")
SD["plan"] = plan
# rest of function
-' LANGUAGE plpython;
+' LANGUAGE plpythonu;
</programlisting>
</para>
</sect1>
+<!-- NOT CURRENTLY SUPPORTED
+
<sect1 id="plpython-trusted">
<title>Restricted Environment</title>
@@ -245,4 +264,6 @@ CREATE FUNCTION usesavedplan() RETURNS trigger AS '
</para>
</sect1>
+-->
+
</chapter>
diff --git a/doc/src/sgml/release.sgml b/doc/src/sgml/release.sgml
index 188f2c8341b..a17669e73ea 100644
--- a/doc/src/sgml/release.sgml
+++ b/doc/src/sgml/release.sgml
@@ -1,5 +1,5 @@
<!--
-$Header: /cvsroot/pgsql/doc/src/sgml/release.sgml,v 1.195 2003/06/28 00:12:40 tgl Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/release.sgml,v 1.196 2003/06/30 18:31:41 tgl Exp $
-->
<appendix id="release">
@@ -24,6 +24,7 @@ CDATA means the content is "SGML-free", so you can write without
worries about funny characters.
-->
<literallayout><![CDATA[
+PL/Python is now an untrusted language, and is renamed to 'plpythonu'
Dollar sign ($) is no longer allowed in operator names
Dollar sign ($) can be a non-first character in identifiers
Precision in FLOAT(p) is now interpreted as bits, not decimal digits
diff --git a/doc/src/sgml/xplang.sgml b/doc/src/sgml/xplang.sgml
index 26e05528b5f..d350ba25ea8 100644
--- a/doc/src/sgml/xplang.sgml
+++ b/doc/src/sgml/xplang.sgml
@@ -1,5 +1,5 @@
<!--
-$Header: /cvsroot/pgsql/doc/src/sgml/xplang.sgml,v 1.21 2003/04/07 01:29:26 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/xplang.sgml,v 1.22 2003/06/30 18:31:42 tgl Exp $
-->
<chapter id="xplang">
@@ -109,13 +109,14 @@ CREATE <optional>TRUSTED</optional> <optional>PROCEDURAL</optional> LANGUAGE <re
for languages that do not allow access to database server
internals or the file system. The languages
<application>PL/pgSQL</application>,
- <application>PL/Tcl</application>,
- <application>PL/Perl</application>, and
- <application>PL/Python</application> are known to be trusted;
- the languages <application>PL/TclU</application> and
- <application>PL/PerlU</application> are designed to provide
- unlimited functionality and should <emphasis>not</emphasis> be
- marked trusted.
+ <application>PL/Tcl</application>, and
+ <application>PL/Perl</application>
+ are considered trusted; the languages
+ <application>PL/TclU</application>,
+ <application>PL/PerlU</application>, and
+ <application>PL/PythonU</application>
+ are designed to provide unlimited functionality and should
+ <emphasis>not</emphasis> be marked trusted.
</para>
</step>
</procedure>
@@ -158,7 +159,7 @@ CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql
directory. If <application>Tcl/Tk</> support is configured in, the handlers for
<application>PL/Tcl</> and <application>PL/TclU</> are also built and installed in the same
location. Likewise, the <application>PL/Perl</> and <application>PL/PerlU</> handlers are built
- and installed if Perl support is configured, and <application>PL/Python</> is
+ and installed if Perl support is configured, and <application>PL/PythonU</> is
installed if Python support is configured.
</para>
diff --git a/src/bin/scripts/createlang.c b/src/bin/scripts/createlang.c
index ccac0668bb7..1664238b5e6 100644
--- a/src/bin/scripts/createlang.c
+++ b/src/bin/scripts/createlang.c
@@ -5,7 +5,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/src/bin/scripts/createlang.c,v 1.3 2003/06/11 05:13:12 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/scripts/createlang.c,v 1.4 2003/06/30 18:31:42 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -195,16 +195,16 @@ main(int argc, char *argv[])
handler = "plperl_call_handler";
object = "plperl";
}
- else if (strcmp(langname, "plpython")==0)
+ else if (strcmp(langname, "plpythonu")==0)
{
- trusted = true;
+ trusted = false;
handler = "plpython_call_handler";
object = "plpython";
}
else
{
fprintf(stderr, _("%s: unsupported language \"%s\"\n"), progname, langname);
- fprintf(stderr, _("Supported languages are plpgsql, pltcl, pltclu, plperl, plperlu, and plpython.\n"));
+ fprintf(stderr, _("Supported languages are plpgsql, pltcl, pltclu, plperl, plperlu, and plpythonu.\n"));
exit(1);
}
diff --git a/src/pl/plpython/README b/src/pl/plpython/README
deleted file mode 100644
index 6a2c68e11c3..00000000000
--- a/src/pl/plpython/README
+++ /dev/null
@@ -1,39 +0,0 @@
-PL/Python - Python Procedural Language for PostgreSQL
------------------------------------------------------
-$Id: README,v 1.2 2001/05/14 22:06:50 petere Exp $
-
-Installation:
-
-configure --with-python
-cd src/pl/plpython
-gmake
-gmake install
-
-Test:
-
-# have postmaster running...
-gmake installcheck
-
-Enable language:
-
-createlang plpython dbname
-
-
-Note that PL/Python is currently not built automatically because the
-code is new and there are some portability issues.
-
-A default Python installation does not provide a shared libpython
-library. This is not a problem on many platforms (although it makes
-things less efficient), but on some platforms (especially HP-UX) the
-link will fail outright.
-
-To create a shared libpython, see this web page for hints:
-
-http://www.python.org/cgi-bin/faqw.py?req=show&file=faq03.030.htp
-
-Place the resulting library in the same directory as the existing
-static libpythonX.Y.a and relink plpython.
-
-
-Further documentation is available in the PostgreSQL Programmer's
-Guide.
diff --git a/src/pl/plpython/TODO b/src/pl/plpython/TODO
index a8da750f0c2..f2af3ebc8a2 100644
--- a/src/pl/plpython/TODO
+++ b/src/pl/plpython/TODO
@@ -1,5 +1,8 @@
In no particular order...
+* Develop a trusted variant of PL/Python. Now that RExec has been shown
+ to be full of holes, this may take a while :-(
+
* Allow arrays as function arguments and return values. (almost done)
* Create a new restricted execution class that will allow me to pass
@@ -10,7 +13,7 @@ In no particular order...
so the following will make PostgreSQL unhappy:
create table users (first_name text, last_name text);
- create function user_name(user) returns text as 'mycode' language 'plpython';
+ create function user_name(user) returns text as 'mycode' language plpython;
select user_name(user) from users;
alter table add column user_id integer;
select user_name(user) from users;
diff --git a/src/pl/plpython/error.expected b/src/pl/plpython/error.expected
index 87772f51879..b00f8d4a40e 100644
--- a/src/pl/plpython/error.expected
+++ b/src/pl/plpython/error.expected
@@ -16,24 +16,15 @@ SELECT valid_type('rick');
(1 row)
-SELECT read_file('/etc/passwd');
-ERROR: plpython: Call of function `read_file' failed.
-exceptions.IOError: can't open files in restricted mode
-SELECT write_file('/tmp/plpython','This is very bad');
-ERROR: plpython: Call of function `write_file' failed.
-exceptions.IOError: can't open files in restricted mode
-SELECT getpid();
-ERROR: plpython: Call of function `getpid' failed.
-exceptions.AttributeError: 'module' object has no attribute 'getpid'
-SELECT uname();
-ERROR: plpython: Call of function `uname' failed.
-exceptions.AttributeError: 'module' object has no attribute 'uname'
-SELECT sys_exit();
-ERROR: plpython: Call of function `sys_exit' failed.
-exceptions.AttributeError: 'module' object has no attribute 'exit'
-SELECT sys_argv();
- sys_argv
-----------------
- ['RESTRICTED']
+SELECT write_file('/tmp/plpython','Only trusted users should be able to do this!');
+ write_file
+------------------------------
+ Wrote to file: /tmp/plpython
+(1 row)
+
+SELECT read_file('/tmp/plpython');
+ read_file
+-----------------------------------------------
+ Only trusted users should be able to do this!
(1 row)
diff --git a/src/pl/plpython/feature.expected b/src/pl/plpython/feature.expected
index 66e4e6709c2..351bee017ce 100644
--- a/src/pl/plpython/feature.expected
+++ b/src/pl/plpython/feature.expected
@@ -29,7 +29,7 @@ SELECT global_test_two();
(1 row)
SELECT import_fail();
-NOTICE: ('import socket failed -- untrusted dynamic module: _socket',)
+NOTICE: ('import socket failed -- No module named foosocket',)
import_fail
--------------------
failed as expected
diff --git a/src/pl/plpython/plpython_drop.sql b/src/pl/plpython/plpython_drop.sql
index 42387f544a1..7dbb3b0a43e 100644
--- a/src/pl/plpython/plpython_drop.sql
+++ b/src/pl/plpython/plpython_drop.sql
@@ -7,5 +7,5 @@ DROP TRIGGER users_update_trig on users ;
DROP FUNCTION users_update() ;
DROP TRIGGER users_delete_trig on users ;
DROP FUNCTION users_delete() ;
-DROP PROCEDURAL LANGUAGE 'plpython' ;
+DROP PROCEDURAL LANGUAGE plpythonu ;
DROP FUNCTION plpython_call_handler() ;
diff --git a/src/pl/plpython/plpython_function.sql b/src/pl/plpython/plpython_function.sql
index 82a3c0c9598..801222f4ef8 100644
--- a/src/pl/plpython/plpython_function.sql
+++ b/src/pl/plpython/plpython_function.sql
@@ -7,7 +7,7 @@ CREATE FUNCTION global_test_one() returns text
if not GD.has_key("global_test"):
GD["global_test"] = "set by global_test_one"
return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE FUNCTION global_test_two() returns text
AS
@@ -16,7 +16,7 @@ CREATE FUNCTION global_test_two() returns text
if not GD.has_key("global_test"):
GD["global_test"] = "set by global_test_two"
return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE FUNCTION static_test() returns int4
@@ -27,7 +27,7 @@ else:
SD["call"] = 1
return SD["call"]
'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
-- import python modules
@@ -39,7 +39,7 @@ except Exception, ex:
plpy.notice("import socket failed -- %s" % str(ex))
return "failed as expected"
return "succeeded, that wasn''t supposed to happen"'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE FUNCTION import_succeed() returns text
@@ -63,14 +63,14 @@ except Exception, ex:
plpy.notice("import failed -- %s" % str(ex))
return "failed, that wasn''t supposed to happen"
return "succeeded, as expected"'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE FUNCTION import_test_one(text) RETURNS text
AS
'import sha
digest = sha.new(args[0])
return digest.hexdigest()'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE FUNCTION import_test_two(users) RETURNS text
AS
@@ -78,7 +78,7 @@ CREATE FUNCTION import_test_two(users) RETURNS text
plain = args[0]["fname"] + args[0]["lname"]
digest = sha.new(plain);
return "sha hash of " + plain + " is " + digest.hexdigest()'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE FUNCTION argument_test_one(users, text, text) RETURNS text
AS
@@ -89,7 +89,7 @@ for key in keys:
out.append("%s: %s" % (key, args[0][key]))
words = args[1] + " " + args[2] + " => {" + ", ".join(out) + "}"
return words'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
-- these triggers are dedicated to HPHC of RI who
@@ -110,7 +110,7 @@ if TD["new"]["fname"] == "william":
TD["new"]["fname"] = TD["args"][0]
rv = "MODIFY"
return rv'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE FUNCTION users_update() returns trigger
@@ -119,7 +119,7 @@ CREATE FUNCTION users_update() returns trigger
if TD["old"]["fname"] != TD["new"]["fname"] and TD["old"]["fname"] == TD["args"][0]:
return "SKIP"
return None'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE FUNCTION users_delete() RETURNS trigger
@@ -127,7 +127,7 @@ CREATE FUNCTION users_delete() RETURNS trigger
'if TD["old"]["fname"] == TD["args"][0]:
return "SKIP"
return None'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE TRIGGER users_insert_trig BEFORE INSERT ON users FOR EACH ROW
@@ -148,19 +148,19 @@ CREATE FUNCTION nested_call_one(text) RETURNS text
'q = "SELECT nested_call_two(''%s'')" % args[0]
r = plpy.execute(q)
return r[0]'
- LANGUAGE 'plpython' ;
+ LANGUAGE plpythonu ;
CREATE FUNCTION nested_call_two(text) RETURNS text
AS
'q = "SELECT nested_call_three(''%s'')" % args[0]
r = plpy.execute(q)
return r[0]'
- LANGUAGE 'plpython' ;
+ LANGUAGE plpythonu ;
CREATE FUNCTION nested_call_three(text) RETURNS text
AS
'return args[0]'
- LANGUAGE 'plpython' ;
+ LANGUAGE plpythonu ;
-- some spi stuff
@@ -176,7 +176,7 @@ except Exception, ex:
plpy.error(str(ex))
return None
'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE FUNCTION spi_prepared_plan_test_nested(text) RETURNS text
AS
@@ -191,12 +191,12 @@ except Exception, ex:
plpy.error(str(ex))
return None
'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
/* really stupid function just to get the module loaded
*/
-CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE 'plpython';
+CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpythonu;
/* a typo
*/
@@ -210,7 +210,7 @@ if len(rv):
return rv[0]["fname"]
return None
'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
/* for what it's worth catch the exception generated by
* the typo, and return None
@@ -229,7 +229,7 @@ if len(rv):
return rv[0]["fname"]
return None
'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
/* for what it's worth catch the exception generated by
* the typo, and reraise it as a plain error
@@ -247,7 +247,7 @@ if len(rv):
return rv[0]["fname"]
return None
'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
/* no typo no messing about
@@ -261,20 +261,20 @@ if len(rv):
return rv[0]["fname"]
return None
'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
/* Flat out syntax error
*/
CREATE FUNCTION sql_syntax_error() RETURNS text
AS
'plpy.execute("syntax error")'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
/* check the handling of uncaught python exceptions
*/
CREATE FUNCTION exception_index_invalid(text) RETURNS text
AS
'return args[1]'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
/* check handling of nested exceptions
*/
@@ -282,7 +282,7 @@ CREATE FUNCTION exception_index_invalid_nested() RETURNS text
AS
'rv = plpy.execute("SELECT test5(''foo'')")
return rv[0]'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE FUNCTION join_sequences(sequences) RETURNS text
@@ -296,13 +296,13 @@ for r in rv:
seq = seq + r["sequence"]
return seq
'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
CREATE OR REPLACE FUNCTION read_file(text) RETURNS text AS '
return open(args[0]).read()
-' LANGUAGE 'plpython';
+' LANGUAGE plpythonu;
CREATE OR REPLACE FUNCTION write_file(text,text) RETURNS text AS '
open(args[0],"w").write(args[1])
return "Wrote to file: %s" % args[0]
-' LANGUAGE 'plpython';
+' LANGUAGE plpythonu;
diff --git a/src/pl/plpython/plpython_setof.sql b/src/pl/plpython/plpython_setof.sql
index 7cbbeba4d8f..f0d273f9486 100644
--- a/src/pl/plpython/plpython_setof.sql
+++ b/src/pl/plpython/plpython_setof.sql
@@ -8,4 +8,4 @@ CREATE FUNCTION test_setof() returns setof text
else:
GD["calls"] = 1
return str(GD["calls"])'
- LANGUAGE 'plpython';
+ LANGUAGE plpythonu;
diff --git a/src/pl/plpython/test.sh b/src/pl/plpython/test.sh
index 7684b5953aa..5cc677c33cd 100755
--- a/src/pl/plpython/test.sh
+++ b/src/pl/plpython/test.sh
@@ -11,7 +11,7 @@ createdb $DBNAME >> test.log 2>&1
echo " Done. ***"
echo -n "*** Create plpython."
-createlang plpython $DBNAME >> test.log 2>&1
+createlang plpythonu $DBNAME >> test.log 2>&1
echo " Done. ***"
echo -n "*** Create tables"