X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_auth.c;h=46c85fd70e1ecafc4610ff7f452525c30ab2311e;hb=e6132aff2fdcd0ab1ef5d7ac84a3c597dc07d370;hp=9f2cb5a5dd18f2f99dfccaefd6dad3446cbd9383;hpb=47ceed78612d48dcda62cc2686fc527d61abe38b;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_auth.c b/src/xcb_auth.c index 9f2cb5a..46c85fd 100644 --- a/src/xcb_auth.c +++ b/src/xcb_auth.c @@ -34,15 +34,23 @@ #include #include -#include "xcb.h" -#include "xcbint.h" +/* FIXME: for the moment Xdmcp.h must be included before xcb.h because + * it includes Xmd.h, but config.h (normally included from xcbint.h + * which must be included after xcb.h) must be included before Xdmcp.h. + * Ow. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif -#ifdef HAS_AUTH_XA1 -#include "xcb_des.h" +#ifdef HASXDMAUTH +#include #endif +#include "xcb.h" +#include "xcbint.h" + enum auth_protos { -#ifdef HAS_AUTH_XA1 +#ifdef HASXDMAUTH AUTH_XA1, #endif AUTH_MC1, @@ -50,75 +58,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 +105,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 = XCBFamilyInternet; snprintf(dispbuf, sizeof(dispbuf), "%d", ntohs(si->sin_port) - X_TCP_PORT); display = dispbuf; } @@ -168,7 +113,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,7 +140,18 @@ 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; @@ -208,8 +166,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 +207,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 +216,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, XCBAuthInfo *info) { /* code adapted from Xlib/ConnDis.c, xtrans/Xtranssocket.c, xtrans/Xtransutils.c */