Commit b6a748b8 authored by Martin v. Löwis's avatar Martin v. Löwis

Issue #4859: Implement PEP 383 for pwd, spwd, and grp.

parent c15bdef8
...@@ -766,6 +766,7 @@ Greg Ward ...@@ -766,6 +766,7 @@ Greg Ward
Barry Warsaw Barry Warsaw
Steve Waterbury Steve Waterbury
Bob Watson Bob Watson
David Watson
Aaron Watters Aaron Watters
Henrik Weber Henrik Weber
Corran Webster Corran Webster
......
...@@ -40,6 +40,8 @@ Core and Builtins ...@@ -40,6 +40,8 @@ Core and Builtins
Library Library
------- -------
- Issue #4859: Implement PEP 383 for pwd, spwd, and grp.
- smtplib 'login' and 'cram-md5' login are also fixed (see Issue #5259). - smtplib 'login' and 'cram-md5' login are also fixed (see Issue #5259).
- Issue #6121: pydoc now ignores leading and trailing spaces in the - Issue #6121: pydoc now ignores leading and trailing spaces in the
......
...@@ -46,8 +46,11 @@ mkgrent(struct group *p) ...@@ -46,8 +46,11 @@ mkgrent(struct group *p)
Py_DECREF(v); Py_DECREF(v);
return NULL; return NULL;
} }
#define FSDECODE(val) PyUnicode_Decode(val, strlen(val),\
Py_FileSystemDefaultEncoding,\
"surrogateescape")
for (member = p->gr_mem; *member != NULL; member++) { for (member = p->gr_mem; *member != NULL; member++) {
PyObject *x = PyUnicode_FromString(*member); PyObject *x = FSDECODE(*member);
if (x == NULL || PyList_Append(w, x) != 0) { if (x == NULL || PyList_Append(w, x) != 0) {
Py_XDECREF(x); Py_XDECREF(x);
Py_DECREF(w); Py_DECREF(w);
...@@ -58,13 +61,13 @@ mkgrent(struct group *p) ...@@ -58,13 +61,13 @@ mkgrent(struct group *p)
} }
#define SET(i,val) PyStructSequence_SET_ITEM(v, i, val) #define SET(i,val) PyStructSequence_SET_ITEM(v, i, val)
SET(setIndex++, PyUnicode_FromString(p->gr_name)); SET(setIndex++, FSDECODE(p->gr_name));
#ifdef __VMS #ifdef __VMS
SET(setIndex++, Py_None); SET(setIndex++, Py_None);
Py_INCREF(Py_None); Py_INCREF(Py_None);
#else #else
if (p->gr_passwd) if (p->gr_passwd)
SET(setIndex++, PyUnicode_FromString(p->gr_passwd)); SET(setIndex++, FSDECODE(p->gr_passwd));
else { else {
SET(setIndex++, Py_None); SET(setIndex++, Py_None);
Py_INCREF(Py_None); Py_INCREF(Py_None);
...@@ -104,25 +107,28 @@ grp_getgrgid(PyObject *self, PyObject *pyo_id) ...@@ -104,25 +107,28 @@ grp_getgrgid(PyObject *self, PyObject *pyo_id)
} }
static PyObject * static PyObject *
grp_getgrnam(PyObject *self, PyObject *pyo_name) grp_getgrnam(PyObject *self, PyObject *args)
{ {
PyObject *py_str_name;
char *name; char *name;
struct group *p; struct group *p;
PyObject *arg, *bytes, *retval = NULL;
py_str_name = PyObject_Str(pyo_name); if (!PyArg_ParseTuple(args, "U:getgrnam", &arg))
if (!py_str_name)
return NULL; return NULL;
name = _PyUnicode_AsString(py_str_name); if ((bytes = PyUnicode_AsEncodedString(arg, Py_FileSystemDefaultEncoding,
"surrogateescape")) == NULL)
return NULL;
if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1)
goto out;
if ((p = getgrnam(name)) == NULL) { if ((p = getgrnam(name)) == NULL) {
PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %s", name); PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %s", name);
Py_DECREF(py_str_name); goto out;
return NULL;
} }
retval = mkgrent(p);
Py_DECREF(py_str_name); out:
return mkgrent(p); Py_DECREF(bytes);
return retval;
} }
static PyObject * static PyObject *
...@@ -152,7 +158,7 @@ static PyMethodDef grp_methods[] = { ...@@ -152,7 +158,7 @@ static PyMethodDef grp_methods[] = {
"getgrgid(id) -> tuple\n\ "getgrgid(id) -> tuple\n\
Return the group database entry for the given numeric group ID. If\n\ Return the group database entry for the given numeric group ID. If\n\
id is not valid, raise KeyError."}, id is not valid, raise KeyError."},
{"getgrnam", grp_getgrnam, METH_O, {"getgrnam", grp_getgrnam, METH_VARARGS,
"getgrnam(name) -> tuple\n\ "getgrnam(name) -> tuple\n\
Return the group database entry for the given group name. If\n\ Return the group database entry for the given group name. If\n\
name is not valid, raise KeyError."}, name is not valid, raise KeyError."},
......
...@@ -49,8 +49,9 @@ static void ...@@ -49,8 +49,9 @@ static void
sets(PyObject *v, int i, const char* val) sets(PyObject *v, int i, const char* val)
{ {
if (val) { if (val) {
PyObject *o = PyObject *o = PyUnicode_Decode(val, strlen(val),
PyUnicode_DecodeUnicodeEscape(val, strlen(val), "strict"); Py_FileSystemDefaultEncoding,
"surrogateescape");
PyStructSequence_SET_ITEM(v, i, o); PyStructSequence_SET_ITEM(v, i, o);
} }
else { else {
...@@ -129,14 +130,25 @@ pwd_getpwnam(PyObject *self, PyObject *args) ...@@ -129,14 +130,25 @@ pwd_getpwnam(PyObject *self, PyObject *args)
{ {
char *name; char *name;
struct passwd *p; struct passwd *p;
if (!PyArg_ParseTuple(args, "s:getpwnam", &name)) PyObject *arg, *bytes, *retval = NULL;
if (!PyArg_ParseTuple(args, "U:getpwnam", &arg))
return NULL;
if ((bytes = PyUnicode_AsEncodedString(arg,
Py_FileSystemDefaultEncoding,
"surrogateescape")) == NULL)
return NULL; return NULL;
if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1)
goto out;
if ((p = getpwnam(name)) == NULL) { if ((p = getpwnam(name)) == NULL) {
PyErr_Format(PyExc_KeyError, PyErr_Format(PyExc_KeyError,
"getpwnam(): name not found: %s", name); "getpwnam(): name not found: %s", name);
return NULL; goto out;
} }
return mkpwent(p); retval = mkpwent(p);
out:
Py_DECREF(bytes);
return retval;
} }
#ifdef HAVE_GETPWENT #ifdef HAVE_GETPWENT
......
...@@ -59,9 +59,12 @@ static PyTypeObject StructSpwdType; ...@@ -59,9 +59,12 @@ static PyTypeObject StructSpwdType;
static void static void
sets(PyObject *v, int i, const char* val) sets(PyObject *v, int i, const char* val)
{ {
if (val) if (val) {
PyStructSequence_SET_ITEM(v, i, PyUnicode_FromString(val)); PyObject *o = PyUnicode_Decode(val, strlen(val),
else { Py_FileSystemDefaultEncoding,
"surrogateescape");
PyStructSequence_SET_ITEM(v, i, o);
} else {
PyStructSequence_SET_ITEM(v, i, Py_None); PyStructSequence_SET_ITEM(v, i, Py_None);
Py_INCREF(Py_None); Py_INCREF(Py_None);
} }
...@@ -113,13 +116,24 @@ static PyObject* spwd_getspnam(PyObject *self, PyObject *args) ...@@ -113,13 +116,24 @@ static PyObject* spwd_getspnam(PyObject *self, PyObject *args)
{ {
char *name; char *name;
struct spwd *p; struct spwd *p;
if (!PyArg_ParseTuple(args, "s:getspnam", &name)) PyObject *arg, *bytes, *retval = NULL;
if (!PyArg_ParseTuple(args, "U:getspnam", &arg))
return NULL;
if ((bytes = PyUnicode_AsEncodedString(arg,
Py_FileSystemDefaultEncoding,
"surrogateescape")) == NULL)
return NULL; return NULL;
if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1)
goto out;
if ((p = getspnam(name)) == NULL) { if ((p = getspnam(name)) == NULL) {
PyErr_SetString(PyExc_KeyError, "getspnam(): name not found"); PyErr_SetString(PyExc_KeyError, "getspnam(): name not found");
return NULL; goto out;
} }
return mkspent(p); retval = mkspent(p);
out:
Py_DECREF(bytes);
return retval;
} }
#endif /* HAVE_GETSPNAM */ #endif /* HAVE_GETSPNAM */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment