From 5803c937c436b498214314cc8d87857e1c88c851 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 15 Feb 2022 19:34:17 +0000 Subject: [PATCH 01/10] Smaller icon --- theme/zen/icons/showhide.png | Bin 1471 -> 9500 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/theme/zen/icons/showhide.png b/theme/zen/icons/showhide.png index 143701e29aa6f48123689e32c41ba14428d96cb5..ed36fd7971edbb351d906998fb14087cb48e0f21 100644 GIT binary patch literal 9500 zcmeHtXHb(()OP5Ifb=3QG-(DxC!u$cUX@N75PAuO-b4gNdR3%@pmY!rlp-J?y(mgo zI#LvnA_#Br>GQpRo|*6c_hcr?-n-Yi&N1RZeH&i9 z@dFwcwc0~a(0iGxz${+0j0QgUBJ+w$?mG-$aUqdE> zw^z*?x9U$~+uC-2z&(jhJE{Kk0IOruT`tHI9@C_nH*l7FuCUT})HmlqYf|=N+4VRU zBsCvkytOyJW9PW|Gbn8Agy#Hgqxm?v!$;sNQ%>0X)7JCF<`dS1fHgTCJ95+2lh;Q- z?l8=M`yx&7N}B9p(rRBIiSv$9hoVRmHvH^*|B88kh7Qw7fHj9u+3>kWn92)880GF( z8v=G{{u%x?l!WnmSV+t;VdUB2wf&Q#J@3yCge7wBQtfEGPM?UwI)XH7 z!L%x9FYEJmP{{5u3VdIwC{dMDB9*S@9)RW81kQUmkW8Q?)myNvBt4K4vXbf}Y_Tw@ z!(UUBtRwKee$1t`rsSbZ*}Dnzpgj;EzHHgt(yikAke)0zR$(?kb*D1{{8@`TL2SdR z&|u8*O_oCr%3OSUv%jjkJvQy8h41rsjnhSA@v>Vl`zu?vLbaaL>dUP!ndr-J?GKki z_M*Ofw6(EI9#Tt&aTiOc50`!$HCBlBj7%xYq!#61qZYXbxU@wtZeFecJ&DeaH&1H8G(r4DnXLwr{zxicDyr;e_1wF+a7y9Nc z@3OcimUml{F)KL!G9p^JGUc<&N=-t-(z-2qZPtUwcq4;e47a+T2doG$V$>Eai^Z+q z3SB9s!^HP*fj6$&f8StpV;cAL@<B*ij7L=`63%XjN5LDlu6Ph~} z7AnzppwTAA`*3n9ByG{y#@9H?WoXpgtuU|-ulkLCpjAQf(<|>9Y#u(T)of|T=ogaj z_-4Sf)RrZ%WS?Z(!z;1#4a_b(p8|E0YwYeksNzZ8fc(aUv`}i+beLEl~0PoJ;kdoAV;Hu z)pjZJ*C!+<#;_B5E4D*_J!(N7Yz^z;wP&0`&pVHsvrSQ!{hD z*NuL?CBTU`Ogbo+6EF13=-MTE6CK!YvFl`bxXgQ?!6*SWSI)?f%^H2(g+5yMzDY4enPF=V@__2e9LHEHm-LwQ_*mcV++W6gyVpM~Y z#U;(RNzPG^>$yJ-#cW=ETTEPZui-(kD#EaP$!$Hz_euo;;|j2yG8KnsOtmvN~|%a4F~EBfaZ5K%0xUswbG2N z$xI$YFMu}dP$iuxGsUDbkqIT;UOJrnJoE6D31Or*G)twg;zaKafqE(30jes6@k8Yn zA47Ra$|$>>Bej1uW%Yxkv6&(2$L2|*3gV1jA0O-Fm5jLgQLbj{+#UCn40TAZ?)Ku= z8C4_D7^I;G8!(e!rza$p0aLi^tcyPww2cKPVSWy1k4Oc8XW5mi6ihxxOe(?hG^g9i zYa(j44PmJi=4)iqE59cdFe@$I=@EDrK{F6 z#zJ;Ur9bFgN`gtuur>$e!pd1-$Ev7!a(f6w&#rXM$Ase!yWh7AW9M@~nlV*zt!nr^ zWsjR+Zd+3{ixa+SHvb(wDXfD>#LiuTtn~!J$x{T{PIQ4KKcGuVSy^pjkeitJFssN+ z;wA;yk&9b0uh&`>;FYs=&E8x{=~_ncXw0ch8AvV2ZR~JD;wjXMU~VfhUOtSI{b7u2 z5cL&Ty3xAr&um#n%855dy`JD{?UNSFe>I`qlxkVu`RrXTr6-RTXM)c7cBQx}+a6mniLFAwmLD8c2MlO$T1e zH|nGVnH1Ne?WQw-&fqHoR#E|CmLW4c@y8Lgfln5U+~lJK-nz9r5Xn5f%)>fnfDdn% z2EXxU%8SUc_RO4!+4XFxWD_v4QdHP~M*#{S5%wXJGU@E-Sm@l#M?Tkl9QEGIji-#g8=c z^onRqmzTbGIU%6ZqhsUcQ1{dqn2NVhKzT**GTI$#L7-lx!`fRjv#2H1D@AMjIc~anjP3)EFjrGr}6t zOH+CsG+?cTksFL6M&pb5P%859&odq{h0Rq zGh%uP){nB;DI!aDO2HNRhVVS9=YB+cPB!jQQX`Z$756(_!n;C?DhthFx)+*x=Hqy^p( zcvIWhcSCl92-|wC^JCE>;X-t=$INXt3&U?UL5JFDoC$3omg0?ud-A6a)p=f7R8sY>Zc)5Z=TYn z)JndtOi&06?}-?pvl6AAYalnbi-PVktgon5Bmv-dAdK zN#zk`CDm58Pr6r*y|j>Lj(Z1d*GK4`3dt$RiR}$a3Dqfxn?6Pv9BfzzE<*^N#M-^K{u#BOKgbuN3wQN<6!q|UvwWi1{HU0kv4XM1MOGyM8n>uHV+_OB56$-Vx|(x;~|NP*=iQjkj&7 zlyIV|xaIPecO1M-G#ima%PVV&2VBKhA_-Hx#(W=@9!10yEt2X_2Z zz!%;xynJ0M<*Q^fa&SQQYp##uFF=IN3-}!!nC*@)-k$c z_0|h-@=lj3qwG8ecW#AywD{|;sdRjiwBM66f6`~qXxR&m-CCJ)8P-<|+mfWuY-nv< zMpgyw-ntK&(bO(0DD9XwvjGD(Z_D!Fk^AM*g&0MVD-{*&)-@yb0!{R^V&)e6KAuQ% zQqzr7j~Qk-F1eH`Uu}5z(r{6;)o}3x(NeTk0liKQZ=WA0MI$$6k!x^JT-UWA=hKbr z5To%IMga-zp2UfVxvVN`dveDV&%X*V$e~=U0?i_afYS7xL5V#l?9rSbql}=GdskT5 z?mZsvAY4!)VO%V{l5qdN>nq)p?mqRC&r9%1|3-yv`;*xpX787$O>+{{bbpj5tFfEb z#X`9YQQ#O~(1zxn zXE}i?4m*JfJ;>VIN_K)lm&z|q%X94cB%VaKY+nDcH$xFI^2u)ZL;C*HX}~sjU1f9k zz%p@i)6H3x^zEn9VsUBAG=_j-g*H-bs&S=fYDt4!uHgvwC9H(TBvD&uG zMA==t>Z`Ynr-rQ`YNELpGw*-laW3EJ2WmZ8%~gNf|C!X~b*QI72p;b%hI#FeUZZ`V z4JvI>(ySfVs;jD1kEo7<0MyxM3LxUs*yBa-^OC7Sj*JuOckZnqEHZyXUeCaZ9fl84 z_g660+lLW%n`YCOrXWI3zBYy-K?3daF8SI zkg$V>iwD`-LjqN|7fSe?4YbMnY<#zWrr^hy z`G<;7dp}}P9iH8ItLJ$;rR%z~^Mg%K9xu+IETt)YkXmHO3l|l6nwiE?toglA z?2S{Ei=*Rctnm#(t5tNSbI_IEqT|%K7Ne^P| zZz_6Lo7ppqvCt2xRG7+T5>;o!j^Mxh@WaRVCG`3B(v45GAZLkM-*;LZ8`CkCkAn2? zZtg7;zQ-o?Sa9YsBlDL_4ePn1gbsJcXk2(AS8P7~j7it9dCLZ~u=sw!8ak zr4(Iv=|f;pxhcb3oz4$Q$^Ae+KS*uL*UsE*Hx_lfC#)%!j_ZAPZl_{`Stmq=Dh6ir zi={4#oEtyj#F->(rMdEp<4R-e@9nk<6J*MQBnsvaS%MlPcr4<;_g&y97PB0b964u@ zn6dZIo{FuoV2SwEE+_1F>DYn^HNW#-Tjg1h~I(=kZNK5obI8zEvGFSC#8f zlUBQ@@R3rV72NYNS)ZTmJ&hZ+&!^{lcFUej@iwcz5MwR4iU9gXwo>xsm*)tUSSSU8 zTfz;een=%a>q#5rQ2oqW4q_k7b;>^{-}j&-R07FNor*9&sr_vKawH7^z>7kwsv2sm zs{V0Bin|!i4oQ;N>QrLwwlgW_N~7EYa%JX2E%*gLmzwdb+%Xoa->~;yXOuu|8C$aw zO-A14xNkO<|lG&ou7El5g?JovOww>Ir9A(}TUQ z=MmEN8$eU9+!zG=;Pl#~%Q zG^nbemn~H-jbX#}CntFETHdv!m@_)uRrXah?#lX>o-P#O;U)}2dcaY_{%)SQD{TNk zPSM{JhHyb)fN+!}+FhP&r=^Vxh(^kD-IUY=>v^i8oX}c<-YAnmeN#lB3j%`VQdA(5 z^M~RH+)x-8(BI9~-3RI~&-IHJifdnVi*NydK`<`zT(|TLfvO(fD4>L}gfJMS?vM5p z<5D04%6TIlpvGz%zf<6z|`2@IQ zVE!O?AMOi^-#FAzJ_v8LCkE}|4!q!m!99F2@?2cFao`{Exq0g8{Ymfc^ScT-Jw*Ir zo+6^cU=cSrk-uB`VATC^B) zU+EwbA}Cjs8xHD&^D6oemzvsohJRXINZ^Qe^ZaFn6Z;=X4BFu@vHlU;#mKL8{vHU< z{7>G0p#RAI7Z``q(}SvcAbc;v(^iw`y6_K0dLYn9=&z7w0z{r?&;MZ2L)Ft7_XMWrMpAd=!z65>*lq7sr)e}T+V-afcWyxDLdja#btvlpkLVl z`F}|%@J}?>33Z_p7`L{;VjxjTQ&9+1TmlLf7XpK!U@(`+?+J@stm;29mJ|7ZG?DuS z_}eysv-_A9}!1|L5di>HD8t|H<{Q6!=%*|ElXh zx&D;`{|fwHb^U*ni|nrh56T_)D+r4_&Im5eJ;5D?E*a{Ys{c9^0UGjS7>2h#;2!WW z#`-1zrIio3fA;|J;5wRWfEXe+tqZuPmW2-haGCbvjR$y`&4lYD!D#ELldRxhq2(f= ztYK-!b=7IBDVxglZ>5M*c7n+Xh#myqvnzX1MJ2`@jM}VM0^Jq1M6S_LvQs9N8`k$$ z^c(Yye74f+7ulC!B$}dTEiV}-h+$OqVMW3zoCtfCKL>WkZpz>0?!H2kTxe#8kU^1Ytm5` zntCf=^6p!eXGTYKMH9toB;8H#K4}wiw+Q{Bx#g4kDDCjU{6k#$0Bv=BwMrHH$o~N) Cpnail0l`e@Dk=BBynH;%s|ew!os++DEvrdk13#A5zkB@ z$jj^9eT>h40=JhCZUxO_jSX;mZ1F&ARER-k21?Ya(xkEb zMhz(@9&G5D8-OgEi*ey5i&I*SCYu!L;$YTz1mH`5!jD{NuUqzdjT|d?f-4h(E$lyR z;jbotrG+`$l8B-|v_f9IDi>)ia_b5&0HJwt(=G7bF8uMSeo(3)s9R>o3)Xm?Ar7UF z+LFy#;HT)%uY!X0D*zp#so4XgUg^OSh)RK!8FQwGVp<2axl6}3(Q~)%z4SUL4D1vm4IO#d@KHv8ov5`bGfka&+VojweNeloerdlzjV@}u zNi9EnP=hs?-63dgC%Tw{7$*X8TLe(hyqHC&lz5R_%wl1D6v{|a7n{&&5d*?Bh;`C~ z-3Pg!;uh3@iW~nOxvg-g>Y`1(d+M;$q8K#sV^UgJL~ z@58?h@DB72^bYh6^bYh6^bYiY2sH8cp@csHboQNn^K@B}0004nlSmaDe_N$0Ee>{2 zamY{|#Db`ZqgJ5^6+*4hs)Na;U(lo>NpW!$Tni3(i|qi@OreYZf*n%i4*AEysMnz~Bf00)P_NP)7~J>K2b-rK)tn*IF%W~_3epi7wJ z00006P)t-s0002C2BC;B%e~i=4G%E^rZh2fB&YrJjNej!!L+*>apHc z6A%Ch5 Date: Wed, 16 Feb 2022 10:14:29 +0000 Subject: [PATCH 02/10] Handle different users path for vcard --- daemon.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daemon.py b/daemon.py index 46e64f2fb..3cc21070d 100644 --- a/daemon.py +++ b/daemon.py @@ -1202,6 +1202,8 @@ class PubServer(BaseHTTPRequestHandler): return False if 'application/' in accept_str: return False + if path.startswith('/@'): + path = path.replace('/@', '/users/', 1) if not path.startswith('/users/'): self._400() return True From 41f1818cda217df5401897b1e9c18abc25af1b1d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 16 Feb 2022 10:24:04 +0000 Subject: [PATCH 03/10] Add vcard to webfinger --- webfinger.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/webfinger.py b/webfinger.py index ab0e5e819..440d96b3e 100644 --- a/webfinger.py +++ b/webfinger.py @@ -171,6 +171,11 @@ def create_webfinger_endpoint(nickname: str, domain: str, port: int, "rel": "http://webfinger.net/rel/profile-page", "type": "text/html" }, + { + "href": profile_page_href, + "rel": "http://webfinger.net/rel/profile-page", + "type": "text/vcard" + }, { "href": person_id, "rel": "self", @@ -280,7 +285,7 @@ def webfinger_lookup(path: str, base_dir: str, return wf_json -def _webfinger_updateAvatar(wf_json: {}, actor_json: {}) -> bool: +def _webfinger_update_avatar(wf_json: {}, actor_json: {}) -> bool: """Updates the avatar image link """ found = False @@ -307,6 +312,20 @@ def _webfinger_updateAvatar(wf_json: {}, actor_json: {}) -> bool: return True +def _webfinger_update_vcard(wf_json: {}, actor_json: {}) -> bool: + """Updates the vcard link + """ + for link in wf_json['links']: + if link['type'] == 'text/vcard': + return False + wf_json['links'].append({ + "href": actor_json['url'], + "rel": "http://webfinger.net/rel/profile-page", + "type": "text/vcard" + }) + return True + + def _webfinger_add_blog_link(wf_json: {}, actor_json: {}) -> bool: """Adds a blog link to webfinger if needed """ @@ -412,7 +431,10 @@ def _webfinger_updateFromProfile(wf_json: {}, actor_json: {}) -> bool: wf_json['aliases'].remove(full_alias) changed = True - if _webfinger_updateAvatar(wf_json, actor_json): + if _webfinger_update_avatar(wf_json, actor_json): + changed = True + + if _webfinger_update_vcard(wf_json, actor_json): changed = True if _webfinger_add_blog_link(wf_json, actor_json): From a21aad95110bdccecede5093a9a74ec4ef58b31d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 16 Feb 2022 11:10:44 +0000 Subject: [PATCH 04/10] xml vcard format --- daemon.py | 10 +++++-- epicyon.py | 18 +++++++++++- pgp.py | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++- session.py | 7 ++++- 4 files changed, 110 insertions(+), 5 deletions(-) diff --git a/daemon.py b/daemon.py index 3cc21070d..19926f4e9 100644 --- a/daemon.py +++ b/daemon.py @@ -32,6 +32,7 @@ from metadata import metadata_custom_emoji from enigma import get_enigma_pub_key from enigma import set_enigma_pub_key from pgp import actor_to_vcard +from pgp import actor_to_vcard_xml from pgp import get_email_address from pgp import set_email_address from pgp import get_pgp_pub_key @@ -1227,11 +1228,16 @@ class PubServer(BaseHTTPRequestHandler): self._404() self.server.vcard_is_active = False return True - vcard_str = actor_to_vcard(actor_json) + if 'vcard+xml' in accept_str: + vcard_str = actor_to_vcard_xml(actor_json) + header_type = 'text/vcard+xml; charset=utf-8' + else: + vcard_str = actor_to_vcard(actor_json) + header_type = 'text/vcard; charset=utf-8' if vcard_str: msg = vcard_str.encode('utf-8') msglen = len(msg) - self._set_headers('text/vcard; charset=utf-8', msglen, + self._set_headers(header_type, msglen, None, calling_domain, True) self._write(msg) print('vcard sent to ' + str(referer_domain)) diff --git a/epicyon.py b/epicyon.py index 831b367ab..635deeda9 100644 --- a/epicyon.py +++ b/epicyon.py @@ -291,6 +291,9 @@ parser.add_argument('--postsraw', dest='postsraw', type=str, help='Show raw json of posts for the given handle') parser.add_argument('--vcard', dest='vcard', type=str, default=None, help='Show the vcard for a given activitypub actor url') +parser.add_argument('--vcardxml', dest='vcardxml', type=str, default=None, + help='Show the xml vcard for a given ' + + 'activitypub actor url') parser.add_argument('--json', dest='json', type=str, default=None, help='Show the json for a given activitypub url') parser.add_argument('--htmlpost', dest='htmlpost', type=str, default=None, @@ -977,7 +980,20 @@ if args.vcard: domain = '' if args.domain: domain = args.domain - test_vcard = get_vcard(session, args.vcard, + test_vcard = get_vcard(False, session, args.vcard, + None, debug, __version__, http_prefix, domain) + if test_vcard: + print(test_vcard) + sys.exit() + +if args.vcardxml: + session = create_session(None) + if not args.domain: + args.domain = get_config_param(base_dir, 'domain') + domain = '' + if args.domain: + domain = args.domain + test_vcard = get_vcard(True, session, args.vcard, None, debug, __version__, http_prefix, domain) if test_vcard: print(test_vcard) diff --git a/pgp.py b/pgp.py index a18b87941..681a7a48a 100644 --- a/pgp.py +++ b/pgp.py @@ -637,7 +637,7 @@ def actor_to_vcard(actor: {}) -> str: vcard_str += 'VERSION:4.0\n' vcard_str += 'REV:' + actor['published'] + '\n' vcard_str += 'FN:' + actor['name'] + '\n' - vcard_str += 'N:' + actor['preferredUsername'] + '\n' + vcard_str += 'NICKNAME:' + actor['preferredUsername'] + '\n' vcard_str += 'URL:' + actor['url'] + '\n' blog_address = get_blog_address(actor) if blog_address: @@ -682,3 +682,81 @@ def actor_to_vcard(actor: {}) -> str: 'ADR:;;;' + city_name + ';;;\n' vcard_str += 'END:VCARD\n' return vcard_str + + +def actor_to_vcard_xml(actor: {}) -> str: + """Returns a xml formatted vcard for a given actor + """ + vcard_str = '\n' + vcard_str += '\n' + vcard_str += ' \n' + vcard_str += ' ' + actor['name'] + '\n' + vcard_str += ' ' + \ + actor['preferredUsername'] + '\n' + vcard_str += ' ' + actor['summary'] + '\n' + email_address = get_email_address(actor) + if email_address: + vcard_str += ' ' + email_address + '\n' + xmpp_address = get_xmpp_address(actor) + if xmpp_address: + vcard_str += ' ' + \ + 'xmpp' + \ + '' + xmpp_address + '\n' + jami_address = get_jami_address(actor) + if jami_address: + vcard_str += ' ' + \ + 'jami' + \ + '' + jami_address + '\n' + matrix_address = get_matrix_address(actor) + if matrix_address: + vcard_str += ' ' + \ + 'matrix' + \ + '' + matrix_address + '\n' + briar_address = get_briar_address(actor) + if briar_address: + vcard_str += ' ' + \ + 'briar' + \ + '' + briar_address + '\n' + cwtch_address = get_cwtch_address(actor) + if cwtch_address: + vcard_str += ' ' + \ + 'cwtch' + \ + '' + cwtch_address + '\n' + vcard_str += ' ' + \ + 'profile' + \ + '' + actor['url'] + '\n' + blog_address = get_blog_address(actor) + if blog_address: + vcard_str += ' ' + \ + 'blog' + \ + '' + blog_address + '\n' + vcard_str += ' ' + actor['published'] + '\n' + if actor['icon']['url']: + vcard_str += \ + ' ' + actor['icon']['url'] + '\n' + pgp_key = get_pgp_pub_key(actor) + if pgp_key: + pgp_key_encoded = \ + base64.b64encode(pgp_key.encode('utf-8')).decode('utf-8') + vcard_str += \ + ' ' + \ + '' + \ + 'data' + \ + 'application/pgp-keys;base64' + \ + '' + \ + '' + pgp_key_encoded + '\n' + if actor.get('hasOccupation'): + if len(actor['hasOccupation']) > 0: + if actor['hasOccupation'][0].get('name'): + vcard_str += \ + ' ' + \ + actor['hasOccupation'][0]['name'] + '\n' + if actor['hasOccupation'][0].get('occupationLocation'): + city_name = \ + actor['hasOccupation'][0]['occupationLocation']['name'] + vcard_str += \ + ' ' + city_name + '\n' + + vcard_str += ' \n' + vcard_str += '\n' + return vcard_str diff --git a/session.py b/session.py index 7e74bcf9b..5e4c57862 100644 --- a/session.py +++ b/session.py @@ -246,7 +246,8 @@ def get_json(signing_priv_key_pem: str, None, quiet, debug, True) -def get_vcard(session, url: str, params: {}, debug: bool, +def get_vcard(xml_format: bool, + session, url: str, params: {}, debug: bool, version: str = '1.3.0', http_prefix: str = 'https', domain: str = 'testdomain', timeout_sec: int = 20, quiet: bool = False) -> {}: @@ -258,6 +259,10 @@ def get_vcard(session, url: str, params: {}, debug: bool, headers = { 'Accept': 'text/vcard' } + if xml_format: + headers = { + 'Accept': 'text/vcard+xml' + } session_params = {} session_headers = {} if headers: From 1ae8c909c3767017996d4bf86cd5007952aac0e5 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 16 Feb 2022 11:16:15 +0000 Subject: [PATCH 05/10] Remove html from description --- pgp.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pgp.py b/pgp.py index 681a7a48a..1712e611e 100644 --- a/pgp.py +++ b/pgp.py @@ -693,7 +693,8 @@ def actor_to_vcard_xml(actor: {}) -> str: vcard_str += ' ' + actor['name'] + '\n' vcard_str += ' ' + \ actor['preferredUsername'] + '\n' - vcard_str += ' ' + actor['summary'] + '\n' + vcard_str += ' ' + \ + remove_html(actor['summary']) + '\n' email_address = get_email_address(actor) if email_address: vcard_str += ' ' + email_address + '\n' From 23d89f13969ad3bb920e248fde4f624167b78079 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 16 Feb 2022 11:23:56 +0000 Subject: [PATCH 06/10] gzip types --- deploy/i2p | 2 +- deploy/onion | 2 +- website/EN/index.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/i2p b/deploy/i2p index a2eca60c2..1fc4ad465 100755 --- a/deploy/i2p +++ b/deploy/i2p @@ -329,7 +329,7 @@ echo "Creating nginx virtual host for http://${I2P_DOMAIN}" echo ' gzip on;'; echo ' gzip_min_length 1000;'; echo ' gzip_proxied expired no-cache no-store private auth;'; - echo ' gzip_types text/plain application/xml;'; + echo ' gzip_types gzip_types text/plain text/css text/vcard text/vcard+xml application/json application/ld+json application/javascript text/xml application/xml application/rdf+xml application/xml+rss text/javascript;'; echo ''; echo ' add_header X-Content-Type-Options nosniff;'; echo ' add_header X-XSS-Protection "1; mode=block";'; diff --git a/deploy/onion b/deploy/onion index a93599731..60a354fe3 100755 --- a/deploy/onion +++ b/deploy/onion @@ -251,7 +251,7 @@ echo "Creating nginx virtual host for ${ONION_DOMAIN}" echo ' gzip on;'; echo ' gzip_min_length 1000;'; echo ' gzip_proxied expired no-cache no-store private auth;'; - echo ' gzip_types text/plain application/xml;'; + echo ' gzip_types gzip_types text/plain text/css text/vcard text/vcard+xml application/json application/ld+json application/javascript text/xml application/xml application/rdf+xml application/xml+rss text/javascript;'; echo ''; echo ' add_header X-Content-Type-Options nosniff;'; echo ' add_header X-XSS-Protection "1; mode=block";'; diff --git a/website/EN/index.html b/website/EN/index.html index bf3074e3d..6f34ccf6d 100644 --- a/website/EN/index.html +++ b/website/EN/index.html @@ -1416,7 +1416,7 @@ gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
- gzip_types text/plain text/css application/json application/ld+json application/javascript text/xml application/xml application/rdf+xml application/xml+rss text/javascript;
+ gzip_types text/plain text/css text/vcard text/vcard+xml application/json application/ld+json application/javascript text/xml application/xml application/rdf+xml application/xml+rss text/javascript;

ssl_stapling off;
ssl_stapling_verify off;
From 95d39beb18fe1ccdab16fc19424f8b7c020d9a44 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 16 Feb 2022 11:29:40 +0000 Subject: [PATCH 07/10] Remove any html from name in vcard --- pgp.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pgp.py b/pgp.py index 1712e611e..ff6ef04fd 100644 --- a/pgp.py +++ b/pgp.py @@ -636,7 +636,7 @@ def actor_to_vcard(actor: {}) -> str: vcard_str = 'BEGIN:VCARD\n' vcard_str += 'VERSION:4.0\n' vcard_str += 'REV:' + actor['published'] + '\n' - vcard_str += 'FN:' + actor['name'] + '\n' + vcard_str += 'FN:' + remove_html(actor['name']) + '\n' vcard_str += 'NICKNAME:' + actor['preferredUsername'] + '\n' vcard_str += 'URL:' + actor['url'] + '\n' blog_address = get_blog_address(actor) @@ -690,7 +690,8 @@ def actor_to_vcard_xml(actor: {}) -> str: vcard_str = '\n' vcard_str += '\n' vcard_str += ' \n' - vcard_str += ' ' + actor['name'] + '\n' + vcard_str += ' ' + \ + remove_html(actor['name']) + '\n' vcard_str += ' ' + \ actor['preferredUsername'] + '\n' vcard_str += ' ' + \ From aa4b2e760e4906da8e58b6f0a6cd8afc7c301b52 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 16 Feb 2022 11:31:56 +0000 Subject: [PATCH 08/10] vcard profile --- pgp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgp.py b/pgp.py index ff6ef04fd..ce8297b39 100644 --- a/pgp.py +++ b/pgp.py @@ -638,7 +638,7 @@ def actor_to_vcard(actor: {}) -> str: vcard_str += 'REV:' + actor['published'] + '\n' vcard_str += 'FN:' + remove_html(actor['name']) + '\n' vcard_str += 'NICKNAME:' + actor['preferredUsername'] + '\n' - vcard_str += 'URL:' + actor['url'] + '\n' + vcard_str += 'URL:profile:' + actor['url'] + '\n' blog_address = get_blog_address(actor) if blog_address: vcard_str += 'URL:blog:' + blog_address + '\n' From 10301cfec39bca45ba5b8e0b447a89fcd4244e82 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 16 Feb 2022 11:50:35 +0000 Subject: [PATCH 09/10] vcard includes fediverse handle --- daemon.py | 4 ++-- epicyon.py | 4 ++-- pgp.py | 24 +++++++++++++++--------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/daemon.py b/daemon.py index 19926f4e9..81c112e24 100644 --- a/daemon.py +++ b/daemon.py @@ -1229,10 +1229,10 @@ class PubServer(BaseHTTPRequestHandler): self.server.vcard_is_active = False return True if 'vcard+xml' in accept_str: - vcard_str = actor_to_vcard_xml(actor_json) + vcard_str = actor_to_vcard_xml(actor_json, domain) header_type = 'text/vcard+xml; charset=utf-8' else: - vcard_str = actor_to_vcard(actor_json) + vcard_str = actor_to_vcard(actor_json, domain) header_type = 'text/vcard; charset=utf-8' if vcard_str: msg = vcard_str.encode('utf-8') diff --git a/epicyon.py b/epicyon.py index 635deeda9..ec6644a2b 100644 --- a/epicyon.py +++ b/epicyon.py @@ -291,7 +291,7 @@ parser.add_argument('--postsraw', dest='postsraw', type=str, help='Show raw json of posts for the given handle') parser.add_argument('--vcard', dest='vcard', type=str, default=None, help='Show the vcard for a given activitypub actor url') -parser.add_argument('--vcardxml', dest='vcardxml', type=str, default=None, +parser.add_argument('--xmlvcard', dest='xmlvcard', type=str, default=None, help='Show the xml vcard for a given ' + 'activitypub actor url') parser.add_argument('--json', dest='json', type=str, default=None, @@ -986,7 +986,7 @@ if args.vcard: print(test_vcard) sys.exit() -if args.vcardxml: +if args.xmlvcard: session = create_session(None) if not args.domain: args.domain = get_config_param(base_dir, 'domain') diff --git a/pgp.py b/pgp.py index ce8297b39..6a84784a9 100644 --- a/pgp.py +++ b/pgp.py @@ -630,7 +630,7 @@ def pgp_public_key_upload(base_dir: str, session, return actor_update -def actor_to_vcard(actor: {}) -> str: +def actor_to_vcard(actor: {}, domain: str) -> str: """Returns a vcard for a given actor """ vcard_str = 'BEGIN:VCARD\n' @@ -638,10 +638,10 @@ def actor_to_vcard(actor: {}) -> str: vcard_str += 'REV:' + actor['published'] + '\n' vcard_str += 'FN:' + remove_html(actor['name']) + '\n' vcard_str += 'NICKNAME:' + actor['preferredUsername'] + '\n' - vcard_str += 'URL:profile:' + actor['url'] + '\n' + vcard_str += 'URL;TYPE=profile:' + actor['url'] + '\n' blog_address = get_blog_address(actor) if blog_address: - vcard_str += 'URL:blog:' + blog_address + '\n' + vcard_str += 'URL;TYPE=blog:' + blog_address + '\n' vcard_str += 'NOTE:' + remove_html(actor['summary']) + '\n' if actor['icon']['url']: vcard_str += 'PHOTO:' + actor['icon']['url'] + '\n' @@ -652,23 +652,25 @@ def actor_to_vcard(actor: {}) -> str: email_address = get_email_address(actor) if email_address: vcard_str += 'EMAIL;TYPE=internet:' + email_address + '\n' + vcard_str += 'IMPP;TYPE=fediverse:' + \ + actor['preferredUsername'] + '@' + domain + '\n' xmpp_address = get_xmpp_address(actor) if xmpp_address: - vcard_str += 'IMPP:xmpp:' + xmpp_address + '\n' + vcard_str += 'IMPP;TYPE=xmpp:' + xmpp_address + '\n' jami_address = get_jami_address(actor) if jami_address: - vcard_str += 'IMPP:jami:' + jami_address + '\n' + vcard_str += 'IMPP;TYPE=jami:' + jami_address + '\n' matrix_address = get_matrix_address(actor) if matrix_address: - vcard_str += 'IMPP:matrix:' + matrix_address + '\n' + vcard_str += 'IMPP;TYPE=matrix:' + matrix_address + '\n' briar_address = get_briar_address(actor) if briar_address: if briar_address.startswith('briar://'): briar_address = briar_address.split('briar://')[1] - vcard_str += 'IMPP:briar:' + briar_address + '\n' + vcard_str += 'IMPP;TYPE=briar:' + briar_address + '\n' cwtch_address = get_cwtch_address(actor) if cwtch_address: - vcard_str += 'IMPP:cwtch:' + cwtch_address + '\n' + vcard_str += 'IMPP;TYPE=cwtch:' + cwtch_address + '\n' if actor.get('hasOccupation'): if len(actor['hasOccupation']) > 0: if actor['hasOccupation'][0].get('name'): @@ -684,7 +686,7 @@ def actor_to_vcard(actor: {}) -> str: return vcard_str -def actor_to_vcard_xml(actor: {}) -> str: +def actor_to_vcard_xml(actor: {}, domain: str) -> str: """Returns a xml formatted vcard for a given actor """ vcard_str = '\n' @@ -699,6 +701,10 @@ def actor_to_vcard_xml(actor: {}) -> str: email_address = get_email_address(actor) if email_address: vcard_str += ' ' + email_address + '\n' + vcard_str += ' ' + \ + 'fediverse' + \ + '' + actor['preferredUsername'] + '@' + domain + \ + '\n' xmpp_address = get_xmpp_address(actor) if xmpp_address: vcard_str += ' ' + \ From 89fca66cfddd05114c00c0ff83c9b8140cdda069 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 16 Feb 2022 12:05:42 +0000 Subject: [PATCH 10/10] xml vcard option --- epicyon.py | 2 +- session.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/epicyon.py b/epicyon.py index ec6644a2b..a98d161a7 100644 --- a/epicyon.py +++ b/epicyon.py @@ -993,7 +993,7 @@ if args.xmlvcard: domain = '' if args.domain: domain = args.domain - test_vcard = get_vcard(True, session, args.vcard, + test_vcard = get_vcard(True, session, args.xmlvcard, None, debug, __version__, http_prefix, domain) if test_vcard: print(test_vcard) diff --git a/session.py b/session.py index 5e4c57862..35671d5d6 100644 --- a/session.py +++ b/session.py @@ -260,9 +260,7 @@ def get_vcard(xml_format: bool, 'Accept': 'text/vcard' } if xml_format: - headers = { - 'Accept': 'text/vcard+xml' - } + headers['Accept'] = 'text/vcard+xml' session_params = {} session_headers = {} if headers: