X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fuimisc.c;h=73684d34f4f31a4dad7fffe68701128532a3ec34;hb=a9bfddfe7418e85a0df1c97c6063336ba2f09bd6;hp=4232453118ab7e1a81b636d28871b0b7f0e5efcd;hpb=b5010caaa4606ea37df9cd1334dc99fff05a8bd3;p=doldaconnect.git diff --git a/lib/uimisc.c b/lib/uimisc.c index 4232453..73684d3 100644 --- a/lib/uimisc.c +++ b/lib/uimisc.c @@ -34,7 +34,7 @@ #endif #include #include -#include +#include #ifdef HAVE_KRB5 #include @@ -79,6 +79,29 @@ struct fnetcbdata struct dc_fnetnode *dc_fnetnodes = NULL; struct dc_transfer *dc_transfers = NULL; +static void message(char *format, ...) +{ + static int on = -1; + char *v; + va_list args; + + if(on == -1) + { + on = 0; + if((v = getenv("LIBDCUI_MSG")) != NULL) + { + if(strtol(v, NULL, 0) & 1) + on = 1; + } + } + if(on == 1) + { + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + } +} + static void freelogindata(struct logindata *data) { if((data->mech != NULL) && (data->mech->release != NULL)) @@ -167,7 +190,7 @@ static void process_pam(struct dc_response *resp, struct logindata *data) data->callback(DC_LOGIN_ERR_CONV, NULL, data->data); freelogindata(data); } else { - dc_queuecmd(logincallback, data, L"pass", L"%%s", buf, NULL); + dc_queuecmd(logincallback, data, L"pass", L"%s", buf, NULL); } if(buf != NULL) { @@ -205,77 +228,6 @@ struct krb5data int valid, fwd, fwded; }; -static char *hexencode(char *data, size_t datalen) -{ - char *buf, this; - size_t bufsize, bufdata; - int dig; - - buf = NULL; - bufsize = bufdata = 0; - for(; datalen > 0; datalen--, data++) - { - dig = (*data & 0xF0) >> 4; - if(dig > 9) - this = 'A' + dig - 10; - else - this = dig + '0'; - addtobuf(buf, this); - dig = *data & 0x0F; - if(dig > 9) - this = 'A' + dig - 10; - else - this = dig + '0'; - addtobuf(buf, this); - } - addtobuf(buf, 0); - return(buf); -} - -static char *hexdecode(char *data, size_t *len) -{ - char *buf, this; - size_t bufsize, bufdata; - - buf = NULL; - bufsize = bufdata = 0; - for(; *data; data++) - { - if((*data >= 'A') && (*data <= 'F')) - { - this = (this & 0x0F) | ((*data - 'A' + 10) << 4); - } else if((*data >= '0') && (*data <= '9')) { - this = (this & 0x0F) | ((*data - '0') << 4); - } else { - if(buf != NULL) - free(buf); - return(NULL); - } - data++; - if(!*data) - { - if(buf != NULL) - free(buf); - return(NULL); - } - if((*data >= 'A') && (*data <= 'F')) - { - this = (this & 0xF0) | (*data - 'A' + 10); - } else if((*data >= '0') && (*data <= '9')) { - this = (this & 0xF0) | (*data - '0'); - } else { - if(buf != NULL) - free(buf); - return(NULL); - } - addtobuf(buf, this); - } - addtobuf(buf, 0); - if(len != NULL) - *len = bufdata - 1; - return(buf); -} - static void process_krb5(struct dc_response *resp, struct logindata *data) { int ret; @@ -297,7 +249,7 @@ static void process_krb5(struct dc_response *resp, struct logindata *data) { case 0: buf = hexencode(krb->reqbuf.data, krb->reqbuf.length); - dc_queuecmd(logincallback, data, L"pass", L"%%s", buf, NULL); + dc_queuecmd(logincallback, data, L"pass", L"%s", buf, NULL); free(buf); krb->state = 1; break; @@ -324,7 +276,7 @@ static void process_krb5(struct dc_response *resp, struct logindata *data) krb->reqbuf.data = NULL; if((ret = krb5_fwd_tgt_creds(krb->context, krb->authcon, NULL, krb->servcreds->client, krb->servcreds->server, 0, 1, &krb->reqbuf)) != 0) { - fprintf(stderr, "krb5_fwd_tgt_creds reported an error: %s\n", error_message(ret)); + message("krb5_fwd_tgt_creds reported an error: %s\n", error_message(ret)); dc_queuecmd(logincallback, data, L"pass", L"31", NULL); krb->fwd = 0; krb->state = 2; @@ -369,6 +321,11 @@ static int init_krb5(struct logindata *data) krb5_data cksum; krb5_creds creds; + if(dc_gethostname() == NULL) + { + message("cannot use krb5 without a host name"); + return(1); + } krb = smalloc(sizeof(*krb)); memset(krb, 0, sizeof(*krb)); krb->fwd = 1; @@ -376,28 +333,28 @@ static int init_krb5(struct logindata *data) data->mechdata = krb; if((ret = krb5_init_context(&krb->context)) != 0) { - fprintf(stderr, "krb5_init_context reported an error: %s\n", error_message(ret)); + message("krb5_init_context reported an error: %s\n", error_message(ret)); return(1); } if((ret = krb5_auth_con_init(krb->context, &krb->authcon)) != 0) { - fprintf(stderr, "krb5_auth_con_init reported an error: %s\n", error_message(ret)); + message("krb5_auth_con_init reported an error: %s\n", error_message(ret)); return(1); } krb5_auth_con_setflags(krb->context, krb->authcon, KRB5_AUTH_CONTEXT_DO_SEQUENCE); if((ret = krb5_sname_to_principal(krb->context, dc_gethostname(), "doldacond", KRB5_NT_SRV_HST, &krb->sprinc)) != 0) { - fprintf(stderr, "krb5_sname_to_principal reported an error: %s\n", error_message(ret)); + message("krb5_sname_to_principal reported an error: %s\n", error_message(ret)); return(1); } if((ret = krb5_cc_default(krb->context, &krb->ccache)) != 0) { - fprintf(stderr, "krb5_cc_default reported an error: %s\n", error_message(ret)); + message("krb5_cc_default reported an error: %s\n", error_message(ret)); return(1); } if((ret = krb5_cc_get_principal(krb->context, krb->ccache, &krb->myprinc)) != 0) { - fprintf(stderr, "krb5_cc_default reported an error: %s\n", error_message(ret)); + message("krb5_cc_default reported an error: %s\n", error_message(ret)); return(1); } memset(&creds, 0, sizeof(creds)); @@ -405,7 +362,7 @@ static int init_krb5(struct logindata *data) creds.server = krb->sprinc; if((ret = krb5_get_credentials(krb->context, 0, krb->ccache, &creds, &krb->servcreds)) != 0) { - fprintf(stderr, "krb5_get_credentials reported an error: %s\n", error_message(ret)); + message("krb5_get_credentials reported an error: %s\n", error_message(ret)); return(1); } /* WTF is this checksum stuff?! The Krb docs don't say a word about it! */ @@ -413,7 +370,7 @@ static int init_krb5(struct logindata *data) cksum.length = strlen(cksum.data); if((ret = krb5_mk_req_extended(krb->context, &krb->authcon, AP_OPTS_MUTUAL_REQUIRED, &cksum, krb->servcreds, &krb->reqbuf)) != 0) { - fprintf(stderr, "krb5_mk_req_extended reported an error: %s\n", error_message(ret)); + message("krb5_mk_req_extended reported an error: %s\n", error_message(ret)); return(1); } free(cksum.data); @@ -457,6 +414,12 @@ static struct authmech authmechs[] = }, #endif { + .name = L"unix", + .process = process_authless, + .init = NULL, + .release = NULL + }, + { .name = L"authless", .process = process_authless, .init = NULL, @@ -527,7 +490,7 @@ static int logincallback(struct dc_response *resp) if(authmechs[i].release != NULL) authmechs[i].release(data); data->mechdata = odata; - fprintf(stderr, "authentication mechanism %ls failed, trying further...\n", authmechs[i].name); + message("authentication mechanism %ls failed, trying further...\n", authmechs[i].name); } else { if((data->mech != NULL) && data->mech->release != NULL) { @@ -559,7 +522,7 @@ static int logincallback(struct dc_response *resp) } username = pwent->pw_name; } - dc_queuecmd(logincallback, data, L"login", data->mech->name, L"%%s", username, NULL); + dc_queuecmd(logincallback, data, L"login", data->mech->name, L"%s", username, NULL); } } } else if(!wcscmp(resp->cmdname, L"login") || !wcscmp(resp->cmdname, L"pass")) { @@ -733,6 +696,7 @@ static void delpeer(struct dc_fnetpeer *peer) free(peer->di[i].d.str); putdatum(peer->fn, peer->di[i].datum); } + free(peer->di); free(peer); } @@ -1108,9 +1072,9 @@ static int getpalistcallback(struct dc_response *resp) adddatum(fn, ires->argv[0].val.str, ires->argv[1].val.num); dc_freeires(ires); } - dc_queuecmd(getpeerlistcallback, data, L"lspeers", L"%%i", fn->id, NULL); + dc_queuecmd(getpeerlistcallback, data, L"lspeers", L"%i", fn->id, NULL); } else if(resp->code == 201) { - dc_queuecmd(getpeerlistcallback, data, L"lspeers", L"%%i", fn->id, NULL); + dc_queuecmd(getpeerlistcallback, data, L"lspeers", L"%i", fn->id, NULL); } else { data->callback(fn, resp->code, data->data); free(data); @@ -1146,7 +1110,7 @@ void dc_getpeerlistasync(struct dc_fnetnode *fn, void (*callback)(struct dc_fnet data->callback = callback; data->fnid = fn->id; data->data = udata; - dc_queuecmd(getpalistcallback, data, L"lspa", L"%%i", fn->id, NULL); + dc_queuecmd(getpalistcallback, data, L"lspa", L"%i", fn->id, NULL); } void dc_uimisc_disconnected(void)