Webfinger completed. All fields there.
							parent
							
								
									774a626af6
								
							
						
					
					
						commit
						c6c547df51
					
				|  | @ -1,4 +1,13 @@ | |||
| %% db_safe_insert.hrl | ||||
| 
 | ||||
| -record(global_message, {id, activity, timestamp}). | ||||
| -record(ap_users, {id, name, email, created_at}). | ||||
| -record(ap_users, { | ||||
|     id, | ||||
|     username, | ||||
|     domain, | ||||
|     profile_url, | ||||
|     actor_url, | ||||
|     email, | ||||
|     avatar_url, | ||||
|     created_at | ||||
| }). | ||||
|  |  | |||
|  | @ -1,40 +1,50 @@ | |||
| %% webfinger_handler.erl | ||||
| %% Handler per l'endpoint /.well-known/webfinger | ||||
| -module(webfinger_handler). | ||||
| -behaviour(cowboy_handler). | ||||
| 
 | ||||
| %% Cowboy vuole che esportiamo la funzione init/2 | ||||
| -export([init/2]). | ||||
| 
 | ||||
| -include("db_safe_insert.hrl"). | ||||
| 
 | ||||
| init(Req, State) -> | ||||
|     Params = cowboy_req:parse_qs(Req), | ||||
|     Resource = proplists:get_value(<<"resource">>, Params), | ||||
| 
 | ||||
|     case Resource of | ||||
|         undefined -> | ||||
|             {ok, Resp} = cowboy_req:reply( | ||||
|                 400, | ||||
|                 #{<<"content-type">> => <<"application/json">>}, | ||||
|                 <<"{\"error\": \"Missing resource parameter\"}">>, | ||||
|                 Req | ||||
|             ), | ||||
|             {ok, Resp, State}; | ||||
|             reply_json(400, <<"Missing resource parameter">>, Req, State); | ||||
|         _ -> | ||||
|             case parse_acct(Resource) of | ||||
|                 {ok, Username, Domain} -> | ||||
|                     %% Qui interroghiamo Mnesia! | ||||
|                     case user_db:get_user(Username) of | ||||
|                         {ok, _User} -> | ||||
|                             ActorUrl = <<"https://", Domain/binary, "/users/", Username/binary>>, | ||||
|                         {ok, User} -> | ||||
|                             %% Estrai i campi dal record | ||||
|                             ProfileUrl = to_binary(User#ap_users.profile_url), | ||||
|                             ActorUrl   = to_binary(User#ap_users.actor_url), | ||||
|                             AvatarUrl  = to_binary(User#ap_users.avatar_url), | ||||
|                             Subject    = <<"acct:", Username/binary, "@", Domain/binary>>, | ||||
|                             WebfingerMap = #{ | ||||
|                                 <<"subject">> => <<"acct:", Username/binary, "@", Domain/binary>>, | ||||
|                                 <<"subject">> => Subject, | ||||
|                                 <<"aliases">> => [ProfileUrl, ActorUrl], | ||||
|                                 <<"links">> => [ | ||||
|                                     #{ | ||||
|                                         <<"rel">> => <<"self">>, | ||||
|                                         <<"type">> => <<"application/activity+json">>, | ||||
|                                         <<"href">> => ActorUrl | ||||
|                                     }, | ||||
|                                     #{ | ||||
|                                         <<"rel">> => <<"http://webfinger.net/rel/profile-page">>, | ||||
|                                         <<"type">> => <<"text/html">>, | ||||
|                                         <<"href">> => ProfileUrl | ||||
|                                     } | ||||
|                                 ] | ||||
|                                 ] ++ | ||||
|                                 (case AvatarUrl of | ||||
|                                     <<>> -> []; | ||||
|                                     _ -> [ | ||||
|                                         #{ | ||||
|                                             <<"rel">> => <<"http://webfinger.net/rel/avatar">>, | ||||
|                                             <<"type">> => <<"image/jpeg">>, | ||||
|                                             <<"href">> => AvatarUrl | ||||
|                                         } | ||||
|                                     ] | ||||
|                                 end) | ||||
|                             }, | ||||
|                             Json = jsx:encode(WebfingerMap), | ||||
|                             {ok, Resp} = cowboy_req:reply( | ||||
|  | @ -45,27 +55,23 @@ init(Req, State) -> | |||
|                             ), | ||||
|                             {ok, Resp, State}; | ||||
|                         not_found -> | ||||
|                             {ok, Resp} = cowboy_req:reply( | ||||
|                                 404, | ||||
|                                 #{<<"content-type">> => <<"application/json">>}, | ||||
|                                 <<"{\"error\": \"User not found\"}">>, | ||||
|                                 Req | ||||
|                             ), | ||||
|                             {ok, Resp, State} | ||||
|                             reply_json(404, <<"User not found">>, Req, State) | ||||
|                     end; | ||||
|                 error -> | ||||
|                     {ok, Resp} = cowboy_req:reply( | ||||
|                         400, | ||||
|                         #{<<"content-type">> => <<"application/json">>}, | ||||
|                         <<"{\"error\": \"Invalid resource format\"}">>, | ||||
|                         Req | ||||
|                     ), | ||||
|                     {ok, Resp, State} | ||||
|                     reply_json(400, <<"Invalid resource format">>, Req, State) | ||||
|             end | ||||
|     end. | ||||
| 
 | ||||
| reply_json(Status, Msg, Req, State) -> | ||||
|     {ok, Resp} = cowboy_req:reply( | ||||
|         Status, | ||||
|         #{<<"content-type">> => <<"application/json">>}, | ||||
|         jsx:encode(#{<<"error">> => Msg}), | ||||
|         Req | ||||
|     ), | ||||
|     {ok, Resp, State}. | ||||
| 
 | ||||
| %% Funzione di utilità per estrarre username e dominio da "acct:username@domain" | ||||
| %% Utility per estrarre username e dominio da "acct:username@domain" | ||||
| parse_acct(<<"acct:", Rest/binary>>) -> | ||||
|     case binary:split(Rest, <<"@">>) of | ||||
|         [Username, Domain] when Username =/= <<>>, Domain =/= <<>> -> | ||||
|  | @ -75,3 +81,8 @@ parse_acct(<<"acct:", Rest/binary>>) -> | |||
|     end; | ||||
| parse_acct(_) -> | ||||
|     error. | ||||
| 
 | ||||
| %% Utility per gestire stringhe/binary | ||||
| to_binary(undefined) -> <<>>; | ||||
| to_binary(Str) when is_list(Str) -> unicode:characters_to_binary(Str); | ||||
| to_binary(Bin) when is_binary(Bin) -> Bin. | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue