summaryrefslogtreecommitdiff
path: root/rx/XAuth.c
diff options
context:
space:
mode:
Diffstat (limited to 'rx/XAuth.c')
-rw-r--r--rx/XAuth.c163
1 files changed, 163 insertions, 0 deletions
diff --git a/rx/XAuth.c b/rx/XAuth.c
new file mode 100644
index 0000000..89e904b
--- /dev/null
+++ b/rx/XAuth.c
@@ -0,0 +1,163 @@
+/* $Xorg: XAuth.c,v 1.4 2001/02/09 02:05:58 xorgcvs Exp $ */
+/*
+
+Copyright 1996, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABIL-
+ITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization from
+The Open Group.
+
+*/
+
+#include "RxI.h"
+#ifdef XFUNCPROTO_NOT_AVAILABLE
+#include <X11/Xfuncproto.h>
+#endif
+#include <X11/Xlib.h>
+#include <X11/extensions/security.h>
+#ifndef XFUNCPROTO_NOT_AVAILABLE
+#include <X11/Xauth.h>
+#endif
+
+static void
+printhexdigit(char *ptr, unsigned int d)
+{
+ if (d > 9)
+ d += 'A' - 10;
+ else
+ d += '0';
+
+ sprintf(ptr, "%c", d);
+}
+
+static void
+printhex(char *buffer, unsigned char *data, int len)
+{
+ char *ptr;
+ unsigned int c;
+
+ ptr = buffer;
+ while (len--) {
+ c = *data++;
+ printhexdigit(ptr++, c >> 4);
+ printhexdigit(ptr++, c & 0xf);
+ }
+ *ptr = '\0';
+}
+
+static int
+MakeAuthString(char *auth_name, char *data, int len, char **auth_ret)
+{
+ char *auth, *ptr;
+ int name_len;
+
+ name_len = strlen(auth_name);
+ /* we'll have the name + ':' + 2 characters per byte + '\0' */
+ auth = (char *) Malloc(name_len + 1 + 2*len + 1);
+ if (auth == NULL)
+ return 1;
+
+ strcpy(auth, auth_name);
+ ptr = auth + name_len;
+ *ptr++ = ':';
+ printhex(ptr, (unsigned char *)data, len);
+
+ *auth_ret = auth;
+
+ return 0;
+}
+
+int
+GetXAuth(Display *dpy, RxXAuthentication auth_name, char *auth_data,
+ Bool trusted, XID group, unsigned int timeout, Bool want_revoke_event,
+ char **auth_string_ret, XSecurityAuthorization *auth_id_ret,
+ int *event_type_base_ret)
+{
+ unsigned int trust =
+ trusted ? XSecurityClientTrusted : XSecurityClientUntrusted;
+ int dum, major_version, minor_version;
+ int status;
+ Xauth *auth_in, *auth_return;
+ XSecurityAuthorizationAttributes xsa;
+ unsigned long xsamask;
+
+ auth_return = NULL;
+ if (!XQueryExtension(dpy, "SECURITY", &dum, event_type_base_ret, &dum)) {
+ fprintf(stderr, "Warning: Cannot setup authorization as requested, \
+SECURITY extension not supported\n");
+ return 1;
+ }
+
+ if (auth_name == MitMagicCookie1) {
+ auth_in = XSecurityAllocXauth();
+ auth_in->name = "MIT-MAGIC-COOKIE-1";
+ } else {
+ fprintf(stderr,
+ "Error: Unknown authentication protocol name requested\n");
+ return 1;
+ }
+ /* auth_data is not used for now */
+
+ status = XSecurityQueryExtension(dpy, &major_version, &minor_version);
+ if (status == 0) {
+ fprintf(stderr, "Error: Failed to setup authorization\n");
+ goto error;
+ }
+
+ auth_in->name_length = strlen(auth_in->name);
+ if (auth_in->data)
+ auth_in->data_length = strlen(auth_in->data);
+
+ xsa.timeout = timeout;
+ xsa.trust_level = trust;
+ xsa.group = group;
+ xsamask = XSecurityTimeout | XSecurityTrustLevel | XSecurityGroup;
+ if (want_revoke_event == True) {
+ xsa.event_mask = XSecurityAuthorizationRevokedMask;
+ xsamask |= XSecurityEventMask;
+ }
+ auth_return = XSecurityGenerateAuthorization(dpy, auth_in, xsamask,
+ &xsa, auth_id_ret);
+ if (auth_return == 0) {
+ fprintf(stderr,
+ "Error: Failed to setup authorization, cannot create key\n");
+ goto error;
+ }
+ status = MakeAuthString(auth_in->name,
+ auth_return->data, auth_return->data_length,
+ auth_string_ret);
+ if (status != 0) {
+ fprintf(stderr,
+ "Error: Failed to setup authorization, not enough memory\n");
+ goto error;
+ }
+ XSecurityFreeXauth(auth_in);
+ XSecurityFreeXauth(auth_return);
+
+ return 0;
+
+error:
+ XSecurityFreeXauth(auth_in);
+ if (auth_return != NULL)
+ XSecurityFreeXauth(auth_return);
+
+ return 1;
+}