kopia lustrzana https://github.com/cloudflare/wildebeest
				
				
				
			Merge pull request #322 from cloudflare/sven/fix-post-deletion
add auth to status deletionpull/323/head
						commit
						68bc935e1a
					
				|  | @ -45,11 +45,12 @@ export async function main(context: EventContext<Env, any, any>) { | |||
| 		return new Response('', { headers }) | ||||
| 	} | ||||
| 
 | ||||
| 	const url = new URL(context.request.url) | ||||
| 	const request = context.request | ||||
| 	const url = new URL(request.url) | ||||
| 
 | ||||
| 	if ( | ||||
| 		url.pathname === '/oauth/token' || | ||||
| 		url.pathname === '/oauth/authorize' || // Cloudflare Access runs on /oauth/authorize
 | ||||
| 		/^\/api\/v1\/statuses\/.*(?<!(reblog|favourite))$/.test(url.pathname) || // Unless private https://docs.joinmastodon.org/methods/statuses/#get
 | ||||
| 		url.pathname === '/api/v1/instance' || | ||||
| 		url.pathname === '/api/v2/instance' || | ||||
| 		url.pathname === '/api/v1/instance/peers' || | ||||
|  | @ -65,51 +66,55 @@ export async function main(context: EventContext<Env, any, any>) { | |||
| 		url.pathname.startsWith('/ap/') // all ActivityPub endpoints
 | ||||
| 	) { | ||||
| 		return context.next() | ||||
| 	} else { | ||||
| 		try { | ||||
| 			const authorization = context.request.headers.get('Authorization') || '' | ||||
| 			const token = authorization.replace('Bearer ', '') | ||||
| 	} | ||||
| 
 | ||||
| 			if (token === '') { | ||||
| 				return errors.notAuthorized('missing authorization') | ||||
| 			} | ||||
| 	if (/^\/api\/v1\/statuses\/.*(?<!(reblog|favourite))$/.test(url.pathname) && request.method === 'GET') { | ||||
| 		return context.next() | ||||
| 	} | ||||
| 
 | ||||
| 			const parts = token.split('.') | ||||
| 			const [clientId, ...jwtParts] = parts | ||||
| 	try { | ||||
| 		const authorization = request.headers.get('Authorization') || '' | ||||
| 		const token = authorization.replace('Bearer ', '') | ||||
| 
 | ||||
| 			const jwt = jwtParts.join('.') | ||||
| 
 | ||||
| 			const payload = access.getPayload(jwt) | ||||
| 			if (!payload.email) { | ||||
| 				return errors.notAuthorized('missing email') | ||||
| 			} | ||||
| 
 | ||||
| 			// Load the user associated with the email in the payload *before*
 | ||||
| 			// verifying the JWT validity.
 | ||||
| 			// This is because loading the context will also load the access
 | ||||
| 			// configuration, which are used to verify the JWT.
 | ||||
| 			// TODO: since we don't load the instance configuration anymore, we
 | ||||
| 			// don't need to load the user before anymore.
 | ||||
| 			if (!(await loadContextData(context.env.DATABASE, clientId, payload.email, context))) { | ||||
| 				return errors.notAuthorized('failed to load context data') | ||||
| 			} | ||||
| 
 | ||||
| 			const validatate = access.generateValidator({ | ||||
| 				jwt, | ||||
| 				domain: context.env.ACCESS_AUTH_DOMAIN, | ||||
| 				aud: context.env.ACCESS_AUD, | ||||
| 			}) | ||||
| 			await validatate(context.request) | ||||
| 
 | ||||
| 			const identity = await access.getIdentity({ jwt, domain: context.env.ACCESS_AUTH_DOMAIN }) | ||||
| 			if (!identity) { | ||||
| 				return errors.notAuthorized('failed to load identity') | ||||
| 			} | ||||
| 
 | ||||
| 			return context.next() | ||||
| 		} catch (err: any) { | ||||
| 			console.warn(err.stack) | ||||
| 			return errors.notAuthorized('unknown error occurred') | ||||
| 		if (token === '') { | ||||
| 			return errors.notAuthorized('missing authorization') | ||||
| 		} | ||||
| 
 | ||||
| 		const parts = token.split('.') | ||||
| 		const [clientId, ...jwtParts] = parts | ||||
| 
 | ||||
| 		const jwt = jwtParts.join('.') | ||||
| 
 | ||||
| 		const payload = access.getPayload(jwt) | ||||
| 		if (!payload.email) { | ||||
| 			return errors.notAuthorized('missing email') | ||||
| 		} | ||||
| 
 | ||||
| 		// Load the user associated with the email in the payload *before*
 | ||||
| 		// verifying the JWT validity.
 | ||||
| 		// This is because loading the context will also load the access
 | ||||
| 		// configuration, which are used to verify the JWT.
 | ||||
| 		// TODO: since we don't load the instance configuration anymore, we
 | ||||
| 		// don't need to load the user before anymore.
 | ||||
| 		if (!(await loadContextData(context.env.DATABASE, clientId, payload.email, context))) { | ||||
| 			return errors.notAuthorized('failed to load context data') | ||||
| 		} | ||||
| 
 | ||||
| 		const validatate = access.generateValidator({ | ||||
| 			jwt, | ||||
| 			domain: context.env.ACCESS_AUTH_DOMAIN, | ||||
| 			aud: context.env.ACCESS_AUD, | ||||
| 		}) | ||||
| 		await validatate(request) | ||||
| 
 | ||||
| 		const identity = await access.getIdentity({ jwt, domain: context.env.ACCESS_AUTH_DOMAIN }) | ||||
| 		if (!identity) { | ||||
| 			return errors.notAuthorized('failed to load identity') | ||||
| 		} | ||||
| 
 | ||||
| 		return context.next() | ||||
| 	} catch (err: any) { | ||||
| 		console.warn(err.stack) | ||||
| 		return errors.notAuthorized('unknown error occurred') | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Sven Sauleau
						Sven Sauleau