Bool Unicode_IsBufferValid(const void *buffer, // IN ssize_t lengthInBytes, // IN StringEncoding encoding) // IN { if (buffer == NULL) { ASSERT(lengthInBytes <= 0); return TRUE; } encoding = Unicode_ResolveEncoding(encoding); if (encoding == STRING_ENCODING_US_ASCII) { return UnicodeSanityCheck(buffer, lengthInBytes, encoding); } if (lengthInBytes == -1) { lengthInBytes = Unicode_LengthInBytes(buffer, encoding); } return CodeSet_Validate(buffer, lengthInBytes, Unicode_EncodingEnumToName(encoding)); }
AuthToken Auth_AuthenticateUser(const char *user, // IN: const char *pass) // IN: { struct passwd *pwd; #ifdef USE_PAM pam_handle_t *pamh; int pam_error; #endif if (!CodeSet_Validate(user, strlen(user), "UTF-8")) { Log("User not in UTF-8\n"); return NULL; } if (!CodeSet_Validate(pass, strlen(pass), "UTF-8")) { Log("Password not in UTF-8\n"); return NULL; } #ifdef USE_PAM if (!AuthLoadPAM()) { return NULL; } /* * XXX PAM can blow away our syslog level settings so we need * to call Log_InitEx() again before doing any more Log()s */ #define PAM_BAIL if (pam_error != PAM_SUCCESS) { \ Log_Error("%s:%d: PAM failure - %s (%d)\n", \ __FUNCTION__, __LINE__, \ dlpam_strerror(pamh, pam_error), pam_error); \ dlpam_end(pamh, pam_error); \ return NULL; \ } PAM_username = user; PAM_password = pass; #if defined(VMX86_TOOLS) pam_error = dlpam_start("vmtoolsd", PAM_username, &PAM_conversation, &pamh); #else pam_error = dlpam_start("vmware-authd", PAM_username, &PAM_conversation, &pamh); #endif if (pam_error != PAM_SUCCESS) { Log("Failed to start PAM (error = %d).\n", pam_error); return NULL; } pam_error = dlpam_authenticate(pamh, 0); PAM_BAIL; pam_error = dlpam_acct_mgmt(pamh, 0); PAM_BAIL; pam_error = dlpam_setcred(pamh, PAM_ESTABLISH_CRED); PAM_BAIL; dlpam_end(pamh, PAM_SUCCESS); /* If this point is reached, the user has been authenticated. */ setpwent(); pwd = Posix_Getpwnam(user); endpwent(); #else /* !USE_PAM */ /* All of the following issues are dealt with in the PAM configuration file, so put all authentication/priviledge checks before the corresponding #endif below. */ setpwent(); //XXX can kill? pwd = Posix_Getpwnam(user); endpwent(); //XXX can kill? if (!pwd) { // No such user return NULL; } if (*pwd->pw_passwd != '\0') { char *namep = (char *) crypt(pass, pwd->pw_passwd); if (strcmp(namep, pwd->pw_passwd) != 0) { // Incorrect password return NULL; } // Clear out crypt()'s internal state, too. crypt("glurp", pwd->pw_passwd); } #endif /* !USE_PAM */ return pwd; }