msgpack_unpacked *filter_receive_message(Filter * const filter) { msgpack_unpacker * const msgpack_unpacker = &filter->msgpack_unpacker; msgpack_unpacker_destroy(msgpack_unpacker); msgpack_unpacker_init(msgpack_unpacker, FILTER_UNPACK_BUFFER_SIZE); msgpack_unpacker_reserve_buffer(msgpack_unpacker, FILTER_READ_BUFFER_SIZE); msgpack_unpacked * const message = &filter->message; ssize_t readnb; while (msgpack_unpacker_next(msgpack_unpacker, message) == false) { assert(msgpack_unpacker_buffer_capacity(msgpack_unpacker) > 0U); readnb = safe_read_partial (filter->upipe_stdout.fd_read, msgpack_unpacker_buffer(msgpack_unpacker), msgpack_unpacker_buffer_capacity(msgpack_unpacker)); if (readnb <= (ssize_t) 0) { assert(0); return NULL; } msgpack_unpacker_buffer_consumed(msgpack_unpacker, readnb); } assert(message->data.type == MSGPACK_OBJECT_MAP); return message; }
void pw_extauth_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer) { int kindy = -1; int err; int tries = EXTAUTH_MAX_CONNECT_TRIES; ssize_t readnb; char *linepnt; char *crpoint; char sa_hbuf[NI_MAXHOST]; char sa_port[NI_MAXSERV]; char peer_hbuf[NI_MAXHOST]; char line[4096]; size_t line_len; result->auth_ok = 0; if (getnameinfo((struct sockaddr *) sa, STORAGE_LEN(*sa), sa_hbuf, sizeof sa_hbuf, sa_port, sizeof sa_port, NI_NUMERICHOST | NI_NUMERICSERV) != 0 || getnameinfo((struct sockaddr *) peer, STORAGE_LEN(*peer), peer_hbuf, sizeof peer_hbuf, NULL, (size_t) 0U, NI_NUMERICHOST | NI_NUMERICSERV) != 0) { return; } tryagain: if ((kindy = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { goto bye; } while ((err = connect(kindy, (struct sockaddr *) saddr, SUN_LEN(saddr))) != 0 && errno == EINTR); if (err != 0) { close(kindy); kindy = -1; if (tries > 0) { sleep(EXTAUTH_MAX_CONNECT_DELAY); tries--; goto tryagain; } goto bye; } if (SNCHECK(snprintf(line, sizeof line, EXTAUTH_CLIENT_ACCOUNT "%s\n" EXTAUTH_CLIENT_PASSWORD "%s\n" EXTAUTH_CLIENT_SA_HOST "%s\n" EXTAUTH_CLIENT_SA_PORT "%s\n" EXTAUTH_CLIENT_PEER_HOST "%s\n" EXTAUTH_CLIENT_ENCRYPTED "%d\n" EXTAUTH_CLIENT_END "\n", account, password, sa_hbuf, sa_port, peer_hbuf, tls_cnx != NULL), sizeof line)) { goto bye; } line_len = strlen(line); if (safe_write(kindy, line, line_len, -1) != (ssize_t) line_len) { goto bye; } result->uid = (uid_t) 0; result->gid = (gid_t) 0; result->dir = NULL; result->slow_tilde_expansion = 1; auth_finalized = 0; if ((readnb = safe_read_partial(kindy, line, sizeof line - 1U)) <= (ssize_t) 0) { goto bye; } line[readnb] = 0; linepnt = line; while ((crpoint = strchr(linepnt, '\n')) != NULL) { const ExtauthCallBack *scanned; size_t keyword_len; *crpoint = 0; scanned = extauth_callbacks; while (scanned->keyword != NULL) { keyword_len = strlen(scanned->keyword); if (strncmp(scanned->keyword, linepnt, keyword_len) == 0) { scanned->func(linepnt + keyword_len, result); break; } scanned++; } linepnt = crpoint + 1; } if (auth_finalized == 0 || (result->auth_ok == 1 && (result->uid <= (uid_t) 0 || result->gid <= (gid_t) 0 || result->dir == NULL))) { result->auth_ok = -1; } bye: if (kindy != -1) { close(kindy); } }