Valid Hostname

Run Rubocop Tests Gem Version

Description

Extension to ActiveModel for validating hostnames and domain names.

Features

  • Adds validation for hostnames to ActiveModel
  • Supports I18n for the error messages

Installation

in Gemfile

gem 'valid_hostname', '~> 2.0'

Run bundler

  bundle install

Validations performed

  • maximum length of hostname is 255 characters
  • maximum length of each hostname label is 63 characters
  • characters allowed in hostname labels are a-z, A-Z, 0-9 and hyphen
  • labels do not begin or end with a hyphen
  • labels do not consist of numeric values only

Options

  • option to allow for underscores in hostname labels
  • option to require that the last label is a valid TLD (ie. require that the name is a FQDN)
  • option to allow numeric values in the first label of the hostname (exception: the hostname cannot consist of a single numeric label)
  • option to specify a list of valid TLDs
  • options to allow for wildcard hostname in first label (for use with DNS)
  • option to configure error message. verbose: true creates detailed error messages. (only used by )

See also https://www.zytrax.com/books/dns/apa/names.html

How to use

Simple usage

  class Record < ActiveRecord::Base
    validates :name, hostname: true
  end

With options

  class Record < ActiveRecord::Base
    validates :name, hostname: { OPTIONS }
  end

or static usage

  ValidateHostname.valid?('localhost')

or static usage with options

  ValidateHostname.valid?('localhost', OPTIONS)

Options and their defaults

  • allow_underscore: false
  • require_valid_tld: false
  • valid_tlds: Array of allowed TLDs (can only be used with require_valid_tld: true)
  • allow_numeric_hostname: false
  • allow_wildcard_hostname: false
  • allow_root_label: false
  • verbose: true

Examples

Without options

  class Record < ActiveRecord::Base
    validates :host, hostname: true
  end
  >> @record = Record.new :name => 'horse'
  >> @record.save
  => true
  >> @record2 = Record.new :name => '_horse'
  >> @record2.save
  => false

With :allow_underscore

  class Record < ActiveRecord::Base
    validates :name, hostname: { allow_underscore: true }
  end
  >> @record3 = Record.new :name => '_horse'
  >> @record3.save
  => true

With :require_valid_tld

  class Record < ActiveRecord::Base
    validates :name, hostname: { require_valid_tld: true }
  end
  >> @record4 = Record.new :name => 'horse'
  >> @record4.save
  => false
  >> @record5 = Record.new :name => 'horse.com'
  >> @record5.save
  => true

With :valid_tlds

  class Record < ActiveRecord::Base
    validates :name, hostname: { :require_valid_tld, valid_tlds: %w[com org net] }
  end
  >> @record6 = Record.new :name => 'horse.info'
  >> @record6.save
  => false

With :allow_numeric_hostname

  class Record < ActiveRecord::Base
    validates :name, hostname: { allow_numeric_hostname: false }
  end
  >> @record7 = Record.new :name => '123.info'
  >> @record7.save
  => false

With :allow_wildcard_hostname

  class Record < ActiveRecord::Base
    validates :name, hostname: { allow_wildcard_hostname: true }
  end
  >> @record8 = Record.new :name => '*.123.info'
  >> @record8.save
  => true

Extra validators

domainname

  • sets require_valid_tld: true
  • sets allow_numeric_hostname: true
  • returns error if there is only one label and this label is numeric

Credits

This gem is a fork of https://github.com/KimNorgaard.

Copyright (c) 2009-2022 Kim Norgaard. See LICENSE for details Copyright (c) 2022 Alexander Meindl. See LICENSE for details