class RIMS::Protocol::MailDeliveryDecoder

Public Class Methods

new(parent_decoder, drb_services, auth, logger) click to toggle source
Calls superclass method RIMS::Protocol::Decoder::new
# File lib/rims/protocol/decoder.rb, line 2044
def initialize(parent_decoder, drb_services, auth, logger)
  super(auth, logger)
  @parent_decoder = parent_decoder
  @drb_services = drb_services
  @auth = auth
  @last_user_cache_key_username = nil
  @last_user_cache_value_engine = nil
  @logger.debug("RIMS::Protocol::MailDeliveryDecoder#initialize at #{self}") if @logger.debug?
end

Public Instance Methods

append(tag, encoded_mbox_name, *opt_args, msg_text) { |response| ... } click to toggle source
# File lib/rims/protocol/decoder.rb, line 2207
def append(tag, encoded_mbox_name, *opt_args, msg_text)
  username, mbox_name = self.class.decode_delivery_target_mailbox(encoded_mbox_name)
  @logger.info("message delivery: user #{username}, mailbox #{mbox_name}")

  if (@auth.user? username) then
    if (engine_cached? username) then
      engine = engine_cache(username)
      deliver_to_user(tag, username, mbox_name, opt_args, msg_text, engine) {|response|
        yield(response)
      }
    else
      engine = store_engine_cache(username) {
        self.class.make_engine_and_recovery_if_needed(@drb_services, username, logger: @logger) {|untagged_response|
          yield(untagged_response)
          yield(:flush)
        }
      }
      deliver_to_user(tag, username, mbox_name, opt_args, msg_text, engine) {|response|
        yield(response)
      }
    end
  else
    @logger.info('message delivery: not found a user.')
    yield("#{tag} NO not found a user and couldn't deliver a message to the user's mailbox\r\n")
  end
end
auth?() click to toggle source
# File lib/rims/protocol/decoder.rb, line 2090
def auth?
  @drb_services != nil
end
capability(tag) { |strip| ... } click to toggle source
# File lib/rims/protocol/decoder.rb, line 2122
def capability(tag)
  standard_capability(tag) {|response|
    if (response.start_with? '* CAPABILITY ') then
      yield(response.strip + " X-RIMS-MAIL-DELIVERY-USER\r\n")
    else
      yield(response)
    end
  }
