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