mod_http_pep_avatar/mod_http_pep_avatar.lua
author Kim Alvefur <zash@zash.se>
Tue, 20 Dec 2022 21:48:28 +0100
changeset 5123 048e339706ba
parent 4042 02d238799537
permissions -rw-r--r--
mod_rest: Remove manual reference expansion in schema This hack was originally added to reduce the number of definitions of common attributes (type, to, from etc) and payloads (e.g. delay). This predated pointers and references, and until now was needed because parsing picked out the correct stanza kind from the schema, which broke internal references. Removing this hack paves the way for allowing the schema to be configured or customized more easily.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3429
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
     1
-- HTTP Access to PEP Avatar
2298
4915b8223b07 mod_atom: Expose Microbloging PEP data over HTTP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
-- By Kim Alvefur <zash@zash.se>
4915b8223b07 mod_atom: Expose Microbloging PEP data over HTTP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
3245
4b52cafd5811 mod_atom: Update to the new mod_pep
Kim Alvefur <zash@zash.se>
parents: 2298
diff changeset
     4
local mod_pep = module:depends"pep";
4b52cafd5811 mod_atom: Update to the new mod_pep
Kim Alvefur <zash@zash.se>
parents: 2298
diff changeset
     5
3428
6ae875c98daf mod_atom: Check whether user exists
Kim Alvefur <zash@zash.se>
parents: 3427
diff changeset
     6
local um = require "core.usermanager";
2298
4915b8223b07 mod_atom: Expose Microbloging PEP data over HTTP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
local nodeprep = require "util.encodings".stringprep.nodeprep;
3429
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
     8
local base64_decode = require "util.encodings".base64.decode;
3437
213679266dcb mod_http_pep_avatar: Redirect to prepped username
Kim Alvefur <zash@zash.se>
parents: 3429
diff changeset
     9
local urlencode = require "util.http".urlencode;
2298
4915b8223b07 mod_atom: Expose Microbloging PEP data over HTTP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
3245
4b52cafd5811 mod_atom: Update to the new mod_pep
Kim Alvefur <zash@zash.se>
parents: 2298
diff changeset
    11
