~james/core

core/web/src/lib/oauth-client-metadata.ts -rw-r--r-- 4.9 KiB
452f17b7 — james chore(import): snapshot james.dad.town/core at f70c71c7696a 15 hours ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
const scopes = [
	"atproto",
	"blob:*/*",
	"identity:handle",
	"repo:org.tangled.feed.comment",
	"repo:org.tangled.feed.reaction",
	"repo:org.tangled.feed.subscription",
	"repo:org.tangled.snippet.string",
	"repo:org.tangled.actor.profile",
	"repo:org.tangled.feed.star",
	"repo:org.tangled.graph.follow",
	"repo:org.tangled.graph.vouch",
	"repo:org.tangled.graph.attestation",
	"repo:org.tangled.repo.artifact",
	"repo:org.tangled.repo.declaration",
	"repo:org.tangled.key.sshKey",
	"repo:org.tangled.key.unspecced.gpgKey",
	"repo:org.tangled.git.refs",
	"repo:org.tangled.graph.collaborator",
	"repo:org.tangled.knot.member",
	"repo:org.tangled.knot.block",
	"repo:org.tangled.label.definition",
	"repo:org.tangled.repo.manifest",
	"repo:org.tangled.repo.review.unspecced.round",
	"repo:org.tangled.review.patch",
	"repo:org.tangled.track.ticket",
	"repo:org.tangled.track.unspecced.milestone",
	"rpc:com.atproto.moderation.createReport?aud=*",
	"rpc:com.atproto.repo.createRecord?aud=*",
	"rpc:com.atproto.repo.deleteRecord?aud=*",
	"rpc:com.atproto.repo.putRecord?aud=*",
	"rpc:com.atproto.repo.uploadBlob?aud=*",
	"rpc:com.atproto.server.describeServer?aud=*",
	"rpc:org.tangled.temp.account.addEmail?aud=*",
	"rpc:org.tangled.temp.account.deleteEmail?aud=*",
	"rpc:org.tangled.temp.account.listEmails?aud=*",
	"rpc:org.tangled.temp.account.setPrimaryEmail?aud=*",
	"rpc:org.tangled.temp.account.verifyEmail?aud=*",
	"rpc:org.tangled.temp.server.redeemInviteCode?aud=*",
	"rpc:com.bad-example.pocket.getPreferences?aud=*",
	"rpc:com.bad-example.pocket.putPreferences?aud=*",
	"rpc:org.tangled.temp.migrator.createTask?aud=*",
	"rpc:org.tangled.temp.migrator.describeSource?aud=*",
	"rpc:org.tangled.temp.migrator.getTask?aud=*",
	"rpc:org.tangled.temp.migrator.listTasks?aud=*",
	"rpc:org.tangled.temp.migrator.retryJob?aud=*",
	"rpc:org.tangled.temp.notification.getPreferences?aud=*",
	"rpc:org.tangled.temp.notification.getUnreadCount?aud=*",
	"rpc:org.tangled.temp.notification.listNotifications?aud=*",
	"rpc:org.tangled.temp.notification.markAllRead?aud=*",
	"rpc:org.tangled.temp.notification.markEntityRead?aud=*",
	"rpc:org.tangled.temp.notification.updatePreferences?aud=*",
	"rpc:org.tangled.temp.notification.updateSeen?aud=*",
	"rpc:org.tangled.temp.search.searchCode?aud=*",
	"rpc:org.tangled.secret.addSecret?aud=*",
	"rpc:org.tangled.secret.listSecrets?aud=*",
	"rpc:org.tangled.secret.removeSecret?aud=*",
	"rpc:org.tangled.webhook.createWebhook?aud=*",
	"rpc:org.tangled.webhook.deleteWebhook?aud=*",
	"rpc:org.tangled.webhook.listWebhookDeliveries?aud=*",
	"rpc:org.tangled.webhook.listWebhooks?aud=*",
	"rpc:org.tangled.webhook.retryWebhookDelivery?aud=*",
	"rpc:org.tangled.webhook.updateWebhook?aud=*",
	"rpc:org.tangled.temp.site.claimDomain?aud=*",
	"rpc:org.tangled.temp.site.getDomainClaim?aud=*",
	"rpc:org.tangled.temp.site.releaseDomain?aud=*",
	"rpc:org.tangled.temp.repo.disableSite?aud=*",
	"rpc:org.tangled.temp.repo.deploySite?aud=*",
	"rpc:org.tangled.temp.repo.getDeployHistory?aud=*",
	"rpc:org.tangled.temp.repo.getSiteConfig?aud=*",
	"rpc:org.tangled.temp.repo.updateSiteConfig?aud=*",
	"rpc:org.tangled.actor.getTrending?aud=*",
	"rpc:org.tangled.ci.approvePipeline?aud=*",
	"rpc:org.tangled.ci.cancelPipeline?aud=*",
	"rpc:org.tangled.ci.retryPipeline?aud=*",
	"rpc:org.tangled.event.notifyEvent?aud=*",
	"rpc:farm.tranquil.delegation.authorize?aud=*",
	"rpc:farm.tranquil.delegation.createAccount?aud=*",
	"rpc:farm.tranquil.delegation.listControlledAccounts?aud=*",
	"rpc:org.tangled.feed.getTimeline?aud=*",
	"rpc:org.tangled.foster.unmarkLiarAccount?aud=*",
	"rpc:org.tangled.graph.listNetworkVouches?aud=*",
	"rpc:org.tangled.repo.createRepo?aud=*",
	"rpc:org.tangled.repo.deleteRepo?aud=*",
	"rpc:org.tangled.repo.mintToken?aud=*",
	"rpc:org.tangled.review.submitPatch?aud=*",
	"rpc:org.tangled.git.setDefaultBranch?aud=*",
	"rpc:org.tangled.git.receivePack?aud=*"
];

export default {
	client_id: "https://tangled.org/oauth-client-metadata.json",
	client_name: "Tangled",
	client_uri: "https://tangled.org",
	redirect_uris: ["https://tangled.org/oauth/callback"],
	grant_types: ["authorization_code", "refresh_token"],
	response_types: ["code"],
	token_endpoint_auth_method: "none",
	application_type: "web",
	dpop_bound_access_tokens: true,
	scope: scopes.join(" ")
};

const rpcAnyAudience = /^rpc:(.+)\?aud=\*$/;

export const loopbackScope = (() => {
	const lxm: string[] = [];
	const rest: string[] = [];
	for (const scope of scopes) {
		const match = rpcAnyAudience.exec(scope);
		if (match) lxm.push(match[1]);
		else if (!scope.startsWith("repo:")) rest.push(scope);
	}
	return [...rest, "repo:*", `rpc?${lxm.map((nsid) => `lxm=${nsid}`).join("&")}&aud=*`].join(" ");
})();

const queryValue = (value: string) =>
	value.replace(/[%&=+# ]/g, (char) => (char === " " ? "+" : encodeURIComponent(char)));

export const loopbackClientId = (redirectUri: string, scope: string) =>
	`http://localhost?redirect_uri=${queryValue(redirectUri)}&scope=${queryValue(scope)}`;