Add support for changing the password during connection in order to handle
expired passwords.
This commit is contained in:
parent
2fc59ecb8d
commit
99510c84d5
67
Connection.c
67
Connection.c
@ -452,6 +452,52 @@ static int Connection_Attach(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Connection_ChangePassword()
|
||||||
|
// Change the password for the given connection.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
static int Connection_ChangePassword(
|
||||||
|
udt_Connection *self, // connection
|
||||||
|
PyObject *oldPasswordObj, // old password
|
||||||
|
PyObject *newPasswordObj) // new password
|
||||||
|
{
|
||||||
|
udt_StringBuffer usernameBuffer, oldPasswordBuffer, newPasswordBuffer;
|
||||||
|
sword status;
|
||||||
|
|
||||||
|
if (StringBuffer_Fill(&usernameBuffer, self->username) < 0)
|
||||||
|
return -1;
|
||||||
|
if (StringBuffer_Fill(&oldPasswordBuffer, oldPasswordObj) < 0) {
|
||||||
|
StringBuffer_Clear(&usernameBuffer);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (StringBuffer_Fill(&newPasswordBuffer, newPasswordObj) < 0) {
|
||||||
|
StringBuffer_Clear(&usernameBuffer);
|
||||||
|
StringBuffer_Clear(&oldPasswordBuffer);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// begin the session
|
||||||
|
Py_BEGIN_ALLOW_THREADS
|
||||||
|
status = OCIPasswordChange(self->handle, self->environment->errorHandle,
|
||||||
|
(text*) usernameBuffer.ptr, usernameBuffer.size,
|
||||||
|
(text*) oldPasswordBuffer.ptr, oldPasswordBuffer.size,
|
||||||
|
(text*) newPasswordBuffer.ptr, newPasswordBuffer.size,
|
||||||
|
OCI_AUTH);
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
|
StringBuffer_Clear(&usernameBuffer);
|
||||||
|
StringBuffer_Clear(&oldPasswordBuffer);
|
||||||
|
StringBuffer_Clear(&newPasswordBuffer);
|
||||||
|
if (Environment_CheckForError(self->environment, status,
|
||||||
|
"Connection_ChangePassword(): change password") < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
Py_XDECREF(self->password);
|
||||||
|
Py_INCREF(newPasswordObj);
|
||||||
|
self->password = newPasswordObj;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Connection_Connect()
|
// Connection_Connect()
|
||||||
// Create a new connection object by connecting to the database.
|
// Create a new connection object by connecting to the database.
|
||||||
@ -459,7 +505,8 @@ static int Connection_Attach(
|
|||||||
static int Connection_Connect(
|
static int Connection_Connect(
|
||||||
udt_Connection *self, // connection
|
udt_Connection *self, // connection
|
||||||
ub4 mode, // mode to connect as
|
ub4 mode, // mode to connect as
|
||||||
int twophase) // allow two phase commit?
|
int twophase, // allow two phase commit?
|
||||||
|
PyObject *newPasswordObj) // new password (if desired)
|
||||||
{
|
{
|
||||||
ub4 credentialType = OCI_CRED_EXT;
|
ub4 credentialType = OCI_CRED_EXT;
|
||||||
udt_StringBuffer buffer;
|
udt_StringBuffer buffer;
|
||||||
@ -573,6 +620,11 @@ static int Connection_Connect(
|
|||||||
"Connection_Connect(): set session handle") < 0)
|
"Connection_Connect(): set session handle") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
// if a new password has been specified, change it which will also
|
||||||
|
// establish the session
|
||||||
|
if (newPasswordObj)
|
||||||
|
return Connection_ChangePassword(self, self->password, newPasswordObj);
|
||||||
|
|
||||||
// begin the session
|
// begin the session
|
||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
status = OCISessionBegin(self->handle, self->environment->errorHandle,
|
status = OCISessionBegin(self->handle, self->environment->errorHandle,
|
||||||
@ -662,8 +714,8 @@ static int Connection_Init(
|
|||||||
PyObject *args, // arguments
|
PyObject *args, // arguments
|
||||||
PyObject *keywordArgs) // keyword arguments
|
PyObject *keywordArgs) // keyword arguments
|
||||||
{
|
{
|
||||||
|
PyObject *threadedObj, *twophaseObj, *eventsObj, *newPasswordObj;
|
||||||
PyObject *usernameObj, *passwordObj, *dsnObj, *cclassObj;
|
PyObject *usernameObj, *passwordObj, *dsnObj, *cclassObj;
|
||||||
PyObject *threadedObj, *twophaseObj, *eventsObj;
|
|
||||||
int threaded, twophase, events;
|
int threaded, twophase, events;
|
||||||
ub4 connectMode, purity;
|
ub4 connectMode, purity;
|
||||||
udt_SessionPool *pool;
|
udt_SessionPool *pool;
|
||||||
@ -672,23 +724,24 @@ static int Connection_Init(
|
|||||||
// define keyword arguments
|
// define keyword arguments
|
||||||
static char *keywordList[] = { "user", "password", "dsn", "mode",
|
static char *keywordList[] = { "user", "password", "dsn", "mode",
|
||||||
"handle", "pool", "threaded", "twophase", "events", "cclass",
|
"handle", "pool", "threaded", "twophase", "events", "cclass",
|
||||||
"purity", NULL };
|
"purity", "newpassword", NULL };
|
||||||
|
|
||||||
// parse arguments
|
// parse arguments
|
||||||
pool = NULL;
|
pool = NULL;
|
||||||
handle = NULL;
|
handle = NULL;
|
||||||
connectMode = OCI_DEFAULT;
|
connectMode = OCI_DEFAULT;
|
||||||
usernameObj = passwordObj = dsnObj = cclassObj = NULL;
|
usernameObj = passwordObj = dsnObj = cclassObj = NULL;
|
||||||
threadedObj = twophaseObj = eventsObj = NULL;
|
threadedObj = twophaseObj = eventsObj = newPasswordObj = NULL;
|
||||||
threaded = twophase = events = purity = 0;
|
threaded = twophase = events = purity = 0;
|
||||||
#ifdef ORACLE_11G
|
#ifdef ORACLE_11G
|
||||||
purity = OCI_ATTR_PURITY_DEFAULT;
|
purity = OCI_ATTR_PURITY_DEFAULT;
|
||||||
#endif
|
#endif
|
||||||
if (!PyArg_ParseTupleAndKeywords(args, keywordArgs, "|O!O!O!iiO!OOOO!i",
|
if (!PyArg_ParseTupleAndKeywords(args, keywordArgs, "|O!O!O!iiO!OOOO!iO!",
|
||||||
keywordList, cxString_Type, &usernameObj, cxString_Type,
|
keywordList, cxString_Type, &usernameObj, cxString_Type,
|
||||||
&passwordObj, cxString_Type, &dsnObj, &connectMode, &handle,
|
&passwordObj, cxString_Type, &dsnObj, &connectMode, &handle,
|
||||||
&g_SessionPoolType, &pool, &threadedObj, &twophaseObj, &eventsObj,
|
&g_SessionPoolType, &pool, &threadedObj, &twophaseObj, &eventsObj,
|
||||||
cxString_Type, &cclassObj, &purity))
|
cxString_Type, &cclassObj, &purity, cxString_Type,
|
||||||
|
&newPasswordObj))
|
||||||
return -1;
|
return -1;
|
||||||
if (threadedObj) {
|
if (threadedObj) {
|
||||||
threaded = PyObject_IsTrue(threadedObj);
|
threaded = PyObject_IsTrue(threadedObj);
|
||||||
@ -732,7 +785,7 @@ static int Connection_Init(
|
|||||||
return Connection_Attach(self, handle);
|
return Connection_Attach(self, handle);
|
||||||
if (pool || cclassObj)
|
if (pool || cclassObj)
|
||||||
return Connection_GetConnection(self, pool, cclassObj, purity);
|
return Connection_GetConnection(self, pool, cclassObj, purity);
|
||||||
return Connection_Connect(self, connectMode, twophase);
|
return Connection_Connect(self, connectMode, twophase, newPasswordObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user