module:depends("http")
2298
4915b8223b07 mod_atom: Expose Microbloging PEP data over HTTP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
module:provides("http", {
4915b8223b07 mod_atom: Expose Microbloging PEP data over HTTP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
	route = {
4042
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    14
		["GET /*"] = function (event, path)
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    15
			if path == "" then
3579
00bdecb12779 mod_http_pep_avatar: Return a message instead of 404 for base path
Kim Alvefur <zash@zash.se>
parents: 3437
diff changeset
    16
				return [[<h1>Hello from mod_http_pep_avatar</h1><p>This module provides access to public avatars of local users.</p>]];
00bdecb12779 mod_http_pep_avatar: Return a message instead of 404 for base path
Kim Alvefur <zash@zash.se>
parents: 3437
diff changeset
    17
			end;
00bdecb12779 mod_http_pep_avatar: Return a message instead of 404 for base path
Kim Alvefur <zash@zash.se>
parents: 3437
diff changeset
    18
3427
4a8fa0364f35 mod_atom: Unpack event object
Kim Alvefur <zash@zash.se>
parents: 3280
diff changeset
    19
			local request, response = event.request, event.response;
4a8fa0364f35 mod_atom: Unpack event object
Kim Alvefur <zash@zash.se>
parents: 3280
diff changeset
    20
			local actor = request.ip;
3245
4b52cafd5811 mod_atom: Update to the new mod_pep
Kim Alvefur <zash@zash.se>
parents: 2298
diff changeset
    21
4042
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    22
			local user, item_id = path:match("^([^/]+)/(%x+)$");
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    23
			if not user then user = path; end
3437
213679266dcb mod_http_pep_avatar: Redirect to prepped username
Kim Alvefur <zash@zash.se>
parents: 3429
diff changeset
    24
			local prepped = nodeprep(user);
213679266dcb mod_http_pep_avatar: Redirect to prepped username
Kim Alvefur <zash@zash.se>
parents: 3429
diff changeset
    25
			if not prepped then return 400; end
213679266dcb mod_http_pep_avatar: Redirect to prepped username
Kim Alvefur <zash@zash.se>
parents: 3429
diff changeset
    26
			if prepped ~= user then
213679266dcb mod_http_pep_avatar: Redirect to prepped username
Kim Alvefur <zash@zash.se>
parents: 3429
diff changeset
    27
				response.headers.location = module:http_url() .. "/" .. urlencode(prepped);
213679266dcb mod_http_pep_avatar: Redirect to prepped username
Kim Alvefur <zash@zash.se>
parents: 3429
diff changeset
    28
				return 302;
213679266dcb mod_http_pep_avatar: Redirect to prepped username
Kim Alvefur <zash@zash.se>
parents: 3429
diff changeset
    29
			end
3428
6ae875c98daf mod_atom: Check whether user exists
Kim Alvefur <zash@zash.se>
parents: 3427
diff changeset
    30
			if not um.user_exists(user, module.host) then
6ae875c98daf mod_atom: Check whether user exists
Kim Alvefur <zash@zash.se>
parents: 3427
diff changeset
    31
				return 404;
6ae875c98daf mod_atom: Check whether user exists
Kim Alvefur <zash@zash.se>
parents: 3427
diff changeset
    32
			end
3245
4b52cafd5811 mod_atom: Update to the new mod_pep
Kim Alvefur <zash@zash.se>
parents: 2298
diff changeset
    33
3429
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    34
			local pep_service = mod_pep.get_pep_service(user);
3276
119e22ccd64a mod_atom: Add some basic metadata to feed
Kim Alvefur <zash@zash.se>
parents: 3245
diff changeset
    35
3429
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    36
			local ok, avatar_hash, avatar_meta = pep_service:get_last_item("urn:xmpp:avatar:metadata", actor);
3276
119e22ccd64a mod_atom: Add some basic metadata to feed
Kim Alvefur <zash@zash.se>
parents: 3245
diff changeset
    37
3429
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    38
			if not ok or not avatar_hash then
3245
4b52cafd5811 mod_atom: Update to the new mod_pep
Kim Alvefur <zash@zash.se>
parents: 2298
diff changeset
    39
				return 404;
4b52cafd5811 mod_atom: Update to the new mod_pep
Kim Alvefur <zash@zash.se>
parents: 2298
diff changeset
    40
			end
3429
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    41
4042
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    42
			if (item_id or avatar_hash) == request.headers.if_none_match then
3429
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    43
				return 304;
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    44
			end
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    45
4042
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    46
			local data_ok, avatar_data = pep_service:get_items("urn:xmpp:avatar:data", actor, item_id or avatar_hash);
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    47
			if not data_ok or type(avatar_data) ~= "table" or not avatar_data[item_id or avatar_hash] then
3429
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    48
				return 404;
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    49
			end
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    50
4042
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    51
			local info = avatar_meta.tags[1]:get_child("info");
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    52
			if item_id and info.attr.id ~= item_id then
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    53
				info = nil;
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    54
				for altinfo in avatar_meta.tags[1]:childtags("info") do
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    55
					if altinfo.attr.id == item_id then
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    56
						info = altinfo;
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    57
					end
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    58
				end
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    59
			end
3429
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    60
4042
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    61
			if not info then
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    62
				return 404;
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    63
			end
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    64
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    65
			response.headers.etag = item_id or avatar_hash;
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    66
3429
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    67
			response.headers.content_type = info and info.attr.type or "application/octet-stream";
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    68
4042
02d238799537 mod_http_pep_avatar: Serve multiple avatars with a user/hash syntax
Kim Alvefur <zash@zash.se>
parents: 3579
diff changeset
    69
			local data = avatar_data[item_id or avatar_hash];
3429
461429e0db58 mod_http_pep_avatar: Provides PEP avatars via HTTP
Kim Alvefur <zash@zash.se>
parents: 3428
diff changeset
    70
			return base64_decode(data.tags[1]:get_text());
3245
4b52cafd5811 mod_atom: Update to the new mod_pep
Kim Alvefur <zash@zash.se>
parents: 2298
diff changeset
    71
		end;
4b52cafd5811 mod_atom: Update to the new mod_pep
Kim Alvefur <zash@zash.se>
parents: 2298
diff changeset
    72
	}
2298
4915b8223b07 mod_atom: Expose Microbloging PEP data over HTTP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
});