コード例 #1
0
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));
}
コード例 #2
0
ファイル: authPosix.c プロジェクト: nolange/pkg-open-vm-tools
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;
}