From 680c105e947dce342189a94a5a87c6c2d786a552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Tue, 3 Mar 2009 22:41:32 +0000 Subject: [PATCH] Improve some logging during HTSP connect / disconnect. --- access.c | 8 ++++++-- access.h | 3 ++- htsp.c | 26 +++++++++++++++++++++----- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/access.c b/access.c index 5551f52e..8e560eb7 100644 --- a/access.c +++ b/access.c @@ -79,7 +79,8 @@ access_verify(const char *username, const char *password, */ uint32_t access_get_hashed(const char *username, const uint8_t digest[20], - const uint8_t *challenge, struct sockaddr *src) + const uint8_t *challenge, struct sockaddr *src, + int *entrymatch) { struct sockaddr_in *si = (struct sockaddr_in *)src; uint32_t b = ntohl(si->sin_addr.s_addr); @@ -87,6 +88,7 @@ access_get_hashed(const char *username, const uint8_t digest[20], struct AVSHA1 *shactx = alloca(av_sha1_size); uint8_t d[20]; uint32_t r = 0; + int match = 0; TAILQ_FOREACH(ae, &access_entries, ae_link) { @@ -101,9 +103,11 @@ access_get_hashed(const char *username, const uint8_t digest[20], if(memcmp(d, digest, 20)) /* Nintendo would have use strncmp() here :) */ continue; - + match = 1; r |= ae->ae_rights; } + if(entrymatch != NULL) + *entrymatch = match; return r; } diff --git a/access.h b/access.h index 69f402ff..6815efd5 100644 --- a/access.h +++ b/access.h @@ -63,7 +63,8 @@ int access_verify(const char *username, const char *password, * */ uint32_t access_get_hashed(const char *username, const uint8_t digest[20], - const uint8_t *challenge, struct sockaddr *src); + const uint8_t *challenge, struct sockaddr *src, + int *entrymatch); /** * diff --git a/htsp.c b/htsp.c index 64108057..fb9810d9 100644 --- a/htsp.c +++ b/htsp.c @@ -541,17 +541,28 @@ htsp_authenticate(htsp_connection_t *htsp, htsmsg_t *m) const void *digest; size_t digestlen; uint32_t access; + int privgain; + int match; if((username = htsmsg_get_str(m, "username")) == NULL) return; - tvh_str_update(&htsp->htsp_username, username); - if(htsmsg_get_bin(m, "digest", &digest, &digestlen)) return; access = access_get_hashed(username, digest, htsp->htsp_challenge, - (struct sockaddr *)htsp->htsp_peer); + (struct sockaddr *)htsp->htsp_peer, &match); + + privgain = (access | htsp->htsp_granted_access) != htsp->htsp_granted_access; + + if(strcmp(htsp->htsp_username ?: "", username) || privgain) { + free(htsp->htsp_username); + tvhlog(LOG_INFO, "htsp", "%s: %suthenticated as user %s (%s)%s", + htsp->htsp_name, htsp->htsp_username ? "Rea" : "A", username, + privgain ? "Gained privileges" : "Did not gain privileges", + match ? "" : ", no match in access-list"); + htsp->htsp_username = strdup(username); + } htsp->htsp_granted_access |= access; } @@ -665,8 +676,11 @@ htsp_read_loop(htsp_connection_t *htsp) htsmsg_destroy(m); - tvhlog(LOG_INFO, "htsp", "%s: Connected as user %s", - htsp->htsp_name, htsp->htsp_username ?: ""); + + if(htsp->htsp_username == NULL) + tvhlog(LOG_INFO, "htsp", "%s: Anonymous connection", + htsp->htsp_name); + htsp_send_login_ack(htsp, NULL, !(htsp->htsp_granted_access & HTSP_PRIV_MASK)); @@ -823,6 +837,8 @@ htsp_serve(int fd, void *opaque, struct sockaddr_in *source) htsp_read_loop(&htsp); + tvhlog(LOG_INFO, "htsp", "%s: Disconnected", htsp.htsp_name); + /** * Ok, we're back, other end disconnected. Clean up stuff. */