41 lines
1.7 KiB
Ruby
41 lines
1.7 KiB
Ruby
class ImapServer
|
|
class ClientHandler
|
|
module Select
|
|
|
|
# TODO: factorize with EXAMINE
|
|
# S: * 172 EXISTS
|
|
# S: * 1 RECENT
|
|
# S: * OK [UNSEEN 12] Message 12 is first unseen
|
|
# S: * OK [UIDVALIDITY 3857529045] UIDs valid
|
|
# S: * OK [UIDNEXT 4392] Predicted next UID
|
|
# S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
|
|
# S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited
|
|
# S: A142 OK [READ-WRITE] SELECT completed
|
|
def handle_select(msg:, user:)
|
|
return msg.error_need_loggin if !user
|
|
return msg.respond ServerMessage.new("BAD requires a folder name", tag: msg.tag) if msg.args.size != 1
|
|
|
|
handle_selected_folder(msg: msg, user:, mailbox_path: msg.args.first)
|
|
end
|
|
|
|
FLAGS = %w[\\Answered \\Flagged \\Deleted \\Seen \\Draft].freeze
|
|
FLAGS_STR = FLAGS.join(" ").freeze
|
|
|
|
def handle_selected_folder(msg:, user:, mailbox_path:)
|
|
mailbox = Mailbox.first(user: user, path: mailbox_path)
|
|
return msg.respond ServerMessage.new("KO mailbox #{mailbox_path} do not exists") if !mailbox
|
|
|
|
msg.handler.selected = mailbox
|
|
msg.respond ServerMessage.new("OK #{mailbox.exists} EXISTS", tag: msg.tag)
|
|
msg.respond ServerMessage.new("OK #{mailbox.recents} RECENTS", tag: msg.tag)
|
|
msg.respond ServerMessage.new("OK #{mailbox.unseens} UNSEEN", tag: msg.tag)
|
|
msg.respond ServerMessage.new("OK #{mailbox.id} UIDVALIDITY", tag: msg.tag)
|
|
msg.respond ServerMessage.new("OK #{mailbox.mails_next_uid} UIDNEXT", tag: msg.tag)
|
|
msg.respond ServerMessage.new("FLAGS (#{FLAGS_STR})", tag: msg.tag)
|
|
msg.respond ServerMessage.new("OK SELECT completed", tag: msg.tag)
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|