|
|
@@ -44,7 +44,7 @@ namespace ClankerSaddle.Api {
|
|
|
route_context.mapped_parameters.try_get("id", out id_text);
|
|
|
int64 saddle_id = int64.parse(id_text);
|
|
|
|
|
|
- if (!(yield saddles.validate_token(saddle_id, bearer_token(http_context)))) {
|
|
|
+ if ((yield resolve_bearer(http_context, saddles, saddle_id)) == null) {
|
|
|
return json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
|
|
|
@@ -129,7 +129,7 @@ namespace ClankerSaddle.Api {
|
|
|
case "done":
|
|
|
yield tasks.complete_task(task_id,
|
|
|
EntryJson.get_string_or(data, "summary", null),
|
|
|
- EntryJson.get_string_or(data, "working_branch", null), "done");
|
|
|
+ EntryJson.get_string_or(data, "working_branch", null), OUTCOME_DONE);
|
|
|
break;
|
|
|
|
|
|
case "failed":
|
|
|
@@ -263,7 +263,7 @@ namespace ClankerSaddle.Api {
|
|
|
route_context.mapped_parameters.try_get("id", out id_text);
|
|
|
int64 saddle_id = int64.parse(id_text);
|
|
|
|
|
|
- if (!(yield saddles.validate_token(saddle_id, bearer_token(http_context)))) {
|
|
|
+ if ((yield resolve_bearer(http_context, saddles, saddle_id)) == null) {
|
|
|
return SaddleUpdateEndpoint.json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
|
|
|
@@ -320,7 +320,7 @@ namespace ClankerSaddle.Api {
|
|
|
|
|
|
public virtual async HttpResult handle_request(HttpContext http_context,
|
|
|
RouteContext route_context) throws Error {
|
|
|
- if (!(yield validate_saddle_bearer(http_context, saddles))) {
|
|
|
+ if ((yield resolve_bearer(http_context, saddles)) == null) {
|
|
|
return SaddleUpdateEndpoint.json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
|
|
|
@@ -379,7 +379,7 @@ namespace ClankerSaddle.Api {
|
|
|
|
|
|
public virtual async HttpResult handle_request(HttpContext http_context,
|
|
|
RouteContext route_context) throws Error {
|
|
|
- if (!(yield validate_saddle_bearer(http_context, saddles))) {
|
|
|
+ if ((yield resolve_bearer(http_context, saddles)) == null) {
|
|
|
return SaddleUpdateEndpoint.json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
|
|
|
@@ -436,7 +436,7 @@ namespace ClankerSaddle.Api {
|
|
|
|
|
|
public virtual async HttpResult handle_request(HttpContext http_context,
|
|
|
RouteContext route_context) throws Error {
|
|
|
- if (!(yield validate_saddle_bearer(http_context, saddles))) {
|
|
|
+ if ((yield resolve_bearer(http_context, saddles)) == null) {
|
|
|
return SaddleUpdateEndpoint.json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
|
|
|
@@ -492,7 +492,7 @@ namespace ClankerSaddle.Api {
|
|
|
|
|
|
public virtual async HttpResult handle_request(HttpContext http_context,
|
|
|
RouteContext route_context) throws Error {
|
|
|
- if (!(yield validate_saddle_bearer(http_context, saddles))) {
|
|
|
+ if ((yield resolve_bearer(http_context, saddles)) == null) {
|
|
|
return SaddleUpdateEndpoint.json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
|
|
|
@@ -781,7 +781,7 @@ namespace ClankerSaddle.Api {
|
|
|
|
|
|
public virtual async HttpResult handle_request(HttpContext http_context,
|
|
|
RouteContext route_context) throws Error {
|
|
|
- var saddle = yield saddles.saddle_for_token(bearer_token(http_context));
|
|
|
+ var saddle = yield resolve_bearer(http_context, saddles);
|
|
|
if (saddle == null) {
|
|
|
return SaddleUpdateEndpoint.json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
@@ -804,7 +804,7 @@ namespace ClankerSaddle.Api {
|
|
|
|
|
|
public virtual async HttpResult handle_request(HttpContext http_context,
|
|
|
RouteContext route_context) throws Error {
|
|
|
- var saddle = yield saddles.saddle_for_token(bearer_token(http_context));
|
|
|
+ var saddle = yield resolve_bearer(http_context, saddles);
|
|
|
if (saddle == null) {
|
|
|
return SaddleUpdateEndpoint.json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
@@ -827,7 +827,7 @@ namespace ClankerSaddle.Api {
|
|
|
|
|
|
public virtual async HttpResult handle_request(HttpContext http_context,
|
|
|
RouteContext route_context) throws Error {
|
|
|
- var saddle = yield saddles.saddle_for_token(bearer_token(http_context));
|
|
|
+ var saddle = yield resolve_bearer(http_context, saddles);
|
|
|
if (saddle == null) {
|
|
|
return SaddleUpdateEndpoint.json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
@@ -864,7 +864,7 @@ namespace ClankerSaddle.Api {
|
|
|
|
|
|
public virtual async HttpResult handle_request(HttpContext http_context,
|
|
|
RouteContext route_context) throws Error {
|
|
|
- var saddle = yield saddles.saddle_for_token(bearer_token(http_context));
|
|
|
+ var saddle = yield resolve_bearer(http_context, saddles);
|
|
|
if (saddle == null) {
|
|
|
return SaddleUpdateEndpoint.json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
@@ -873,8 +873,8 @@ namespace ClankerSaddle.Api {
|
|
|
// recovered (its 15-minute safety self-ask, or it came back
|
|
|
// after the probe/guard marked it offline) and no recovery
|
|
|
// pass exists to flip the row — the ask itself does.
|
|
|
- if (((!)saddle).status == "offline") {
|
|
|
- ((!)saddle).status = "idle";
|
|
|
+ if (((!)saddle).status == SADDLE_OFFLINE) {
|
|
|
+ ((!)saddle).status = SADDLE_IDLE;
|
|
|
yield db.update_async<Saddle>(((!)saddle));
|
|
|
yield pulse.bump(0, "saddle asked (offline -> idle)");
|
|
|
print(@"[ClankerSaddle] Saddle '$(((!)saddle).name)' asked while offline; marking idle\n");
|
|
|
@@ -933,7 +933,7 @@ namespace ClankerSaddle.Api {
|
|
|
|
|
|
public virtual async HttpResult handle_request(HttpContext http_context,
|
|
|
RouteContext route_context) throws Error {
|
|
|
- var saddle = yield saddles.saddle_for_token(bearer_token(http_context));
|
|
|
+ var saddle = yield resolve_bearer(http_context, saddles);
|
|
|
if (saddle == null) {
|
|
|
return SaddleUpdateEndpoint.json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
@@ -1022,7 +1022,7 @@ namespace ClankerSaddle.Api {
|
|
|
|
|
|
public virtual async HttpResult handle_request(HttpContext http_context,
|
|
|
RouteContext route_context) throws Error {
|
|
|
- var saddle = yield saddles.saddle_for_token(bearer_token(http_context));
|
|
|
+ var saddle = yield resolve_bearer(http_context, saddles);
|
|
|
if (saddle == null) {
|
|
|
return SaddleUpdateEndpoint.json_error(401, "Missing or invalid saddle token");
|
|
|
}
|
|
|
@@ -1084,14 +1084,26 @@ namespace ClankerSaddle.Api {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * The per-saddle credential check shared by the id-less
|
|
|
- * `/api/saddle/*` endpoints (plan 10): the bearer token must belong
|
|
|
- * to a registered saddle (its row token, or a legacy api_tokens row
|
|
|
- * mapped to one) — removing the saddle revokes it.
|
|
|
+ * The ONE bearer resolution for the `/api/saddle/*` wire (plan 16
|
|
|
+ * R2, arch item 26): the `Authorization: Bearer` credential
|
|
|
+ * resolved to its saddle — null fails the call. The two auth
|
|
|
+ * styles live here together: the {id}-anchored routes (update,
|
|
|
+ * poll) pin the credential to their route's saddle
|
|
|
+ * ({@link SaddleService.validate_token} — the token must be THAT
|
|
|
+ * saddle's); the id-less routes accept whichever registered
|
|
|
+ * saddle owns the token ({@link SaddleService.saddle_for_token}
|
|
|
+ * — the row token first, then any legacy api_tokens row; removing
|
|
|
+ * the saddle revokes both).
|
|
|
*/
|
|
|
- private static async bool validate_saddle_bearer(HttpContext http_context,
|
|
|
- SaddleService saddles) throws Error {
|
|
|
- var saddle = yield saddles.saddle_for_token(bearer_token(http_context));
|
|
|
- return saddle != null;
|
|
|
+ private static async Saddle? resolve_bearer(HttpContext http_context,
|
|
|
+ SaddleService saddles, int64 anchored_saddle_id = 0) throws Error {
|
|
|
+ string token = bearer_token(http_context);
|
|
|
+ if (anchored_saddle_id > 0) {
|
|
|
+ if (yield saddles.validate_token(anchored_saddle_id, token)) {
|
|
|
+ return yield saddles.get_saddle(anchored_saddle_id);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return yield saddles.saddle_for_token(token);
|
|
|
}
|
|
|
}
|