Beispiel #1
0
static int
keychain_authenticator(
        opendirectory_secret_header ** header)
{
    char * password = NULL;
    char * account = NULL;

    account = get_admin_account();
    if (!account) {
        message("%s: no DomainAdmin account configured\n", PROGNAME);
        return EX_NOUSER;
    }

    password = get_password_from_keychain(account, strlen(account));
    if (!password) {
        free(account);
        return EX_UNAVAILABLE;
    }

    *header = calloc(1, sizeof(opendirectory_secret_header)
                        + strlen(account) + strlen(password));

    (*header)->authenticator_len = strlen(account);
    (*header)->secret_len = strlen(password);
    (*header)->signature = opendirectory_secret_sig;

    memcpy((uint8_t *)(*header) + sizeof(opendirectory_secret_header),
            account, strlen(account));
    memcpy((uint8_t *)(*header) + sizeof(opendirectory_secret_header)
                                    + strlen(account),
            password, strlen(password));

    free(password);
    free(account);
    return EX_OK;
}
Beispiel #2
0
char *passwordFor(const char *username,
				  const char *servername, Pop3 pc, int bFlushCache)
{

	password_binding p;

	assert(username != NULL);
	assert(username[0] != '\0');

	/* find the binding */
	for (p = pass_list;
		 p != NULL
		 && (strcmp(username, p->user) != 0 ||
			 strcmp(servername, p->server) != 0); p = p->next);

	/* if so, return the password */
	if (p != NULL) {
		if (p->password[0] != '\0') {
			if (bFlushCache == 0) {
				char *ret = strdup(p->password);
#ifdef HAVE_MEMFROB
				unsigned short ret_len = p->password_len;
				DEFROB(ret);
#endif
				return (ret);
			}
			/* else fall through, overwrite */
		} else if (pc) {
			/* if we've asked, but received nothing, disable this box */
			pc->checkMail = NULL;
			return (NULL);
		}
	} else {
		p = (password_binding)
			malloc(sizeof(struct password_binding_struct));
	}

	/* else, try to get it. */
	if (pc->askpass != NULL) {
		char *retval;

		p->password_len = 32;
#ifdef HAVE_APPLE_KEYCHAIN
		if (strcmp(pc->askpass, "internal:apple:keychain") == 0) {
			get_password_from_keychain(pc, username, servername,
									   p->password, &p->password_len);
		} else {
			DM(pc, DEBUG_ERROR,
			   "you could change your askpass line to:\n"
			   "    askpass = internal:apple:keychain\n"
			   "to use the OS X keychain instead of running a command\n");
#endif
			get_password_from_command(pc, username, servername,
									  p->password, &p->password_len);
#ifdef HAVE_APPLE_KEYCHAIN
		}
#endif
		retval = strdup(p->password);
		if (strlen(username) + 1 > BUF_SMALL) {
			DM(pc, DEBUG_ERROR, "username is too long.\n");
			memset(p->user, 0, BUF_SMALL);
		} else {
			strncpy(p->user, username, BUF_SMALL - 1);
		}
		if (strlen(servername) + 1 > BUF_BIG) {
			DM(pc, DEBUG_ERROR, "servername is too long.\n");
			memset(p->server, 0, BUF_BIG);
		} else {
			strncpy(p->server, servername, BUF_BIG - 1);
		}
		ENFROB(p->password);
		p->next = pass_list;
		pass_list = p;
		return (retval);
	}

	return (NULL);
}