X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fstatus.c;h=edf744664038965aeb0fffd3f673b587d198d64c;hb=130d356c840ea83c31c4724c8ae92660360eb07b;hp=bdee676dcfe646c62900db4043d9eabf8d03b845;hpb=33c70ce1349f3e7fcbc5776785f34f3bd89f1d92;p=netatalk.git diff --git a/etc/afpd/status.c b/etc/afpd/status.c index bdee676d..edf74466 100644 --- a/etc/afpd/status.c +++ b/etc/afpd/status.c @@ -95,7 +95,7 @@ static void status_flags(char *data, static int status_server(char *data, const char *server, const struct afp_options *options) { char *start = data; - char *Obj, *Type, *Zone; + char *Obj; char buf[32]; uint16_t status; size_t len; @@ -311,39 +311,6 @@ static size_t status_netaddress(char *data, int *servoffset, return (data - begin); } -static bool append_directoryname(char **pdata, - size_t offset, - size_t *size, - char* DirectoryNamesCount, - size_t len, - char *principal) -{ - if (sizeof(uint8_t) + len > maxstatuslen - offset - *size) { - LOG(log_error, logtype_afpd, - "status:DirectoryNames: out of space for principal '%s' (len=%d)", - principal, len); - return false; - } else if (len > 255) { - LOG(log_error, logtype_afpd, - "status:DirectoryNames: principal '%s' (len=%d) too long (max=255)", - principal, len); - return false; - } - - LOG(log_info, logtype_afpd, - "DirectoryNames[%d]=%s", - *DirectoryNamesCount, principal); - - *DirectoryNamesCount += 1; - char *data = *pdata; - *data++ = len; - strncpy(data, principal, len); - - *pdata += len + 1; - *size += sizeof(uint8_t) + len; - - return true; -} /** * DirectoryNamesCount offset: uint16_t @@ -354,7 +321,7 @@ static bool append_directoryname(char **pdata, static size_t status_directorynames(char *data, int *diroffset, const DSI *dsi _U_, - const struct afp_options *options _U_) + const struct afp_options *options) { char *begin = data; uint16_t offset; @@ -363,128 +330,14 @@ static size_t status_directorynames(char *data, offset = ntohs(offset); data += offset; - char *DirectoryNamesCount = data++; - char *DirectoryNames = data; - size_t size = sizeof(uint8_t); - *DirectoryNamesCount = 0; - - if (!uam_gss_enabled()) - goto offset_calc; - -#ifdef HAVE_KERBEROS - krb5_context context; - krb5_error_code ret; - const char *error_msg; - - if (krb5_init_context(&context)) { - LOG(log_error, logtype_afpd, - "status:DirectoryNames failed to intialize a krb5_context"); - goto offset_calc; - } - - krb5_keytab keytab; - if ((ret = krb5_kt_default(context, &keytab))) - goto krb5_error; - - // figure out which service principal to use - krb5_keytab_entry entry; - char *principal; - if (options->k5service && options->fqdn && options->k5realm) { - LOG(log_debug, logtype_afpd, - "status:DirectoryNames: using service principal specified in options"); - - krb5_principal service_principal; - if ((ret = krb5_build_principal(context, - &service_principal, - strlen(options->k5realm), - options->k5realm, - options->k5service, - options->fqdn, - NULL))) - goto krb5_error; - - // try to get the given service principal from keytab - ret = krb5_kt_get_entry(context, - keytab, - service_principal, - 0, // kvno - wildcard - 0, // enctype - wildcard - &entry); - if (ret == KRB5_KT_NOTFOUND) { - krb5_unparse_name(context, service_principal, &principal); - LOG(log_error, logtype_afpd, - "status:DirectoryNames: specified service principal '%s' not found in keytab", - principal); - // XXX: should this be krb5_xfree? -#ifdef HAVE_KRB5_FREE_UNPARSED_NAME - krb5_free_unparsed_name(context, principal); -#else - krb5_xfree(principal); -#endif - goto krb5_cleanup; - } - krb5_free_principal(context, service_principal); - if (ret) - goto krb5_error; + if (!uam_gss_enabled() || !options->k5principal) { + *data = 0; + data++; } else { - LOG(log_debug, logtype_afpd, - "status:DirectoryNames: using first entry from keytab as service principal"); - - krb5_kt_cursor cursor; - if ((ret = krb5_kt_start_seq_get(context, keytab, &cursor))) - goto krb5_error; - - ret = krb5_kt_next_entry(context, keytab, &entry, &cursor); - krb5_kt_end_seq_get(context, keytab, &cursor); - if (ret) - goto krb5_error; + memcpy(data, options->k5principal, options->k5principal_buflen); + data += options->k5principal_buflen; } - krb5_unparse_name(context, entry.principal, &principal); - krb5_kt_free_entry(context, &entry); - - append_directoryname(&data, - offset, - &size, - DirectoryNamesCount, - strlen(principal), - principal); - - free(principal); - goto krb5_cleanup; - -krb5_error: - if (ret) { - error_msg = krb5_get_error_message(context, ret); - LOG(log_note, logtype_afpd, "Can't get principal from default keytab: %s", - (char *)error_msg); -#ifdef HAVE_KRB5_FREE_ERROR_MESSAGE - krb5_free_error_message(context, error_msg); -#else - krb5_xfree(error_msg); -#endif - } - -krb5_cleanup: - krb5_kt_close(context, keytab); - krb5_free_context(context); -#else - if (!options->k5service || !options->fqdn || !options->k5realm) - goto offset_calc; - - char principal[255]; - size_t len = snprintf(principal, sizeof(principal), "%s/%s@%s", - options->k5service, options->fqdn, options->k5realm); - - append_directoryname(&data, - offset, - &size, - DirectoryNamesCount, - strlen(principal), - principal); -#endif // HAVE_KERBEROS - -offset_calc: /* Calculate and store offset for UTF8ServerName */ *diroffset += sizeof(uint16_t); offset = htons(data - begin); @@ -501,7 +354,7 @@ static size_t status_utf8servername(char *data, int *nameoffset, uint16_t namelen; size_t len; char *begin = data; - uint16_t offset, status; + uint16_t offset; memcpy(&offset, data + *nameoffset, sizeof(offset)); offset = ntohs(offset); @@ -613,10 +466,7 @@ void status_init(AFPObj *obj, DSI *dsi) status_machine(status); status_versions(status, dsi); status_uams(status, options->uamlist); - if (options->flags & OPTION_CUSTOMICON) - status_icon(status, icon, sizeof(icon), c); - else - status_icon(status, apple_atalk_icon, sizeof(apple_atalk_icon), c); + status_icon(status, icon, sizeof(icon), c); sigoff = status_signature(status, &c, options); /* c now contains the offset where the netaddress offset lives */ @@ -630,10 +480,6 @@ void status_init(AFPObj *obj, DSI *dsi) if ( statuslen < maxstatuslen) statuslen = status_utf8servername(status, &c, dsi, options); - if ((options->flags & OPTION_CUSTOMICON) == 0) { - status_icon(status, apple_tcp_icon, sizeof(apple_tcp_icon), 0); - } - dsi->signature = status + sigoff; dsi->statuslen = statuslen; } @@ -652,7 +498,7 @@ void set_signature(struct afp_options *options) { char *servername_conf; int header = 0; char buf[1024], *p; - FILE *fp = NULL, *randomp; + FILE *fp = NULL; size_t len; char *server_tmp;