X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_auth.c;h=4c9f7d6711106df4d8b41162e30ee1186e6c2014;hb=86a4c0cc284366bbb01898a77df360278d5a8194;hp=9f2cb5a5dd18f2f99dfccaefd6dad3446cbd9383;hpb=47ceed78612d48dcda62cc2686fc527d61abe38b;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_auth.c b/src/xcb_auth.c index 9f2cb5a..4c9f7d6 100644 --- a/src/xcb_auth.c +++ b/src/xcb_auth.c @@ -37,12 +37,12 @@ #include "xcb.h" #include "xcbint.h" -#ifdef HAS_AUTH_XA1 -#include "xcb_des.h" +#ifdef HASXDMAUTH +#include #endif enum auth_protos { -#ifdef HAS_AUTH_XA1 +#ifdef HASXDMAUTH AUTH_XA1, #endif AUTH_MC1, @@ -50,75 +50,12 @@ enum auth_protos { }; static char *authnames[N_AUTH_PROTOS] = { -#ifdef HAS_AUTH_XA1 +#ifdef HASXDMAUTH "XDM-AUTHORIZATION-1", #endif "MIT-MAGIC-COOKIE-1", }; -#ifdef HAS_AUTH_XA1 - -static int next_nonce(void) -{ - static int nonce = 0; - static pthread_mutex_t nonce_mutex = PTHREAD_MUTEX_INITIALIZER; - int ret; - pthread_mutex_lock(&nonce_mutex); - ret = nonce++; - pthread_mutex_unlock(&nonce_mutex); - return ret; -} - -/* - * This code and the code it calls is taken from libXdmcp, - * specifically from Wrap.c, Wrap.h, and Wraphelp.c. The US - * has changed, thank goodness, and it should be OK to bury - * DES code in an open source product without a maze of - * twisty wrapper functions stored offshore. Or maybe - * not. --Bart Massey 2003/11/5 - */ - -static void -Wrap ( - des_cblock input, - des_cblock key, - des_cblock output, - int bytes) -{ - int i, j; - int len; - des_cblock tmp; - des_cblock expand_key; - des_key_schedule schedule; - - XCBDESKeyToOddParity (key, expand_key); - XCBDESKeySchedule (expand_key, schedule); - for (j = 0; j < bytes; j += 8) - { - len = 8; - if (bytes - j < len) - len = bytes - j; - /* block chaining */ - for (i = 0; i < len; i++) - { - if (j == 0) - tmp[i] = input[i]; - else - tmp[i] = input[j + i] ^ output[j - 8 + i]; - } - for (; i < 8; i++) - { - if (j == 0) - tmp[i] = 0; - else - tmp[i] = 0 ^ output[j - 8 + i]; - } - XCBDESEncrypt (tmp, (output + j), schedule, 1); - } -} - -#endif - static size_t memdup(char **dst, void *src, size_t len) { if(len) @@ -160,7 +97,7 @@ static Xauth *get_authptr(struct sockaddr *sockname, unsigned int socknamelen) addr = (char *) &si->sin_addr; addrlen = 4; if (ntohl(si->sin_addr.s_addr) != 0x7f000001) - family = FamilyInternet; /* 0 */ + family = XCB_FAMILY_INTERNET; snprintf(dispbuf, sizeof(dispbuf), "%d", ntohs(si->sin_port) - X_TCP_PORT); display = dispbuf; } @@ -168,7 +105,9 @@ static Xauth *get_authptr(struct sockaddr *sockname, unsigned int socknamelen) case AF_UNIX: /*block*/ { struct sockaddr_un *su = (struct sockaddr_un *) sockname; + char *sockbuf = (char *) sockname; assert(sizeof(*su) >= socknamelen); + sockbuf[socknamelen] = 0; /* null-terminate path */ display = strrchr(su->sun_path, 'X'); if (display == 0) return 0; /* sockname is mangled somehow */ @@ -193,14 +132,25 @@ static Xauth *get_authptr(struct sockaddr *sockname, unsigned int socknamelen) N_AUTH_PROTOS, authnames, authnamelens); } -#ifdef HAS_AUTH_XA1 +#ifdef HASXDMAUTH +static int next_nonce(void) +{ + static int nonce = 0; + static pthread_mutex_t nonce_mutex = PTHREAD_MUTEX_INITIALIZER; + int ret; + pthread_mutex_lock(&nonce_mutex); + ret = nonce++; + pthread_mutex_unlock(&nonce_mutex); + return ret; +} + static void do_append(char *buf, int *idxp, void *val, size_t valsize) { memcpy(buf + *idxp, val, valsize); *idxp += valsize; } #endif -static int compute_auth(XCBAuthInfo *info, Xauth *authptr, struct sockaddr *sockname) +static int compute_auth(xcb_auth_info_t *info, Xauth *authptr, struct sockaddr *sockname) { if (authname_match(AUTH_MC1, authptr->name, authptr->name_length)) { info->datalen = memdup(&info->data, authptr->data, authptr->data_length); @@ -208,8 +158,8 @@ static int compute_auth(XCBAuthInfo *info, Xauth *authptr, struct sockaddr *sock return 0; return 1; } -#ifdef HAS_AUTH_XA1 -#define APPEND(buf,idx,val) do_append((buf),&(idx),(val),sizeof(val)) +#ifdef HASXDMAUTH +#define APPEND(buf,idx,val) do_append((buf),&(idx),&(val),sizeof(val)) if (authname_match(AUTH_XA1, authptr->name, authptr->name_length)) { int j; @@ -249,7 +199,7 @@ static int compute_auth(XCBAuthInfo *info, Xauth *authptr, struct sockaddr *sock while (j < 192 / 8) info->data[j++] = 0; info->datalen = j; - Wrap (info->data, authptr->data + 8, info->data, info->datalen); + XdmcpWrap ((unsigned char *) info->data, (unsigned char *) authptr->data + 8, (unsigned char *) info->data, info->datalen); return 1; } #undef APPEND @@ -258,7 +208,7 @@ static int compute_auth(XCBAuthInfo *info, Xauth *authptr, struct sockaddr *sock return 0; /* Unknown authorization type */ } -int XCBGetAuthInfo(int fd, XCBAuthInfo *info) +int _xcb_get_auth_info(int fd, xcb_auth_info_t *info) { /* code adapted from Xlib/ConnDis.c, xtrans/Xtranssocket.c, xtrans/Xtransutils.c */