diff src/c/openid.c @ 4:2d409aff8800

Received an OpenID authentication response, but haven't checked it yet
author Adam Chlipala <adam@chlipala.net>
date Sun, 26 Dec 2010 17:19:52 -0500
parents f59083771ee2
children 99496175078b
line wrap: on
line diff
--- a/src/c/openid.c	Sun Dec 26 15:11:23 2010 -0500
+++ b/src/c/openid.c	Sun Dec 26 17:19:52 2010 -0500
@@ -22,6 +22,8 @@
 }
 
 uw_unit uw_OpenidFfi_init(uw_context ctx) {
+  
+
   curl_global_init(CURL_GLOBAL_ALL);
 
   return uw_unit_v;
@@ -177,7 +179,7 @@
 
 const char curl_failure[] = "error\0Error fetching URL";
 
-uw_OpenidFfi_outputs uw_OpenidFfi_indirect(uw_context ctx, uw_Basis_string url, uw_OpenidFfi_inputs inps) {
+uw_OpenidFfi_outputs uw_OpenidFfi_direct(uw_context ctx, uw_Basis_string url, uw_OpenidFfi_inputs inps) {
   uw_buffer *buf = uw_malloc(ctx, sizeof(uw_buffer));
   CURL *c = curl(ctx);
   CURLcode code;
@@ -225,3 +227,52 @@
 
   return buf;
 }
+
+static uw_Basis_string deurl(uw_context ctx, uw_Basis_string s) {
+  uw_Basis_string r = uw_malloc(ctx, strlen(s)), s2 = r;
+
+  for (; *s; ++s) {
+    if (s[0] == '%' && s[1] && s[2]) {
+      unsigned u;
+
+      sscanf(s+1, "%02x", &u);
+      *s2++ = u;
+      s += 2;
+    } else
+      *s2++ = *s;
+  }
+
+  *s2 = 0;
+  return r;
+}
+
+uw_OpenidFfi_outputs uw_OpenidFfi_indirect(uw_context ctx, uw_Basis_string fields) {
+  uw_OpenidFfi_outputs b = malloc(sizeof(uw_buffer));
+
+  uw_buffer_init(BUF_MAX, b, BUF_INIT);
+
+  while (*fields) {
+    char *equal = strchr(fields, '='), *and, *s;
+
+    if (!equal)
+      break;
+
+    *equal = 0;
+    s = deurl(ctx, fields);
+    uw_buffer_append(b, s, strlen(s));
+    uw_buffer_append(b, "", 1);
+
+    and = strchr(equal+1, '&');
+    if (and) {
+      *and = 0;
+      fields = and+1;
+    } else
+      fields = and = strchr(equal+1, 0);
+    s = deurl(ctx, equal+1);
+    uw_buffer_append(b, s, strlen(s));
+    uw_buffer_append(b, "", 1);
+  }
+
+  uw_buffer_append(b, "", 1);
+  return b;
+}