end
check(tag, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2235
def check(tag, &block)
  make_not_allowed_command_response(tag, &block)
end
cleanup() click to toggle source
# File lib/rims/protocol/decoder.rb, line 2098
def cleanup
  @logger.debug("RIMS::Protocol::MailDeliveryDecoder#cleanup at #{self}") if @logger.debug?

  release_engine_cache
  @drb_services = nil unless @drb_services.nil?
  @auth = nil unless @auth.nil?

  unless (@parent_decoder.nil?) then
    @parent_decoder.cleanup
    @parent_decoder = nil
  end

  nil
end
close(tag, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2240
def close(tag, &block)
  make_not_allowed_command_response(tag, &block)
end
copy(tag, msg_set, mbox_name, uid: false, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2265
def copy(tag, msg_set, mbox_name, uid: false, &block)
  make_not_allowed_command_response(tag, &block)
end
create(tag, mbox_name, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2148
def create(tag, mbox_name, &block)
  make_not_allowed_command_response(tag, &block)
end
delete(tag, mbox_name, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2153
def delete(tag, mbox_name, &block)
  make_not_allowed_command_response(tag, &block)
end
examine(tag, mbox_name, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2143
def examine(tag, mbox_name, &block)
  make_not_allowed_command_response(tag, &block)
end
expunge(tag, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2245
def expunge(tag, &block)
  make_not_allowed_command_response(tag, &block)
end
fetch(tag, msg_set, data_item_group, uid: false, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2255
def fetch(tag, msg_set, data_item_group, uid: false, &block)
  make_not_allowed_command_response(tag, &block)
end
idle(tag, client_input_gets, server_output_write, connection_timer, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2270
def idle(tag, client_input_gets, server_output_write, connection_timer, &block)
  make_not_allowed_command_response(tag, &block)
end
list(tag, ref_name, mbox_name, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2173
def list(tag, ref_name, mbox_name, &block)
  make_not_allowed_command_response(tag, &block)
end
logout(tag, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2113
def logout(tag, &block)
  @next_decoder = LogoutDecoder.new(self, @logger)
  make_logout_response(tag, &block)
end
lsub(tag, ref_name, mbox_name, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2178
def lsub(tag, ref_name, mbox_name, &block)
  make_not_allowed_command_response(tag, &block)
end
rename(tag, src_name, dst_name, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2158
def rename(tag, src_name, dst_name, &block)
  make_not_allowed_command_response(tag, &block)
end
select(tag, mbox_name, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2138
def select(tag, mbox_name, &block)
  make_not_allowed_command_response(tag, &block)
end
selected?() click to toggle source
# File lib/rims/protocol/decoder.rb, line 2094
def selected?
  false
end
status(tag, mbox_name, data_item_group, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2183
def status(tag, mbox_name, data_item_group, &block)
  make_not_allowed_command_response(tag, &block)
end
store(tag, msg_set, data_item_name, data_item_value, uid: false, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2260
def store(tag, msg_set, data_item_name, data_item_value, uid: false, &block)
  make_not_allowed_command_response(tag, &block)
end
subscribe(tag, mbox_name, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2163
def subscribe(tag, mbox_name, &block)
  make_not_allowed_command_response(tag, &block)
end
unsubscribe(tag, mbox_name, &block) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2168
def unsubscribe(tag, mbox_name, &block)
  make_not_allowed_command_response(tag, &block)
end

Private Instance Methods

deliver_to_user(tag, username, mbox_name, opt_args, msg_text, engine) { |response| ... } click to toggle source
# File lib/rims/protocol/decoder.rb, line 2188
def deliver_to_user(tag, username, mbox_name, opt_args, msg_text, engine)
  user_decoder = UserMailboxDecoder.new(self, engine, @auth, @logger)
  begin
    last_response = nil
    user_decoder.append(tag, mbox_name, *opt_args, msg_text) {|response|
      last_response = response
      yield(response)
    }
    if (last_response.split(' ', 3)[1] == 'OK') then
      @logger.info("message delivery: successed to deliver #{msg_text.bytesize} octets message.")
    else
      @logger.info("message delivery: failed to deliver message.")
    end
  ensure
    user_decoder.cleanup(not_cleanup_parent: true)
  end
end
engine_cache(username) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2059
def engine_cache(username)
  unless (engine_cached? username) then
    raise "not cached: #{username}"
  end
  @last_user_cache_value_engine
end
engine_cached?(username) click to toggle source
# File lib/rims/protocol/decoder.rb, line 2054
def engine_cached?(username)
  @last_user_cache_key_username == username
end
make_not_allowed_command_response(tag) { |"#{tag} NO not allowed command on mail delivery user\r\n"| ... } click to toggle source
# File lib/rims/protocol/decoder.rb, line 2133
def make_not_allowed_command_response(tag)
  yield("#{tag} NO not allowed command on mail delivery user\r\n")
end
release_engine_cache() click to toggle source
# File lib/rims/protocol/decoder.rb, line 2080
def release_engine_cache
  if (@last_user_cache_value_engine) then
    engine = @last_user_cache_value_engine
    @last_user_cache_key_username = nil
    @last_user_cache_value_engine = nil
    engine.destroy
  end
end
store_engine_cache(username) { || ... } click to toggle source
# File lib/rims/protocol/decoder.rb, line 2067
def store_engine_cache(username)
  if (engine_cached? username) then
    raise "already cached: #{username}"
  end

  release_engine_cache
  @last_user_cache_value_engine = yield
  @last_user_cache_key_username = username # success to store engine cache

  @last_user_cache_value_engine
end