imap.rb/lib/imap_server/client_handler/select.rb
2022-12-10 01:45:41 +01:00

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