1
0
mirror of https://github.com/LDDestroier/CC/ synced 2025-01-19 05:32:51 +00:00

It's functional!

Yeah, finally!

Just make sure that the server has all the clients' keys, or else they won't be able to connect. Security.
This commit is contained in:
LDDestroier 2019-03-05 19:59:31 -05:00 committed by GitHub
parent 97a88f1610
commit 190e92f679
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,6 +1,7 @@
local mainPath = ".sysmail" local mainPath = ".sysmail"
local yourID = os.getComputerID() local yourID = os.getComputerID()
local onlyUseWiredModems = false local onlyUseWiredModems = false
local defaultTimer = 3
local config = { local config = {
channel = 1024, channel = 1024,
@ -11,6 +12,14 @@ local config = {
attachmentPath = "attachments" attachmentPath = "attachments"
} }
local getTableLength = function(tbl)
local output = 0
for k,v in pairs(tbl) do
output = output + 1
end
return output
end
-- used for picking attachments -- used for picking attachments
local lddfm = {scroll = 0, ypaths = {}} local lddfm = {scroll = 0, ypaths = {}}
@ -543,7 +552,7 @@ client.findServer = function(srv)
id = yourID, id = yourID,
command = "find_server" command = "find_server"
}, msgID) }, msgID)
local reply, isEncrypted = receive(msgID, "find_server_respond", srv) local reply, isEncrypted = receive(msgID, "find_server_respond", srv, defaultTimer)
if type(reply) == "table" then if type(reply) == "table" then
if reply.server then if reply.server then
return reply.server return reply.server
@ -562,7 +571,7 @@ client.register = function(srv, username)
command = "register", command = "register",
name = username name = username
}, msgID, srv, yourID) }, msgID, srv, yourID)
local reply, isEncrypted = receive(msgID, "register_respond", yourID) local reply, isEncrypted = receive(msgID, "register_respond", yourID, defaultTimer)
if reply then if reply then
return reply.result return reply.result
else else
@ -580,7 +589,7 @@ client.getNames = function(srv)
id = yourID, id = yourID,
command = "get_names" command = "get_names"
}, msgID, srv, yourID) }, msgID, srv, yourID)
local reply, isEncrypted = receive(msgID, "get_names_respond", yourID) local reply, isEncrypted = receive(msgID, "get_names_respond", yourID, defaultTimer)
if type(reply) == "table" then if type(reply) == "table" then
return reply.names return reply.names
else else
@ -608,7 +617,7 @@ client.sendMail = function(srv, recipient, subject, message, attachments)
message = message, message = message,
attachments = attachments attachments = attachments
}, msgID, srv, yourID) }, msgID, srv, yourID)
local reply, isEncrypted = receive(msgID, "send_mail_respond", yourID) local reply, isEncrypted = receive(msgID, "send_mail_respond", yourID, defaultTimer)
if (isEncrypted and type(reply) == "table") then if (isEncrypted and type(reply) == "table") then
return reply.result return reply.result
else else
@ -625,7 +634,7 @@ client.getMail = function(srv)
command = "get_mail", command = "get_mail",
id = yourID, id = yourID,
}, msgID, srv, yourID) }, msgID, srv, yourID)
local reply, isEncrypted = receive(msgID, "get_mail_respond", yourID) local reply, isEncrypted = receive(msgID, "get_mail_respond", yourID, defaultTimer)
if (isEncrypted and type(reply) == "table") then if (isEncrypted and type(reply) == "table") then
if reply.mail then if reply.mail then
return alphasort(reply.mail) return alphasort(reply.mail)
@ -644,7 +653,7 @@ client.deleteMail = function(srv, mail)
id = yourID, id = yourID,
mail = mail, mail = mail,
}, msgID, srv, yourID) }, msgID, srv, yourID)
local reply, isEncrypted = receive(msgID, "delete_mail_respond", yourID) local reply, isEncrypted = receive(msgID, "delete_mail_respond", yourID, defaultTimer)
if (isEncrypted and type(reply) == "table") then if (isEncrypted and type(reply) == "table") then
return reply.result return reply.result
else else
@ -768,11 +777,21 @@ server.makeServer = function(verbose)
end end
end end
if verbose then
term.clear()
term.setCursorPos(1,1)
print("Make sure client keys are copied to key folder!")
end
say("SysMail server started.")
while true do while true do
msg, isEncrypted, msgID = receive() msg, isEncrypted, msgID = receive(nil, nil, nil, 5)
if msg then if not msg then
keyList = getAllKeys()
else
if not isEncrypted then if not isEncrypted then
if msg.command == "find_server" then if msg.command == "find_server" then
transmit({ transmit({
@ -878,7 +897,7 @@ local clientInterface = function(srv)
end end
local cwrite = function(text, y) local cwrite = function(text, y)
local cx, cy = term.getCursorPos() local cx, cy = term.getCursorPos()
term.setCursorPos(scr_x / 2 - #text / 2, y or cy) term.setCursorPos(scr_x / 2 - (#text - 1) / 2, y or cy)
term.write(text) term.write(text)
end end
local explode = function(div, str, replstr, includeDiv) local explode = function(div, str, replstr, includeDiv)
@ -893,9 +912,10 @@ local clientInterface = function(srv)
table.insert(arr, string.sub(replstr or str, pos)) table.insert(arr, string.sub(replstr or str, pos))
return arr return arr
end end
local dialogueBox = function(msg) local dialogueBox = function(msg, timeout)
local height = 7 local height = 7
local baseY = scr_y / 2 - height / 2 local baseY = scr_y / 2 - height / 2
term.setBackgroundColor(colors.gray)
for y = 1, height do for y = 1, height do
term.setCursorPos(1, (scr_y / 2) - (baseY / 2) + (y - 1)) term.setCursorPos(1, (scr_y / 2) - (baseY / 2) + (y - 1))
term.clearLine() term.clearLine()
@ -903,15 +923,17 @@ local clientInterface = function(srv)
cwrite(("="):rep(scr_x), baseY) cwrite(("="):rep(scr_x), baseY)
cwrite(msg, baseY + height / 2) cwrite(msg, baseY + height / 2)
cwrite(("="):rep(scr_x), baseY + height - 1) cwrite(("="):rep(scr_x), baseY + height - 1)
sleep(1) local evt
local tID = os.startTimer(timeout or 2)
repeat
evt = {os.pullEvent()}
until (evt[1] == "key") or (evt[1] == "timer" and evt[2] == tID)
term.setBackgroundColor(colors.black)
end end
srv = srv or tonumber( client.findServer(argData[1]) ) srv = srv or tonumber( client.findServer(argData[1]) )
if not srv then if not srv then
error("No server was found!") error("No server was found!")
end end
for k,v in pairs(client.getNames(srv) or {}) do
names[k] = v
end
if not names[yourID] then if not names[yourID] then
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
@ -926,7 +948,6 @@ local clientInterface = function(srv)
if server.checkValidName(attempt) then if server.checkValidName(attempt) then
names[yourID] = attempt names[yourID] = attempt
writeNames() writeNames()
client.register(srv, attempt)
break break
else else
term.clear() term.clear()
@ -934,6 +955,11 @@ local clientInterface = function(srv)
end end
end end
end end
client.register(srv, names[yourID])
for k,v in pairs(client.getNames(srv) or {}) do
names[k] = v
end
refresh() refresh()
@ -986,9 +1012,17 @@ local clientInterface = function(srv)
keyWrite("Quit ", 1) keyWrite("Quit ", 1)
keyWrite("New ", 1) keyWrite("New ", 1)
keyWrite("Refresh ", 1) keyWrite("Refresh ", 1)
term.setCursorPos(scr_x - #names[yourID], scr_y)
term.setTextColor(colors.lightGray)
term.write(names[yourID])
end end
-- logic(k) -- logic(k)
local barCommands = {
[keys.q] = {1, scr_y, 4},
[keys.n] = {6, scr_y, 3},
[keys.r] = {10, scr_y, 7},
}
local evt, key, mx, my local evt, key, mx, my
local adjY -- mouse Y adjusted for scroll local adjY -- mouse Y adjusted for scroll
while true do while true do
@ -999,9 +1033,16 @@ local clientInterface = function(srv)
adjY = my + scroll adjY = my + scroll
if inbox[adjY] then if inbox[adjY] then
return "view_mail", {adjY} return "view_mail", {adjY}
else
for key, data in pairs(barCommands) do
if my == data[2] and mx >= data[1] and mx <= data[1] + data[3] - 1 then
os.queueEvent("key", key)
break
end
end
end end
elseif evt == "mouse_scroll" then elseif evt == "mouse_scroll" then
scroll = scroll + key scroll = math.max(0, scroll + key)
elseif evt == "key" then elseif evt == "key" then
if key == keys.n then if key == keys.n then
return "new_mail" return "new_mail"
@ -1039,7 +1080,7 @@ local clientInterface = function(srv)
buffer = unassemble(prebuffer) buffer = unassemble(prebuffer)
end end
local curY = startCursorMY and math.max(1, math.min(startCursorMY - (startY - 1), #buffer)) or 1 local curY = startCursorMY and math.max(1, math.min(startCursorMY - (startY - 1), #buffer)) or 1
local curX = startCursorMX and math.max(1, math.min(startCursorMX - (startX - 1), #buffer[curY] + 1)) or 1 local curX = startCursorMX and math.max(1, math.min(startCursorMX - (startX - 1), #buffer[curY])) or 1
local biggestHeight = math.max(1, #buffer) local biggestHeight = math.max(1, #buffer)
local getLength = function() local getLength = function()
local output = 0 local output = 0
@ -1119,7 +1160,7 @@ local clientInterface = function(srv)
return assemble(buffer), "mouse_click", mx, my return assemble(buffer), "mouse_click", mx, my
else else
curY = math.max(1, math.min(my - (startY - 1), #buffer)) curY = math.max(1, math.min(my - (startY - 1), #buffer))
curX = math.max(1, math.min(mx - (startX - 1), #buffer[curY] + 1)) curX = math.max(1, math.min(mx - (startX - 1), #buffer[curY]))
end end
end end
elseif evt == "key" then elseif evt == "key" then
@ -1293,7 +1334,7 @@ local clientInterface = function(srv)
recip = getNameID(recipient) recip = getNameID(recipient)
end end
if recip then if recip then
client.sendMail(srv, recip, subject, message) client.sendMail(srv, recip, subject, message, attachments)
dialogueBox("Message sent!") dialogueBox("Message sent!")
refresh() refresh()
return return
@ -1317,19 +1358,37 @@ local clientInterface = function(srv)
term.setTextColor(colors.lightGray) term.setTextColor(colors.lightGray)
term.clear() term.clear()
local y local y
writeHeader("From", names[mail.sender], 1) writeHeader("From:", names[mail.sender], 1)
writeHeader("Subject", mail.subject, 2) writeHeader("Subject:", mail.subject, 2)
if type(mail.attachments) == "table" then if getTableLength(mail.attachments) > 0 then
writeHeader("Attachments:","",3) writeHeader("Attachments:","",3)
y = 4 for name, contents in pairs(mail.attachments) do
else term.write(name .. " ")
y = 3 end
y = 5
else
y = 4
end
term.setTextColor(colors.gray)
term.setCursorPos(1, y - 1)
term.write(("="):rep(scr_x))
term.setTextColor(colors.white)
local words = {}
local lines = explode("\n", mail.message, nil, true)
for i = 1, #lines do
local inWords = explode(" ", lines[i], nil, true)
for ii = 1, #inWords do
words[#words+1] = inWords[ii]
end
if i ~= #lines then
words[#words+1] = "\n"
end
end end
local words = explode(" ", mail.message, nil, true)
local buffer = {""} local buffer = {""}
for i = 1, #words do for i = 1, #words do
words[i] = words[i]:gsub("\n", (" "):rep(scr_x)) if words[i] == "\n" then
if #buffer[#buffer] + #words[i] > scr_x then buffer[#buffer+1] = ""
elseif #buffer[#buffer] + #words[i] > scr_x then
buffer[#buffer+1] = words[i] buffer[#buffer+1] = words[i]
else else
buffer[#buffer] = buffer[#buffer] .. words[i] buffer[#buffer] = buffer[#buffer] .. words[i]
@ -1348,9 +1407,30 @@ local clientInterface = function(srv)
term.clearLine() term.clearLine()
keyWrite("Quit ", 1) keyWrite("Quit ", 1)
keyWrite("Reply ", 1) keyWrite("Reply ", 1)
if getTableLength(mail.attachments) > 0 then
keyWrite("DL.Attachments ", 4)
end
keyWrite("Delete ", 1) keyWrite("Delete ", 1)
end end
local downloadAttachments = function()
local path = fs.combine(config.attachmentPath, names[mail.sender])
for name, contents in pairs(mail.attachments) do
writeFile(fs.combine(path, name), contents)
end
return path
end
local barCommands = {
[keys.q] = {1, scr_y, 4},
[keys.r] = {6, scr_y, 5},
}
if getTableLength(mail.attachments) > 0 then
barCommands[keys.a] = {12, scr_y, 14}
barCommands[keys.d] = {27, scr_y, 6}
else
barCommands[keys.d] = {12, scr_y, 6}
end
local evt, key, mx, my local evt, key, mx, my
while true do while true do
render(scroll) render(scroll)
@ -1362,11 +1442,26 @@ local clientInterface = function(srv)
client.deleteMail(srv, mailEntry) client.deleteMail(srv, mailEntry)
refresh() refresh()
return return
elseif key == keys.a then
local path = downloadAttachments()
dialogueBox("DL'd to '" .. path .. "/'")
elseif key == keys.q then elseif key == keys.q then
return "exit" return "exit"
end end
elseif evt == "mouse_click" then
if my == 3 and getTableLength(mail.attachments) > 0 then
local path = downloadAttachments()
dialogueBox("DL'd to '" .. path .. "/'")
else
for key, data in pairs(barCommands) do
if my == data[2] and mx >= data[1] and mx <= data[1] + data[3] - 1 then
os.queueEvent("key", key)
break
end
end
end
elseif evt == "mouse_scroll" then elseif evt == "mouse_scroll" then
scroll = scroll + key scroll = math.max(0, scroll + key)
end end
end end
end end