X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fopenid.c;fp=webcit%2Fopenid.c;h=ca71d6793c51ab72ebae517599022a92d599e618;hb=8611acef7ff4213c28ad20ff755d34509870bc96;hp=0000000000000000000000000000000000000000;hpb=76a0f8571de023fe6bd20390174a2302e0a0b982;p=citadel.git diff --git a/webcit/openid.c b/webcit/openid.c new file mode 100644 index 000000000..ca71d6793 --- /dev/null +++ b/webcit/openid.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 1996-2012 by the citadel.org team + * + * This program is open source software. You can redistribute it and/or + * modify it under the terms of the GNU General Public License, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "webcit.h" +#include "webserver.h" + +/* + * Display the OpenIDs associated with an account + */ +void display_openids(void) +{ + wcsession *WCC = WC; + char buf[1024]; + int bg = 0; + + output_headers(1, 1, 1, 0, 0, 0); + + do_template("box_begin_1"); + StrBufAppendBufPlain(WCC->WBuf, _("Manage Account/OpenID Associations"), -1, 0); + do_template("box_begin_2"); + + if (WCC->serv_info->serv_supports_openid) { + + wc_printf(""); + + serv_puts("OIDL"); + serv_getln(buf, sizeof buf); + if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { + bg = 1 - bg; + wc_printf("", (bg ? "even" : "odd")); + wc_printf("\n"); + } + + wc_printf("
"); + escputs(buf); + wc_printf(""); + wc_printf("", + _("Do you really want to delete this OpenID?")); + wc_printf("%s", _("(delete)")); + wc_printf("

\n"); + + wc_printf("
\n"); + wc_printf("\n", WCC->nonce); + wc_printf(_("Add an OpenID: ")); + wc_printf("\n"); + wc_printf("" + "
\n", _("Attach")); + } + + else { + wc_printf(_("%s does not permit authentication via OpenID."), ChrPtr(WCC->serv_info->serv_humannode)); + } + + do_template("box_end"); + wDumpContent(2); +} + + +/* + * Attempt to attach an OpenID to an existing, logged-in account + */ +void openid_attach(void) { + char buf[4096]; + + if (havebstr("attach_button")) { + + syslog(LOG_DEBUG, "Attempting to attach %s\n", bstr("openid_url")); + + snprintf(buf, sizeof buf, + "OIDS %s|%s/finalize_openid_login?attach_existing=1|%s", + bstr("openid_url"), + ChrPtr(site_prefix), + ChrPtr(site_prefix) + ); + + serv_puts(buf); + serv_getln(buf, sizeof buf); + if (buf[0] == '2') { + syslog(LOG_DEBUG, "OpenID server contacted; redirecting to %s\n", &buf[4]); + http_redirect(&buf[4]); + return; + } + else { + syslog(LOG_DEBUG, "OpenID attach failed: %s\n", &buf[4]); + } + } + + /* If we get to this point then something failed. */ + display_openids(); +} + + +/* + * Detach an OpenID from the currently logged-in account + */ +void openid_detach(void) { + StrBuf *Line; + + if (havebstr("id_to_detach")) { + serv_printf("OIDD %s", bstr("id_to_detach")); + Line = NewStrBuf(); + StrBuf_ServGetln(Line); + GetServerStatusMsg(Line, NULL, 1, 2); + FreeStrBuf(&Line); + } + + display_openids(); +} + +void +InitModule_OPENID +(void) +{ + WebcitAddUrlHandler(HKEY("display_openids"), "", 0, display_openids, 0); + WebcitAddUrlHandler(HKEY("openid_attach"), "", 0, openid_attach, 0); + WebcitAddUrlHandler(HKEY("openid_detach"), "", 0, openid_detach, 0); +}