chris-website/source/nl/netsoj/chris/blog/interfaces/indieauth.d
2021-11-18 19:28:24 +01:00

93 lines
2.3 KiB
D

module nl.netsoj.chris.blog.interfaces.indieauth;
import nl.netsoj.chris.blog.interfaces.http;
import nl.netsoj.chris.blog.interfaces.micropub;
import nl.netsoj.chris.blog.microformats.parser;
import mfd = nl.netsoj.chris.blog.microformats.definitions;
import vibe.d;
struct App {
string logo;;
string name;
string url;
string clientId;
string redirectUri;
bool richInfo = false;
}
/**
* An implementation of https://www.w3.org/TR/indieauth/
*/
@translationContext!TranslateContext
class IndieAuth {
public:
this() {
m_microPub = new MicroPub();
}
@queryParam("response_type", "response_type")
@queryParam("me", "me")
@queryParam("client_id", "client_id")
@queryParam("redirect_uri", "redirect_uri")
@queryParam("state", "state")
void getAuth(HTTPServerRequest req, HTTPServerResponse res,
string response_type, string me, string client_id, string redirect_uri, string state) {
enforceHTTP(response_type == "code", HTTPStatus.badRequest);
URL source = URL(client_id);
HTTPClientResponse response = requestHTTP(source);
mfd.App[] parsedApps = parsePage!(mfd.App)(response.bodyReader.readAllUTF8, source);
App app;
app.name = client_id;
app.richInfo = false;
if (parsedApps.length > 0) {
auto parsedApp = parsedApps[0];
app.logo = parsedApp.logo;
app.name = parsedApp.name;
app.richInfo = true;
}
app.clientId = client_id;
URL redirectUrl = URL(redirect_uri);
redirectUrl.queryString = redirectUrl.queryString ~ "%scode=%s&state=%s".format(
(redirectUrl.queryString.length == 0 ? "" : "&"),
"123456", state);
app.redirectUri = redirectUrl.toString();
render!("pages/indieauth.dt", app);
}
@safe
@path("/")
void getIndex(HTTPServerResponse res) {
res.writeBody("IndieAuth root", "text/plain");
}
@safe
void postToken(HTTPServerRequest req, HTTPServerResponse res,
string grant_type, string code, string client_id, string redirect_uri, string me) {
struct OkResponse {
string access_token;
string token_type = "Bearer";
string me;
string scope_;
}
OkResponse response;
response.me = me;
response.scope_ = "foo";
response.access_token = "baz";
res.writeJsonBody(response, HTTPStatus.ok);
}
@safe @property
MicroPub micropub() { return m_microPub; };
private:
MicroPub m_microPub;
}