summaryrefslogtreecommitdiffstats
path: root/src/winbind.c
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2014-08-04 12:48:56 -0400
committerSimo Sorce <simo@redhat.com>2014-08-07 12:44:46 -0400
commit193ec981cd15fb56283015608842fff1b781656b (patch)
treea6ba453e8631259f6f9a3b970cf4a621d701192a /src/winbind.c
parentc0ab9d46730db8196ce46fa3e346009d30cee029 (diff)
downloadgss-ntlmssp-193ec981cd15fb56283015608842fff1b781656b.tar.gz
gss-ntlmssp-193ec981cd15fb56283015608842fff1b781656b.tar.xz
gss-ntlmssp-193ec981cd15fb56283015608842fff1b781656b.zip
Add call to get creds from winbind
Based on David Woodhouse work.
Diffstat (limited to 'src/winbind.c')
-rw-r--r--src/winbind.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/winbind.c b/src/winbind.c
index 58114fe..f36e3ff 100644
--- a/src/winbind.c
+++ b/src/winbind.c
@@ -10,6 +10,64 @@
#include <wbclient.h>
+uint32_t winbind_get_creds(struct gssntlm_name *name,
+ struct gssntlm_cred *cred)
+{
+ struct wbcCredentialCacheParams params;
+ struct wbcCredentialCacheInfo *result;
+ struct wbcInterfaceDetails *details = NULL;
+ wbcErr wbc_status;
+ int ret = ENOENT;
+
+ if (name && name->data.user.domain) {
+ params.domain_name = name->data.user.domain;
+ } else {
+ wbc_status = wbcInterfaceDetails(&details);
+ if (!WBC_ERROR_IS_OK(wbc_status)) goto done;
+
+ params.domain_name = details->netbios_domain;
+ }
+
+ if (name && name->data.user.name) {
+ params.account_name = name->data.user.name;
+ } else {
+ params.account_name = getenv("NTLMUSER");
+ if (!params.account_name) {
+ params.account_name = getenv("USER");
+ }
+ if (!params.account_name) goto done;
+ }
+
+ params.level = WBC_CREDENTIAL_CACHE_LEVEL_NTLMSSP;
+ params.num_blobs = 0;
+ params.blobs = NULL;
+ wbc_status = wbcCredentialCache(&params, &result, NULL);
+
+ if(!WBC_ERROR_IS_OK(wbc_status)) goto done;
+
+ /* Yes, winbind seems to think it has credentials for us */
+ wbcFreeMemory(result);
+
+ cred->type = GSSNTLM_CRED_EXTERNAL;
+ cred->cred.external.user.type = GSSNTLM_NAME_USER;
+ cred->cred.external.user.data.user.domain = strdup(params.domain_name);
+ if (!cred->cred.external.user.data.user.domain) {
+ ret = ENOMEM;
+ goto done;
+ }
+ cred->cred.external.user.data.user.name = strdup(params.account_name);
+ if (!cred->cred.external.user.data.user.name) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ret = 0;
+
+done:
+ wbcFreeMemory(details);
+ return ret;
+}
+
uint32_t winbind_srv_auth(char *user, char *domain,
char *workstation, uint8_t *challenge,
struct ntlm_buffer *nt_chal_resp,