VirtualBox

source: vbox/trunk/src/VBox/HostServices/auth/simple/VBoxAuthSimple.cpp@ 54266

Last change on this file since 54266 was 35943, checked in by vboxsync, 14 years ago

VBoxAuth samples: updated to the new generic auth interface.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 3.6 KB
Line 
1/** @file
2 *
3 * VirtualBox External Authentication Library:
4 * Simple Authentication.
5 */
6
7/*
8 * Copyright (C) 2006-2011 Oracle Corporation
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18
19#include <stdlib.h>
20#include <stdio.h>
21#include <string.h>
22
23#include <iprt/cdefs.h>
24#include <iprt/uuid.h>
25#include <iprt/sha.h>
26
27#include <VBox/VBoxAuth.h>
28
29#include <VBox/com/com.h>
30#include <VBox/com/string.h>
31#include <VBox/com/Guid.h>
32#include <VBox/com/VirtualBox.h>
33
34using namespace com;
35
36/* If defined, debug messages will be written to the specified file. */
37//#define AUTH_DEBUG_FILE_NAME "/tmp/VBoxAuth.log"
38
39
40static void dprintf(const char *fmt, ...)
41{
42#ifdef AUTH_DEBUG_FILE_NAME
43 va_list va;
44
45 va_start(va, fmt);
46
47 char buffer[1024];
48
49 vsnprintf(buffer, sizeof(buffer), fmt, va);
50
51 FILE *f = fopen(AUTH_DEBUG_FILE_NAME, "ab");
52 if (f)
53 {
54 fprintf(f, "%s", buffer);
55 fclose(f);
56 }
57
58 va_end (va);
59#endif
60}
61
62RT_C_DECLS_BEGIN
63DECLEXPORT(AuthResult) AUTHCALL AuthEntry(const char *szCaller,
64 PAUTHUUID pUuid,
65 AuthGuestJudgement guestJudgement,
66 const char *szUser,
67 const char *szPassword,
68 const char *szDomain,
69 int fLogon,
70 unsigned clientId)
71{
72 /* default is failed */
73 AuthResult result = AuthResultAccessDenied;
74
75 /* only interested in logon */
76 if (!fLogon)
77 /* return value ignored */
78 return result;
79
80 char uuid[RTUUID_STR_LENGTH] = {0};
81 if (pUuid)
82 RTUuidToStr((PCRTUUID)pUuid, (char*)uuid, RTUUID_STR_LENGTH);
83
84 /* the user might contain a domain name, split it */
85 char *user = strchr((char*)szUser, '\\');
86 if (user)
87 user++;
88 else
89 user = (char*)szUser;
90
91 dprintf("VBoxAuth: uuid: %s, user: %s, szPassword: %s\n", uuid, user, szPassword);
92
93 ComPtr<IVirtualBox> virtualBox;
94 HRESULT rc;
95
96 rc = virtualBox.createLocalObject(CLSID_VirtualBox);
97 if (SUCCEEDED(rc))
98 {
99 Bstr key = BstrFmt("VBoxAuthSimple/users/%s", user);
100 Bstr password;
101
102 /* lookup in VM's extra data? */
103 if (pUuid)
104 {
105 ComPtr<IMachine> machine;
106 virtualBox->FindMachine(Bstr(uuid).raw(), machine.asOutParam());
107 if (machine)
108 machine->GetExtraData(key.raw(), password.asOutParam());
109 } else
110 /* lookup global extra data */
111 virtualBox->GetExtraData(key.raw(), password.asOutParam());
112
113 if (!password.isEmpty())
114 {
115 /* calculate hash */
116 uint8_t abDigest[RTSHA256_HASH_SIZE];
117 RTSha256(szPassword, strlen(szPassword), abDigest);
118 char pszDigest[RTSHA256_DIGEST_LEN + 1];
119 RTSha256ToString(abDigest, pszDigest, sizeof(pszDigest));
120
121 if (password == pszDigest)
122 result = AuthResultAccessGranted;
123 }
124 }
125
126 return result;
127}
128RT_C_DECLS_END
129
130/* Verify the function prototype. */
131static PAUTHENTRY3 gpfnAuthEntry = AuthEntry;
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette