1
#include <Security/Security.h>
4
#include "keyring_util.h"
7
keychain_password_set(PyObject *self, PyObject *args)
9
const char *realmstring;
13
SecKeychainRef keychain;
14
SecKeychainItemRef item;
16
if (!PyArg_ParseTuple(args, "sss", &realmstring, &username, &password)){
18
PyErr_SetString(PyExc_TypeError,
19
"password_set() must be called as (servicename,username,password)");
23
if (SecKeychainOpen("login.keychain",&keychain) != 0 ){
25
PyErr_SetString(PyExc_OSError,
26
"can't access the login.keychain, Authorization failed");
30
status = SecKeychainFindGenericPassword(keychain, strlen(realmstring),
31
realmstring, username == NULL
34
username, 0, NULL, &item);
36
if (status == errSecItemNotFound)
37
status = SecKeychainAddGenericPassword(keychain, strlen(realmstring),
38
realmstring, username == NULL
41
username, strlen(password),
45
status = SecKeychainItemModifyAttributesAndData(item, NULL,
51
if (status != 0){ // error occurs
53
PyErr_SetString(PyExc_OSError, "Can't store password in Keychain");
62
keychain_password_get(PyObject *self, PyObject *args)
64
const char *realmstring;
69
SecKeychainRef keychain;
72
if (!PyArg_ParseTuple(args, "ss", &realmstring, &username)){
74
PyErr_SetString(PyExc_TypeError,
75
"password_get() must be called as (servicename,username)");
79
if (SecKeychainOpen("login.keychain", &keychain) != 0 ){
81
PyErr_SetString(PyExc_OSError,
82
"can't access the login.keychain, Authorization failed");
86
status = SecKeychainFindGenericPassword(keychain, strlen(realmstring),
87
realmstring, username == NULL
90
username, &length, &data, NULL);
93
password = string_dump(data, length);
94
SecKeychainItemFreeContent(NULL, data);
95
}else if (status == errSecItemNotFound){
100
PyErr_SetString(PyExc_OSError, "Can't fetch password from system");
104
return Py_BuildValue("s",password);
107
static struct PyMethodDef keychain_methods[] ={
108
{"password_set", keychain_password_set, METH_VARARGS},
109
{"password_get", keychain_password_get, METH_VARARGS},
110
{NULL,NULL} /* Sentinel */
114
initosx_keychain(void)
116
Py_InitModule("osx_keychain", keychain_methods);