static void digestLogin(Webs *wp) { char *nonce, *opaque; assure(wp); assure(wp->route); nonce = createDigestNonce(wp); /* Opaque is unused. Set to anything */ opaque = "5ccc069c403ebaf9f0171e9517f40e41"; wp->authResponse = sfmt( "Digest realm=\"%s\", domain=\"%s\", qop=\"%s\", nonce=\"%s\", opaque=\"%s\", algorithm=\"%s\", stale=\"%s\"", BIT_REALM, websGetServerUrl(), "auth", nonce, opaque, "MD5", "FALSE"); wfree(nonce); }
/* Respond to the request by asking for a client login */ PUBLIC void httpDigestLogin(HttpConn *conn) { HttpAuth *auth; char *nonce, *opaque; auth = conn->rx->route->auth; nonce = createDigestNonce(conn, conn->http->secret, auth->realm); /* Opaque is unused, set to anything */ opaque = "799d5"; if (smatch(auth->qop, "none")) { httpSetHeader(conn, "WWW-Authenticate", "Digest realm=\"%s\", nonce=\"%s\"", auth->realm, nonce); } else { /* Value of null defaults to "auth" */ httpSetHeader(conn, "WWW-Authenticate", "Digest realm=\"%s\", domain=\"%s\", " "qop=\"auth\", nonce=\"%s\", opaque=\"%s\", algorithm=\"MD5\", stale=\"FALSE\"", auth->realm, conn->host->name, nonce, opaque); } httpSetContentType(conn, "text/plain"); httpError(conn, HTTP_CODE_UNAUTHORIZED, "Access Denied. Login required"); }