cprintf("000\n");
}
-#if 0
-/*
- * Attempt to register (populate the vCard) the currently-logged-in user
- * using the data from Simple Registration Extension, if present.
- */
-void populate_vcard_from_sreg(HashList *sreg_keys) {
-
- struct vCard *v;
- int pop = 0; /* number of fields populated */
- char *data = NULL;
- char *postcode = NULL;
- char *country = NULL;
-
- if (!sreg_keys) return;
- v = vcard_new();
- if (!v) return;
-
- if (GetHash(sreg_keys, "identity", 8, (void *) &data)) {
- vcard_add_prop(v, "url;type=openid", data);
- ++pop;
- }
-
- if (GetHash(sreg_keys, "sreg.email", 10, (void *) &data)) {
- vcard_add_prop(v, "email;internet", data);
- ++pop;
- }
-
- if (GetHash(sreg_keys, "sreg.nickname", 13, (void *) &data)) {
- vcard_add_prop(v, "nickname", data);
- ++pop;
- }
-
- if (GetHash(sreg_keys, "sreg.fullname", 13, (void *) &data)) {
- char n[256];
- vcard_add_prop(v, "fn", data);
- vcard_fn_to_n(n, data, sizeof n);
- vcard_add_prop(v, "n", n);
- ++pop;
- }
-
- if (!GetHash(sreg_keys, "sreg.postcode", 13, (void *) &postcode)) {
- postcode = NULL;
- }
-
- if (!GetHash(sreg_keys, "sreg.country", 12, (void *) &country)) {
- country = NULL;
- }
-
- if (postcode || country) {
- char adr[256];
- snprintf(adr, sizeof adr, ";;;;;%s;%s",
- (postcode ? postcode : ""),
- (country ? country : "")
- );
- vcard_add_prop(v, "adr", adr);
- ++pop;
- }
-
- if (GetHash(sreg_keys, "sreg.dob", 8, (void *) &data)) {
- vcard_add_prop(v, "bday", data);
- ++pop;
- }
-
- if (GetHash(sreg_keys, "sreg.gender", 11, (void *) &data)) {
- vcard_add_prop(v, "x-funambol-gender", data);
- ++pop;
- }
-
- /* Only save the vCard if there is some useful data in it */
- if (pop > 0) {
- char *ser;
- ser = vcard_serialize(v);
- if (ser) {
- CtdlWriteObject(USERCONFIGROOM, "text/x-vcard",
- ser, strlen(ser)+1, &CC->user, 0, 0, 0
- );
- free(ser);
- }
- }
- vcard_free(v);
-}
-#endif
-
/*
* Create a new user account, manually specifying the name, after successfully
/* Now, if this logged us in, we have to attach the OpenID */
if (CC->logged_in) {
attach_openid(&CC->user, oiddata->claimed_id);
- if (oiddata->sreg_keys != NULL) {
- /* populate_vcard_from_sreg(oiddata->sreg_keys); */
- }
}
}
/*
- * Attempt to auto-create a new Citadel account using the nickname from Simple Registration Extension
+ * Attempt to auto-create a new Citadel account using the nickname from Attribute Exchange
*/
-int openid_create_user_via_sreg(StrBuf *claimed_id, HashList *sreg_keys)
+int openid_create_user_via_ax(StrBuf *claimed_id, HashList *sreg_keys)
{
- char *desired_name = NULL;
+ char *nickname = NULL;
+ char *firstname = NULL;
+ char *lastname = NULL;
char new_password[32];
long len;
+ const char *Key;
+ void *Value;
if (config.c_auth_mode != AUTHMODE_NATIVE) return(1);
if (config.c_disable_newu) return(2);
if (CC->logged_in) return(3);
- if (!GetHash(sreg_keys, "sreg.nickname", 13, (void *) &desired_name)) return(4);
- syslog(LOG_DEBUG, "The desired account name is <%s>", desired_name);
+ HashPos *HashPos = GetNewHashPos(sreg_keys, 0);
+ while (GetNextHashPos(sreg_keys, HashPos, &len, &Key, &Value) != 0) {
+ syslog(LOG_DEBUG, "%s = %s", Key, (char *)Value);
+
+ if (cbmstrcasestr(Key, "value.nickname") != NULL) {
+ nickname = (char *)Value;
+ }
+ else if ( (nickname == NULL) && (cbmstrcasestr(Key, "value.nickname") != NULL)) {
+ nickname = (char *)Value;
+ }
+ else if (cbmstrcasestr(Key, "value.firstname") != NULL) {
+ firstname = (char *)Value;
+ }
+ else if (cbmstrcasestr(Key, "value.lastname") != NULL) {
+ lastname = (char *)Value;
+ }
- len = cutuserkey(desired_name);
- if (!CtdlGetUser(&CC->user, desired_name)) {
- syslog(LOG_DEBUG, "<%s> is already taken by another user.", desired_name);
+ }
+ DeleteHashPos(&HashPos);
+
+ if (nickname == NULL) {
+ if ((firstname != NULL) || (lastname != NULL)) {
+ char fullname[1024] = "";
+ if (firstname) strcpy(fullname, firstname);
+ if (firstname && lastname) strcat(fullname, " ");
+ if (lastname) strcat(fullname, lastname);
+ nickname = fullname;
+ }
+ }
+
+ if (nickname == NULL) {
+ return(4);
+ }
+ syslog(LOG_DEBUG, "The desired account name is <%s>", nickname);
+
+ len = cutuserkey(nickname);
+ if (!CtdlGetUser(&CC->user, nickname)) {
+ syslog(LOG_DEBUG, "<%s> is already taken by another user.", nickname);
memset(&CC->user, 0, sizeof(struct ctdluser));
return(5);
}
/* The desired account name is available. Create the account and log it in! */
- if (create_user(desired_name, len, 1)) return(6);
+ if (create_user(nickname, len, 1)) return(6);
+ /* Generate a random password.
+ * The user doesn't care what the password is since he is using OpenID.
+ */
snprintf(new_password, sizeof new_password, "%08lx%08lx", random(), random());
CtdlSetPassword(new_password);
+
+ /* Now attach the verified OpenID to this account. */
attach_openid(&CC->user, claimed_id);
- /* populate_vcard_from_sreg(sreg_keys); */
+
return(0);
}
struct xrds xrds;
int return_value = 0;
- /* syslog(LOG_DEBUG, "XRDS document:\n%s\n", ChrPtr(ReplyBuf)); */
-
memset(&xrds, 0, sizeof (struct xrds));
xrds.selected_service_priority = INT_MAX;
xrds.CharData = NewStrBuf();
}
-
/*
* Callback function for perform_openid2_discovery()
* We're interested in the X-XRDS-Location: header.
StrBufAppendBufPlain(RedirectUrl, HKEY("&openid.identity="), 0);
StrBufUrlescAppend(RedirectUrl, oiddata->claimed_id, NULL);
- /* return_to completes the round trip */
+ /* return_to tells the provider how to complete the round trip back to our site */
StrBufAppendBufPlain(RedirectUrl, HKEY("&openid.return_to="), 0);
StrBufUrlescAppend(RedirectUrl, return_to, NULL);
HashPos *HashPos = GetNewHashPos(keys, 0);
while (GetNextHashPos(keys, HashPos, &len, &Key, &Value) != 0) {
- syslog(LOG_DEBUG, "%s = %s", Key, (char *)Value);
if (strcasecmp(Key, "mode")) {
char k_o_keyname[1024];
snprintf(k_o_keyname, sizeof k_o_keyname, "openid.%s", (const char *)Key);
);
}
}
+ DeleteHashPos(&HashPos);
curl = ctdl_openid_curl_easy_init(errmsg);
curl_easy_setopt(curl, CURLOPT_URL, ChrPtr(oiddata->op_url));
}
/*
- * New user whose OpenID is verified and Simple Registration Extension is in use?
+ * New user whose OpenID is verified and Attribute Exchange gave us a name?
*/
- else if (openid_create_user_via_sreg(oiddata->claimed_id, keys) == 0) {
+ else if (openid_create_user_via_ax(oiddata->claimed_id, keys) == 0) {
cprintf("authenticate\n%s\n%s\n", CC->user.fullname, CC->user.password);
logged_in_response();
syslog(LOG_DEBUG, "Successfully auto-created new user");