From a088ea1e42f39afc5ca7456c5269e82ac4e7d148 Mon Sep 17 00:00:00 2001 From: zefie Date: Sat, 13 Nov 2021 01:19:23 -0500 Subject: [PATCH] initial work on wtv-mail system: - WTVMail Class - MailStore functions - Can show user mail intro page (see home.js for link example) - Create initial welcome email (poop for now) when creating mailstore - Can list Inbox - no sending yet - no reading yet - no receiving yet --- .../help/common/helpMastheadBlank.swf | Bin 0 -> 123 bytes .../ServiceVault/wtv-home/home.js | 1 + .../ServiceVault/wtv-mail/DiplomaMail.js | 94 +++++ .../wtv-mail/content/images/CornerTop.gif | Bin 0 -> 54 bytes .../wtv-mail/content/images/Mail.gif | Bin 0 -> 613 bytes .../content/images/MailboxDiscard.gif | Bin 0 -> 2011 bytes .../wtv-mail/content/images/MailboxSent.gif | Bin 0 -> 2014 bytes .../content/images/MailboxStorage.gif | Bin 0 -> 1249 bytes .../wtv-mail/content/images/OpenMailbox0.gif | Bin 0 -> 3788 bytes .../wtv-mail/content/images/OpenMailbox1.gif | Bin 0 -> 3888 bytes .../wtv-mail/content/images/OpenMailbox2.gif | Bin 0 -> 3935 bytes .../wtv-mail/content/images/OpenMailbox3.gif | Bin 0 -> 3955 bytes .../wtv-mail/content/images/OpenMailbox4.gif | Bin 0 -> 3937 bytes .../wtv-mail/content/images/OpenMailbox5.gif | Bin 0 -> 3475 bytes .../wtv-mail/content/images/dot.gif | Bin 0 -> 348 bytes .../wtv-mail/content/images/sidebardot.gif | Bin 0 -> 348 bytes .../wtv-mail/content/images/widget.gif | Bin 0 -> 405 bytes .../ServiceVault/wtv-mail/listmail.js | 321 ++++++++++++++++++ zefie_wtvp_minisrv/WTVClientSessionData.js | 11 + zefie_wtvp_minisrv/WTVMail.js | 217 ++++++++++++ zefie_wtvp_minisrv/config.json | 13 +- zefie_wtvp_minisrv/package-lock.json | 20 +- zefie_wtvp_minisrv/package.json | 3 +- zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj | 9 + 24 files changed, 683 insertions(+), 6 deletions(-) create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-guide/ROMCache/help/common/helpMastheadBlank.swf create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/DiplomaMail.js create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/CornerTop.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/Mail.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/MailboxDiscard.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/MailboxSent.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/MailboxStorage.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox0.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox1.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox2.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox3.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox4.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox5.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/dot.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/sidebardot.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/widget.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-mail/listmail.js create mode 100644 zefie_wtvp_minisrv/WTVMail.js diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-guide/ROMCache/help/common/helpMastheadBlank.swf b/zefie_wtvp_minisrv/ServiceVault/wtv-guide/ROMCache/help/common/helpMastheadBlank.swf new file mode 100644 index 0000000000000000000000000000000000000000..3bb8bbca4ee8d90470d42901a91a3b92b26a14ba GIT binary patch literal 123 zcmZ<@4`!@pU|^_VV69+aU_QXWz{AMk%=G{N|NRUBKygN>O!GkoCLotV;LswrMQm*| z%e4=fDljoHz=^93$HR literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js b/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js index 813deb3e..2d017998 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js @@ -47,6 +47,7 @@ minisrv v${minisrv_config.version}${(minisrv_config.config.git_commit) ? ' git-'
  • client:relog (direct)
  • Ultra Willies ~ Tricks
  • Setup (Including BG Music)
  • +
  • Mail (not ready) `; if (ssid_sessions[socket.ssid].hasCap("client-can-do-chat")) { data += "
  • IRC Chat Test
  • \n" diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-mail/DiplomaMail.js b/zefie_wtvp_minisrv/ServiceVault/wtv-mail/DiplomaMail.js new file mode 100644 index 00000000..5a8c0c3d --- /dev/null +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-mail/DiplomaMail.js @@ -0,0 +1,94 @@ +var minisrv_service_file = true; + +headers = `200 OK +Content-type: text/html`; + +data = ` + + + +Welcome to Mail + + + + + + + + +
    + + + +
    +
    + + + + +
    +
    + +Welcome to Mail  + +
    +  +
    +
    + + + +
    + +
    + + + + + +
    +
    + +In Mail, you can exchange typed messages—called +e-mail—with anyone in the world who has an e-mail +address. This is your e-mail address: +
    +${ssid_sessions[socket.ssid].getSessionData("subscriber_username")}@${minisrv_config.config.service_name} +
    +Choose Begin to start using Mail. +
      +  +  +
    +
    +
    +
    + + + + +
    +
    + +`; \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/CornerTop.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/CornerTop.gif new file mode 100644 index 0000000000000000000000000000000000000000..b81e3e02f55e807464d6163757e4d805fedfcc8d GIT binary patch literal 54 zcmZ?wbhEHbWFRP8xYp3j;|IbWSD#VhctqS1f~wPId*1b`6${bqtXwlP85fo&X1Mj12^*Hk${b zG%86>s*Ih3kghzOZ$+uv~t}|K!?J}7NtKwbS<O&Au+p3-SP8R9x-Wm3p@++kYHwJbLW+$y5MA zJy&i!8uJ0ND>fg_H+k0OjBcBvKB0Op>%?pGz80z%NbQ%ADYyQ+d#G%2yCEaRZMS%A z(z8uWi>4fLMa5Q2MsF0lZ}7CtDLXF>`#?NrXTSd)E_(cU>RXpz&%K!NDYM??ixg~G z_v4Hz+f{ele9h^mn*sQNcG_wavB!sjOT~f_4(H9#88!-T@j(Hd?4cn92><{)UxgpX literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/MailboxDiscard.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/MailboxDiscard.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c92a9435c7ca75bdc0fbaa4af7e25bee2a0bb3a GIT binary patch literal 2011 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 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/MailboxStorage.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/MailboxStorage.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a1db804b16ad8b6c1c3e7bccf165f97c0ad85a6 GIT binary patch literal 1249 zcmV<71RncGNk%w1VL<>i0E7SlOgk*Ln06T!6t9hCglSI7t&Bl5CYpU&3ke7r85yRC zWF;LMV^2B5pmyQPv^6OoRzxw=x}g9700000000000000000000000000000000000 z000000000000000A^8LW000R9EC2ui06_pW000I4U?PrWX`bYQu59bB%kn$`W2kSg zoAF{85C%aJC`KXy#sjx&mU=V>>#tb4H&@d67Sc?Aap_C|*h|2?TNIXzbfI*CF*KS^WKtSYx zpUU>I8i&N5xri+TC|F8y1W!H$9^m}w@#BGGKL;o{Q1ax;helbtRJwHO08lCxaBX0P zV#khE1t543GV57bTH=8%s?Xd~rDT^Lu=x}hTP`-^B9ObdSk|&jhu$;FSM0vP1TqUt z@L;Xs!wqaM9?iHG5v>Qdram$mY*?`bGRn@#@oBPmeH0k*I2wU(0YbEHRggK}>*EJ9 zLjaI%w(LNiaeaPwSczQ5zUQVE%#^@G)_gN-9GESL`Pl|I6PQl@wgRcyvjb0kpnmcp z;+STH@Z-nwcI`+pTWqzh)gCffvHn#A0P$s)004s7ml-Ji{lHu{<(&sXY)S-@R!;}M zgViyxh}K{NnGtuN0uT0gA#(r*I1mW}IA!3036A&^5)feLTLMC;m>d8uz6jujBgi0C zjTV6zB7!502uoBaGC^g8P+x#ikNZILiud!B6C(pVJ&KFn(ns#!rhT(J69NMyhN0VrU$xQ;*-!7~_x zFu7+*%kTlzstaR`|6&yI6ICs+Si#@++Ht=15m4X0WS! z_IccJ%|>GTFTfR>K$Xfn0Szt3AIA(bzYt5DGkQ%s-E+Jd*LPOc$;C{AmKTyN@x&QL zRTT?UO-1lPG7~MK)ls1had`r6Et|@}xe!-eKW8>}uywzIbk=Lj#@_=CF6M#?abE`z z!!l>i@6EPKL8OmjC+}V!44FK5u>h6;FzJg-FZz%IXT#A5v*UF<%V@Hc+-01GqSN}qdyaA8A_to>(;I`za LzgYK9ga80LL>(72 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox0.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox0.gif new file mode 100644 index 0000000000000000000000000000000000000000..2bbbf969b9485573d13791071bc85cd9adbc36b3 GIT binary patch literal 3788 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 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox3.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox3.gif new file mode 100644 index 0000000000000000000000000000000000000000..423efff7ddbe49c796c10194c4b8cd35ffe6dd04 GIT binary patch literal 3955 zcmZYA2~?8l8V7KYMLBbY^wMY35WWMv9Za9^QUt+$jhPD@lFS9R#uQH0hWSnrhxwDOLnGa5|#wyX6+3X z>p)QH4Jn60CBjgM&9-f`_>w-+Xq_(6Kt&$1nYOBi#P7e1Z8p$Vxq06N#Ac zh;{q?eD<@Lasb3;N=W!uFv=ycnZJjtgsZ*tzi1R!8s$vJ zaZhJwEE>H52$cGYEE2WOSj+fERmoQ}k~v?B_4AR?#%r(B(a{eN3zm?9$*hBdpMxn*=zlhp$zfH z`adW8yxHgNKOgz?!Pldb_*#0c`}6rEg``>=B)P6d);5!b{2+r zsk`vX1?ezF1LhE~qAv@DGi?aXk}I`}o$1dRY9-PLgSN_vA$8TlbMdx~$pN0qHwm}{ z`L>a!13l+06+>8c9%?t?>ds?k4ffP~RS=o3G39GNOXrzpm9+XOH821W*NDEblRkGY z>LiI?djDxKrqJ5mU(mq^^w$R`WpCZhe?6+4^1gkM+G5=Iof$tDcjy41O?B_Eg4NXc zcMguX)1qD4vWhw>5#90coCLqzKs@DVsCjgU$?r7qEmmb&dX$9G!oJsg@hE1eBOe_w z*Y4b82t7PZCQ^jZm$TF1m4@##Roc`>`XAVa>k#S0;LS$GslNbECP8G^ov258ER zF|wZ|DRXB_j=u37(WLRKQ^ASTIa$J-==R{d=A+e%E>Z>kdZ9-W@TQtaBGt1hAl^#e zT&otXxZx}SAZ{n7g`#R~a??n^7BlH^hoej-W*!T*Y(1Z=#bd^ z)d61C4O^Fwv;t2h%&daxneJoSMd|3E2;KV1l2aDnFKu@}Oy43N^{Mu#jcCgCF4;AF zlAQM*N;g=ss<*1E&26+POPtA(ZsE0+Zh;r(KX2Ym$$=|(`UXW7_Ao;QTBGE2x%z1b z?}*~Tgtu^Ol9G?RsnEzL&1hBxJ!Lg!kR#;iO&q*?Rlnrz0I|w(5o&$dOM9+jusc2P zx(45n43Zr-mQ-)~j* zoX~GU&cmdy@Xb}RD+DBIs6==EhRv-{#)*P=WkwcVw7eXXD3T~$=Od@9t>)@3)9l`u zmHta+iCgv#luyl5U+hTe;-*_J1z{XGWGt62|5TswN<5#Mu_Hz(6)8fd*(sRF7iyVj zuS_mS75Ax2q4ZscLX^)7VC4il{hKK78-O zDXy*y3;lb}NG*D*N|W5I*c{-akhoOi+0}>BNSxB$RcBTZyh|;LIrMyMG+E4HwhScw_7P+QRvp>*7m&^4A;=VRi{0Ry z-SClGqen_-s9R+jj5rAR$As&Wzgk7mH+60Zgu{-HDE3Q|8~J4Gl?ytYi*S;&!dQQ< z8t+W7Utb;Q=13QFFHr-uwVvjtnpT+!s0e>tWt}A`hazWdhTYSx+D9`Y`iVf9r0NP= zybSE`)Vi*oK}sdfbH_(Pv$lDI_s;U19TCKeaD`{&(h2;Z)OdNV5J#zrWtTWsTayiA zlrmFs8qFhKjofnx*4c{mXz!3=|AG6zb zB>wewM<27=rrqJp2kO85$4N@v#kXI%=<3j$be&rZqGuD1*q`J5eM$|s`bQhveh6W@VlNYxX27oKjFJP&v{;#T+9|KACvnY>5;cKE5(pIltU{ zv5TweB+7_l^U1leK~=wCSg2noO+!>nV5Wkx*#?Lp$ExYhOB2ybjN47m(loGBqN-Se zT9H?JG>n;sFQk^fE`LK}5-|SQN|{o2-L}?Oj;fgX-hg=!#!N69&z?p{jX0*<1IQj_ z=K#wBGQm1NX&Nqf#pj24{GxW(TMwc!cN3jjirQMC220KgCx@uA%n@STC-0+Z()oC! zDRmc}*{mr#$L4Kwj(axmPUeT}-^4C9J6hUOyZRKrW&4wh6`tw^P@yy` zcMDzV3i^r4eP&mhG-8>7-yMSJ^ac~v$#6XfzHInhYP0VV!<{bW*iv>!q4skiHsIZ8 z=R7#p%D8bu-sI&xyFR>=)_YRucoi&nIs#5s_ab^5iZ`5APoW>TIKttmq zlu`&%NfHB6FC6{UhsH98!vh_NW~jWlcD2Xom0r_a+Tx*m?hmnt2Te;_J50bpw%cP2 ztm8{Ud%K6W-lv}F{{4C+e1fQ@Zy$6iq-``T<8NfJ{LKe_$oBolWq8oQ z4ddVg$&H1{KfN%XKN?e79_9!z*~fuRdo!}}7z!V;$N^sqgMB=JY2zc%EFf@5_L*)% zf6<9;eJAdY%euz}mga9S8G+PN(?>a}*sc_fxztYwF!uq-zh21wPL>Tiu*YdgHtxBL z248j_4>D!QxhngVjmZACAF+G`a-R>{&j$sGGMc<#ENmtv0^>Xad4=ElnvK&c#&ak__} zB3Xk79fn&N0E2D-7sbr&) zL^&zg?6fZ2!x7s@EadotiT+HC=Pv5Y(2QErmTDekpa9h&%CYr=mBTXMlaP5dWbx9; zPU>j@2~j~pR8bLC9HfYfsAfTK@?^TbAm{Ojk|9(m>*S5>lkF^}gbG9lM}OQ4saXjM zqe4+5XT&bh#&QJLD<2XluRDb`#ABM-$fYiv)xsGR=`7GH9~zk7&PH?+U_3VXf*106 zCoXgWpcQydo&;^kN2K%483sZe-ky_Vozt>{>Iu&oy*y{)yh;e30@yw-ki$dkIZ|n) z!ku(^t5pIrztHt!VK55z4h7Ri!FDyAcK!hu%qv8qpur@0UAEL8Y$+!FJj3cjSl|T{ I6%@eczY7L|RsaA1 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox4.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox4.gif new file mode 100644 index 0000000000000000000000000000000000000000..569aeec756b46ab3c0155244e942be01bcbc0469 GIT binary patch literal 3937 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 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox5.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-mail/content/images/OpenMailbox5.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2f7522b44f520e490b2173a60620e7da6d5e7ba GIT binary patch literal 3475 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 + + + +${(mailbox_name === "Inbox") ? ' Mail list for ' + username : mailbox_name} + + + + + + +
    + + + +
    + +
    + + + + + +
    + + + + + + + + + + + +
    +
    + + + + +
    +
    Write +
    +
    +
    +
    + + + + +
    +
    Storage +
    +
    +
    +
    + + + + +
    +
    Addresses +
    +
    +
    +
    + + + + +
    +
    Clean up +
    +
    +
    +
    + + +

     

    +
    +

    +
    +
    +Quick Tip: + + +
    + +indicates messages from known senders
    + +
    +
    +
    +
    + + + + + +
    + +
    + +
    + + +
    + + + +`; + var icon_image = null; + switch (mailbox_name) { + case "Inbox": + switch (total_message_count) { + case 0: + icon_image = "OpenMailbox0.gif"; + break; + case 1: + icon_image = "OpenMailbox1.gif"; + break; + default: + icon_image = "OpenMailbox2.gif"; + break; + } + break; + case "Sent": + icon_image = "MailboxSent.gif"; + break; + case "Trash": + icon_image = "MailboxDiscard.gif"; + break; + default: + icon_image = "MailboxStorage.gif"; + break; + } + + data += ` + + +
    +
    + + +
    + + +
    + + + ${(mailbox_name === "Inbox") ? ' Mail list for ' + username : mailbox_name} + + + + +
    +Settings +
    + + +
    +
    +
    + + +
    + + +
    `; + if (message_list) { + + data += ` + ${total_message_count} e-mail message${(total_message_count != 1) ? 's' : ''} for + + +
    +${username}@${minisrv_config.config.service_name} +
    +

    + +
    + + + +
    +From +Subject +Date +
    + +
    +`; + Object.keys(message_list).forEach(function (k) { + var message = message_list[k]; + console.log(message); + data += ` + + + +
    + + +
    ${(message.known_sender) ? '' : ''} + + +${(message.from_name) ? message.from_name : message.from_addr} + + + + +${(message.subject) ? message.subject : "(No Subject)"} + + + + +`; + var message_date = new Date(message.date * 1000); + data += (message_date.getMonth() + 1) + "/" + message_date.getDate() + "\n"; + data += ` + +
    +
    `; + }); + } else { + data += ` + No ${(mailbox_name == "Inbox") ? `new e-mail messages for + +
    +${username}@${minisrv_config.config.service_name} +
    ` : 'e-mail messages in mailbox '+mailbox_name} +

    +`; + } +data += ` + +
    + + +`; + + + } +} else { + mail_end_error("Access Denied"); +} \ No newline at end of file diff --git a/zefie_wtvp_minisrv/WTVClientSessionData.js b/zefie_wtvp_minisrv/WTVClientSessionData.js index f3ca63ef..6dea55d8 100644 --- a/zefie_wtvp_minisrv/WTVClientSessionData.js +++ b/zefie_wtvp_minisrv/WTVClientSessionData.js @@ -8,6 +8,7 @@ class WTVClientSessionData { ssid = null; data_store = null; session_store = null; + mailstore = null; login_security = null; capabilities = null; session_storage = ""; @@ -23,6 +24,7 @@ class WTVClientSessionData { if (!minisrv_config) throw ("minisrv_config required"); var WTVShared = require('./WTVShared.js')['WTVShared']; var WTVMime = require('./WTVMime.js'); + var WTVMail = require('./WTVMail.js'); this.minisrv_config = minisrv_config; this.wtvshared = new WTVShared(minisrv_config); this.wtvmime = new WTVMime(minisrv_config); @@ -39,6 +41,7 @@ class WTVClientSessionData { "wtv-log:/log" ]; this.lockdownWhitelist.push(minisrv_config.config.unauthorized_url); + this.mailstore = new WTVMail(minisrv_config, ssid, this); } /** @@ -61,6 +64,8 @@ class WTVClientSessionData { storeUserStoreFile(path, data, last_modified = null, overwrite = true) { var store_dir = this.getUserStoreDirectory(); if (!store_dir) return false; // unregistered + // FileStore + store_dir += "FileStore" + this.path.sep; var result = false; var path_split = path.split('/'); var file_name = path_split.pop(); @@ -89,6 +94,8 @@ class WTVClientSessionData { getUserStoreFile(path) { var store_dir = this.getUserStoreDirectory(); if (!store_dir) return false; // unregistered + // FileStore + store_dir += "FileStore" + this.path.sep; var store_dir_path = this.wtvshared.makeSafePath(store_dir, path.replace('/', this.path.sep)); if (this.fs.existsSync(store_dir_path)) return this.fs.readFileSync(store_dir_path); else return false; @@ -559,6 +566,10 @@ class WTVClientSessionData { return this.clientAddress; } + setMailstore(mailstore) { + this.mailstore = mailstore; + } + } module.exports = WTVClientSessionData; \ No newline at end of file diff --git a/zefie_wtvp_minisrv/WTVMail.js b/zefie_wtvp_minisrv/WTVMail.js new file mode 100644 index 00000000..ac443779 --- /dev/null +++ b/zefie_wtvp_minisrv/WTVMail.js @@ -0,0 +1,217 @@ +class WTVMail { + + fs = require('fs'); + path = require('path'); + uuid = require('uuid'); + + ssid = null; + unread_mail = 0; + inbox_store = null; + sent_store = null; + saved_store = null; + minisrv_config = []; + wtvshared = null; + wtvmime = null; + wtvclient = null; + mailstore_dir = null; + is_guest = null; + mailboxes = null; + + constructor(minisrv_config, ssid, WTVClientSessionData) { + if (!minisrv_config) throw ("minisrv_config required"); + var WTVShared = require('./WTVShared.js')['WTVShared']; + var WTVMime = require('./WTVMime.js'); + this.minisrv_config = minisrv_config; + this.wtvshared = new WTVShared(minisrv_config); + this.wtvmime = new WTVMime(minisrv_config); + this.wtvclient = WTVClientSessionData; + this.is_guest = !this.wtvclient.isRegistered(); + this.ssid = ssid; + this.unread_mail = this.wtvclient.getSessionData("subscriber_unread_mail") ? this.wtvclient.getSessionData("subscriber_unread_mail") : 0; + this.mailboxes = [ + // referenced by id, so order is important! + "Inbox", + "Sent", + "Saved", + "Trash" + ]; + } + + mailstoreExists() { + if (!this.isguest) { + if (this.mailstore_dir === null) { + // set mailstore directory local var so we don't call the function every time + var userstore_dir = this.wtvclient.getUserStoreDirectory(); + + // MailStore + var store_dir = "MailStore" + this.path.sep; + this.mailstore_dir = userstore_dir + store_dir; + } + return this.fs.existsSync(this.mailstore_dir); + } + return null; + } + + mailboxExists(mailboxid) { + if (mailboxid > this.mailboxes.length) return null; + var mailbox_dir = null; + if (this.mailstoreExists()) { + var mailbox_name = this.getMailboxById(mailboxid); + if (!mailbox_name) return null; + + var mailbox_dir = mailbox_name + this.path.sep; + var store_dir = this.mailstore_dir + mailbox_dir; + } + return (store_dir !== null) ? this.fs.existsSync(store_dir) : false; + } + + createMailstore() { + if (this.mailstoreExists() === false) { + if (!this.fs.existsSync(this.mailstore_dir)) this.fs.mkdirSync(this.mailstore_dir, { recursive: true }); + return true; + } + return false; + } + + getMailboxById(mailboxid) { + return (mailboxid < this.mailboxes.length - 1) ? this.mailboxes[mailboxid] : false; + } + + getMailboxStoreDir(mailboxid) { + if (this.mailboxExists(mailboxid)) { + var mailbox_name = this.getMailboxById(mailboxid); + return this.mailstore_dir + mailbox_name + this.path.sep; + } + return null; + } + + createMailbox(mailboxid) { + var mailbox_exists = this.mailboxExists(mailboxid); + if (mailbox_exists === false) { + var mailbox_name = this.getMailboxById(mailboxid); + var mailbox_dir = mailbox_name + this.path.sep; + var store_dir = this.mailstore_dir + mailbox_dir; + if (!this.fs.existsSync(store_dir)) this.fs.mkdirSync(store_dir, { recursive: true }); + return true; + } + return mailbox_exists; + } + + createMessageID() { + return this.uuid.v1(); + } + + + createMessage(mailboxid, from_addr, to_addr, msgbody, subject = null, from_name = null, to_name = null, date = null, known_sender = false) { + if (this.createMailbox(mailboxid)) { + if (!date) date = Math.floor(Date.now() / 1000); + + var mailbox_path = this.getMailboxStoreDir(mailboxid); + var message_file = this.createMessageID() + ".zmsg"; + var message_file_out = mailbox_path + message_file; + var message_data = { + "from_addr": from_addr, + "from_name": from_name, + "to_addr": to_addr, + "to_name": to_name, + "date": date, + "subject": subject, + "body": msgbody, + "known_sender": known_sender + } + try { + if (this.fs.existsSync(message_file_out)) { + console.log(" * ERROR: Message with this UUID already exists (should never happen). Message lost."); + return false; + } + + // encode message into json + var result = this.fs.writeFileSync(message_file_out, JSON.stringify(message_data)); + if (!result) return false; + + // rely on filesystem times for sorting as it is quicker then reading every file + var file_timestamp = new Date(date * 1000); + fs.utimesSync(message_file, Date.now(), file_timestamp); + if (!result) console.error(" WARNING: Setting timestamp on " + message_file + " failed, mail dates will be inaccurate."); + + } catch (e) { + console.error(" # MailErr: Mail Store failed\n", e, "\n", message_file_out, "\n", message_data ,"\n"); + } + return false; + } + } + + createWelcomeMessage() { + var from_addr = (this.minisrv_config.config.service_owner_account) ? this.minisrv_config.config.service_owner_account : this.minisrv_config.config.service_owner; + from_addr += "@" + this.minisrv_config.config.service_name; + var from_name = this.minisrv_config.config.service_owner + var to_addr = this.wtvclient.getSessionData("subscriber_username") + "@" + this.minisrv_config.config.service_name; + var to_name = this.wtvclient.getSessionData("subscriber_name"); + var subj = "Welcome to " + this.minisrv_config.config.service_name; + var msg = "poop"; + return this.createMessage(0, from_addr, to_addr, msg, subj, from_name, to_name, null, true); + } + + getMessage(mailboxid, messageid) { + if (this.createMailbox(mailboxid)) { + var mailbox_path = this.getMailboxStoreDir(mailboxid); + var message_file = messageid + ".zmsg"; + var message_file_in = mailbox_path + this.path.sep + message_file; + var message_data_raw = null; + + if (this.fs.existsSync(message_file_in)) message_data_raw = this.fs.readFileSync(message_file_in); + else console.error(" # MailErr: could not find ", message_file_in); + + if (message_data_raw) { + var message_data = JSON.parse(message_data_raw); + if (message_data) { + message_data.id = messageid; + return message_data; + } + else console.error(" # MailErr: could not parse json in ", message_file_in); + } + } + return false; + } + + listMessages(mailboxid, limit, reverse_sort = false, offset = 0) { + if (this.createMailbox(mailboxid)) { + var mailbox_path = this.getMailboxStoreDir(mailboxid); + var self = this; + var files = this.fs.readdirSync(mailbox_path) + .map(function (v) { + return { + name: v, + time: self.fs.statSync(mailbox_path + self.path.sep + v).mtime.getTime() + }; + }) + .sort(function (a, b) { + if (reverse_sort) return b.time - a.time; + else return a.time - b.time; + }) + .map(function (v) { + if (v.name.substring((v.name.length - 5)) === ".zmsg") return v.name.substring(0, (v.name.length - 5)); + }); + + if (files.length == 0) return false; // no messages + else { + // todo filter previous results when offset + var messagelist_out = new Array(); + Object.keys(files).forEach(function (k) { + var message = self.getMessage(mailboxid, files[k]); + if (message) messagelist_out.push(mailboxid, message); + else console.error(" # MailErr: reading message ID: ", files[k]); + }) + return messagelist_out.filter(function (n) { return n; }); + } + } + return null; // error + } + + countMessages(mailboxid) { + var messages = this.listMessages(mailboxid, false); + return (messages.length) ? messages.length : 0; + } +} + +module.exports = WTVMail; diff --git a/zefie_wtvp_minisrv/config.json b/zefie_wtvp_minisrv/config.json index 03540afa..dac0a17a 100644 --- a/zefie_wtvp_minisrv/config.json +++ b/zefie_wtvp_minisrv/config.json @@ -7,6 +7,7 @@ ], "SessionStore": "SessionStore", "service_owner": "a minisrv user", + "service_owner_account": "minisrvuser", "service_name": "WebTV", "service_logo": "WebTVLogoJewel.gif", "service_splash_logo": "file://ROM/images/SplashLogo1.gif", @@ -71,6 +72,10 @@ "flags": "0x00000010", "connections": 3 }, + "wtv-music": { + "port": 1656, + "connections": 3 + }, "wtv-cookie": { "port": 1619, "connections": 1 @@ -83,6 +88,10 @@ "port": 1635, "connections": 3 }, + "wtv-mail": { + "port": 1608, + "connections": 3 + }, "http": { "port": 1650, "connections": 3, @@ -101,8 +110,8 @@ "external_proxy_port": 1080, "flags": "0x00000001" }, - "wtv-music": { - "port": 1656, + "wtv-guide": { + "port": 1621, "connections": 3 } } diff --git a/zefie_wtvp_minisrv/package-lock.json b/zefie_wtvp_minisrv/package-lock.json index ebfbb179..ee27529b 100644 --- a/zefie_wtvp_minisrv/package-lock.json +++ b/zefie_wtvp_minisrv/package-lock.json @@ -1,12 +1,12 @@ { "name": "zefie_wtvp_minisrv", - "version": "0.9.22", + "version": "0.9.24", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "zefie_wtvp_minisrv", - "version": "0.9.22", + "version": "0.9.24", "license": "GPL3", "dependencies": { "crypto-js": "^4.1.1", @@ -14,7 +14,8 @@ "endianness": "^8.0.2", "mime-types": "^2.1.33", "proxy-agent": "^5.0.0", - "strftime": "^0.10.0" + "strftime": "^0.10.0", + "uuid": "^8.3.2" }, "funding": { "type": "patreon", @@ -586,6 +587,14 @@ "node": ">= 0.8" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vm2": { "version": "3.9.5", "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.5.tgz", @@ -1045,6 +1054,11 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, "vm2": { "version": "3.9.5", "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.5.tgz", diff --git a/zefie_wtvp_minisrv/package.json b/zefie_wtvp_minisrv/package.json index 4aabc910..570935ba 100644 --- a/zefie_wtvp_minisrv/package.json +++ b/zefie_wtvp_minisrv/package.json @@ -32,6 +32,7 @@ "endianness": "^8.0.2", "mime-types": "^2.1.33", "proxy-agent": "^5.0.0", - "strftime": "^0.10.0" + "strftime": "^0.10.0", + "uuid": "^8.3.2" } } diff --git a/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj b/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj index 7fa8312b..b61ecf89 100644 --- a/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj +++ b/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj @@ -91,6 +91,10 @@ Code + + + Code + @@ -325,6 +329,9 @@ Code + + Code + Code @@ -345,6 +352,8 @@ + +