Sha256: 74d1e28252879785231fff000525ece199844062d092da660c793e0affd4c93d

Contents?: true

Size: 1.78 KB

Versions: 1

Compression:

Stored size: 1.78 KB

Contents

require "reredos/version"

module Reredos
  class Error < StandardError; end
  EMAIL_MAX_LENGTH        = 256 # メールアドレスの最大長
  DOMAIN_MAX_LENGTH       = 255 # ドメインの最大長
  DOMAIN_LABEL_MAX_LENGTH = 63  # ドメインラベルの最大長
  USERNAME_MAX_LENGTH     = 64  # ユーザネームの最大長

  class << self
    def valid_email?(str)
      return false if str.length > EMAIL_MAX_LENGTH
      return false if str.count('@') != 1 # @は一度だけ

      username, domain = str.split('@')
      valid_username?(username) && valid_domain?(domain)
    end

    private

    def valid_domain?(str)
      return false if str.length > DOMAIN_MAX_LENGTH
      return false unless str.split('.').all? { |l| valid_label?(l) }

      true
    end

    def valid_username?(str)
      return false if str.length > USERNAME_MAX_LENGTH
      return false if str[0] == '.' || str[-1] == '.'
      /\A[0-9a-zA-Z\.\+\-\_]+\z/ === str # 既定の文字のみで構成されている
    end

    # ラベルはアルファベットで始まり、アルファベットか数字かハイフンが続き、アルファベットか数字で終わる
    def valid_label?(str)
      return false if str.empty?
      return false if str.length > DOMAIN_LABEL_MAX_LENGTH
      return false unless letter?(str[0])
      return false unless alphanumeric?(str[-1])
      return true if str[1...-1].empty?

      str[1...-1].chars.all? { |c| hyphen_or_alphanumeric?(c) }
    end

    def letter?(char)
      ('a'..'z').include?(char) || ('A'..'Z').include?(char)
    end

    def digit?(char)
      ('0'..'9').include?(char)
    end

    def alphanumeric?(char)
      letter?(char) || digit?(char)
    end

    def hyphen_or_alphanumeric?(char)
      char == '-' || alphanumeric?(char)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
reredos-0.1.2 lib/reredos.rb