rotp-2.1.1/0000755000175000017500000000000012540024327013764 5ustar balasankarcbalasankarcrotp-2.1.1/Gemfile0000644000175000017500000000004512540024327015256 0ustar balasankarcbalasankarcsource 'http://rubygems.org' gemspec rotp-2.1.1/.gitignore0000644000175000017500000000003412540024327015751 0ustar balasankarcbalasankarc*.gem .bundle .yardoc pkg/* rotp-2.1.1/Rakefile0000644000175000017500000000030212540024327015424 0ustar balasankarcbalasankarcrequire 'bundler' Bundler::GemHelper.install_tasks require "rspec/core/rake_task" RSpec::Core::RakeTask.new(:rspec) do |spec| spec.pattern = 'spec/**/*_spec.rb' end task :default => :rspec rotp-2.1.1/metadata.yml0000644000175000017500000000657412540024327016303 0ustar balasankarcbalasankarc--- !ruby/object:Gem::Specification name: rotp version: !ruby/object:Gem::Version version: 2.1.1 platform: ruby authors: - Mark Percival autorequire: bindir: bin cert_chain: [] date: 2015-06-03 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: guard-rspec requirement: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version version: '4.5' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version version: '4.5' - !ruby/object:Gem::Dependency name: rake requirement: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version version: '10.4' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version version: '10.4' - !ruby/object:Gem::Dependency name: rspec requirement: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version version: '3.1' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version version: '3.1' - !ruby/object:Gem::Dependency name: timecop requirement: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version version: '0.7' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version version: '0.7' description: Works for both HOTP and TOTP, and includes QR Code provisioning email: - mark@markpercival.us executables: - rotp extensions: [] extra_rdoc_files: [] files: - ".gitignore" - ".travis.yml" - CHANGELOG.md - Gemfile - Gemfile.lock - Guardfile - LICENSE - README.md - Rakefile - bin/rotp - doc/ROTP/HOTP.html - doc/ROTP/OTP.html - doc/ROTP/TOTP.html - doc/Rotp.html - doc/_index.html - doc/class_list.html - doc/css/common.css - doc/css/full_list.css - doc/css/style.css - doc/file.README.html - doc/file_list.html - doc/frames.html - doc/index.html - doc/js/app.js - doc/js/full_list.js - doc/js/jquery.js - doc/method_list.html - doc/top-level-namespace.html - lib/rotp.rb - lib/rotp/arguments.rb - lib/rotp/base32.rb - lib/rotp/cli.rb - lib/rotp/hotp.rb - lib/rotp/otp.rb - lib/rotp/totp.rb - lib/rotp/version.rb - rotp.gemspec - spec/lib/rotp/arguments_spec.rb - spec/lib/rotp/base32_spec.rb - spec/lib/rotp/cli_spec.rb - spec/lib/rotp/hotp_spec.rb - spec/lib/rotp/totp_spec.rb - spec/spec_helper.rb homepage: http://github.com/mdp/rotp licenses: - MIT metadata: {} post_install_message: rdoc_options: [] require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' required_rubygems_version: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' requirements: [] rubyforge_project: rotp rubygems_version: 2.2.2 signing_key: specification_version: 4 summary: A Ruby library for generating and verifying one time passwords test_files: - spec/lib/rotp/arguments_spec.rb - spec/lib/rotp/base32_spec.rb - spec/lib/rotp/cli_spec.rb - spec/lib/rotp/hotp_spec.rb - spec/lib/rotp/totp_spec.rb - spec/spec_helper.rb rotp-2.1.1/lib/0000755000175000017500000000000012540024327014532 5ustar balasankarcbalasankarcrotp-2.1.1/lib/rotp/0000755000175000017500000000000012540024327015516 5ustar balasankarcbalasankarcrotp-2.1.1/lib/rotp/version.rb0000644000175000017500000000004412540024327017526 0ustar balasankarcbalasankarcmodule ROTP VERSION = "2.1.1" end rotp-2.1.1/lib/rotp/cli.rb0000644000175000017500000000250312540024327016612 0ustar balasankarcbalasankarcrequire 'rotp/arguments' module ROTP class CLI attr_reader :filename, :argv def initialize(filename, argv) @filename = filename @argv = argv end def run puts output end def errors if [:time, :hmac].include?(options.mode) if options.secret.to_s == '' red 'You must also specify a --secret. Try --help for help.' elsif options.secret.to_s.chars.any? { |c| ROTP::Base32::CHARS.index(c.downcase) == nil } red 'Secret must be in RFC4648 Base32 format - http://en.wikipedia.org/wiki/Base32#RFC_4648_Base32_alphabet' end elsif options.mode == :hmac && options.counter.to_i < 0 red 'You must also specify a --counter. Try --help for help.' end end def output return options.warnings if options.warnings return errors if errors return arguments.to_s if options.mode == :help if options.mode == :time ROTP::TOTP.new(options.secret).now elsif options.mode == :hmac ROTP::HOTP.new(options.secret).at options.counter else fail NotImplementedError end end def arguments @arguments ||= ROTP::Arguments.new(filename, argv) end def options arguments.options end def red(string) "\033[31m#{string}\033[0m" end end end rotp-2.1.1/lib/rotp/otp.rb0000644000175000017500000000473412540024327016655 0ustar balasankarcbalasankarcmodule ROTP class OTP attr_reader :secret, :digits, :digest # @param [String] secret in the form of base32 # @option options digits [Integer] (6) # Number of integers in the OTP # Google Authenticate only supports 6 currently # @option options digest [String] (sha1) # Digest used in the HMAC # Google Authenticate only supports 'sha1' currently # @returns [OTP] OTP instantiation def initialize(s, options = {}) @digits = options[:digits] || 6 @digest = options[:digest] || "sha1" @secret = s end # @param [Integer] input the number used seed the HMAC # @option padded [Boolean] (false) Output the otp as a 0 padded string # Usually either the counter, or the computed integer # based on the Unix timestamp def generate_otp(input, padded=true) hmac = OpenSSL::HMAC.digest( OpenSSL::Digest.new(digest), byte_secret, int_to_bytestring(input) ) offset = hmac[-1].ord & 0xf code = (hmac[offset].ord & 0x7f) << 24 | (hmac[offset + 1].ord & 0xff) << 16 | (hmac[offset + 2].ord & 0xff) << 8 | (hmac[offset + 3].ord & 0xff) if padded (code % 10 ** digits).to_s.rjust(digits, '0') else code % 10 ** digits end end private def verify(input, generated) unless input.is_a?(String) && generated.is_a?(String) raise ArgumentError, "ROTP only verifies strings - See: https://github.com/mdp/rotp/issues/32" end time_constant_compare(input, generated) end def byte_secret Base32.decode(@secret) end # Turns an integer to the OATH specified # bytestring, which is fed to the HMAC # along with the secret # def int_to_bytestring(int, padding = 8) result = [] until int == 0 result << (int & 0xFF).chr int >>= 8 end result.reverse.join.rjust(padding, 0.chr) end # A very simple param encoder def encode_params(uri, params) params_str = "?" params.each do |k,v| if v params_str << "#{k}=#{CGI::escape(v.to_s)}&" end end params_str.chop! uri + params_str end # constant-time compare the strings def time_constant_compare(a, b) return false if a.empty? || b.empty? || a.bytesize != b.bytesize l = a.unpack "C#{a.bytesize}" res = 0 b.each_byte { |byte| res |= byte ^ l.shift } res == 0 end end end rotp-2.1.1/lib/rotp/hotp.rb0000644000175000017500000000310712540024327017016 0ustar balasankarcbalasankarcmodule ROTP class HOTP < OTP # Generates the OTP for the given count # @param [Integer] count counter # @option [Boolean] padding (false) Issue the number as a 0 padded string # @returns [Integer] OTP def at(count, padding=true) generate_otp(count, padding) end # Verifies the OTP passed in against the current time OTP # @param [String/Integer] otp the OTP to check against # @param [Integer] counter the counter of the OTP def verify(otp, counter) super(otp, self.at(counter)) end # Verifies the OTP passed in against the current time OTP, with a given number of retries. # Returns the counter that was verified successfully # @param [String/Integer] otp the OTP to check against # @param [Integer] initial counter the counter of the OTP # @param [Integer] number of retries def verify_with_retries(otp, initial_count, retries = 1) return false if retries <= 0 1.upto(retries) do |counter| current_counter = initial_count + counter return current_counter if verify(otp, current_counter) end false end # Returns the provisioning URI for the OTP # This can then be encoded in a QR Code and used # to provision the Google Authenticator app # @param [String] name of the account # @param [Integer] initial_count starting counter value, defaults to 0 # @return [String] provisioning uri def provisioning_uri(name, initial_count=0) encode_params("otpauth://hotp/#{URI.encode(name)}", :secret=>secret, :counter=>initial_count) end end end rotp-2.1.1/lib/rotp/totp.rb0000644000175000017500000000421712540024327017035 0ustar balasankarcbalasankarcmodule ROTP DEFAULT_INTERVAL = 30 class TOTP < OTP attr_reader :interval, :issuer # @option options [Integer] interval (30) the time interval in seconds for OTP # This defaults to 30 which is standard. def initialize(s, options = {}) @interval = options[:interval] || DEFAULT_INTERVAL @issuer = options[:issuer] super end # Accepts either a Unix timestamp integer or a Time object. # Time objects will be adjusted to UTC automatically # @param [Time/Integer] time the time to generate an OTP for # @option [Boolean] padding (true) Issue the number as a 0 padded string def at(time, padding=true) unless time.class == Time time = Time.at(time.to_i) end generate_otp(timecode(time), padding) end # Generate the current time OTP # @return [Integer] the OTP as an integer def now(padding=true) generate_otp(timecode(Time.now), padding) end # Verifies the OTP passed in against the current time OTP # @param [String/Integer] otp the OTP to check against def verify(otp, time = Time.now) super(otp, self.at(time)) end # Verifies the OTP passed in against the current time OTP # and adjacent intervals up to +drift+. # @param [String] otp the OTP to check against # @param [Integer] drift the number of seconds that the client # and server are allowed to drift apart def verify_with_drift(otp, drift, time = Time.now) time = time.to_i times = (time-drift..time+drift).step(interval).to_a times << time + drift if times.last < time + drift times.any? { |ti| verify(otp, ti) } end # Returns the provisioning URI for the OTP # This can then be encoded in a QR Code and used # to provision the Google Authenticator app # @param [String] name of the account # @return [String] provisioning uri def provisioning_uri(name) encode_params("otpauth://totp/#{URI.encode(name)}", :secret => secret, :period => (interval==30 ? nil : interval), :issuer => issuer) end private def timecode(time) time.utc.to_i / interval end end end rotp-2.1.1/lib/rotp/base32.rb0000644000175000017500000000262312540024327017125 0ustar balasankarcbalasankarcmodule ROTP class Base32 class Base32Error < RuntimeError; end CHARS = "abcdefghijklmnopqrstuvwxyz234567".each_char.to_a class << self def decode(str) output = [] str.scan(/.{1,8}/).each do |block| char_array = decode_block(block).map{|c| c.chr} output << char_array end output.join end def random_base32(length=16) b32 = '' OpenSSL::Random.random_bytes(length).each_byte do |b| b32 << CHARS[b % 32] end b32 end private def decode_block(block) length = block.scan(/[^=]/).length quints = block.each_char.map {|c| decode_quint(c)} bytes = [] bytes[0] = (quints[0] << 3) + (quints[1] ? quints[1] >> 2 : 0) return bytes if length < 3 bytes[1] = ((quints[1] & 3) << 6) + (quints[2] << 1) + (quints[3] ? quints[3] >> 4 : 0) return bytes if length < 4 bytes[2] = ((quints[3] & 15) << 4) + (quints[4] ? quints[4] >> 1 : 0) return bytes if length < 6 bytes[3] = ((quints[4] & 1) << 7) + (quints[5] << 2) + (quints[6] ? quints[6] >> 3 : 0) return bytes if length < 7 bytes[4] = ((quints[6] & 7) << 5) + (quints[7] || 0) bytes end def decode_quint(q) CHARS.index(q.downcase) or raise(Base32Error, "Invalid Base32 Character - '#{q}'") end end end end rotp-2.1.1/lib/rotp/arguments.rb0000644000175000017500000000424312540024327020053 0ustar balasankarcbalasankarcrequire 'optparse' require 'ostruct' module ROTP class Arguments def initialize(filename, arguments) @filename = filename @arguments = Array(arguments) end def options parse options! end def to_s parser.help + "\n" end private attr_reader :arguments, :filename def options! @options ||= default_options end def default_options OpenStruct.new time: true, counter: 0, mode: :time end def parse return options!.mode = :help if arguments.empty? parser.parse arguments rescue OptionParser::InvalidOption => exception options!.mode = :help options!.warnings = red(exception.message + '. Try --help for help.') end def parser OptionParser.new do |parser| parser.banner = '' parser.separator green(' Usage: ') + bold("#{filename} [options]") parser.separator '' parser.separator green ' Examples: ' parser.separator ' ' + bold("#{filename} --secret p4ssword") + ' # Generates a time-based one-time password' parser.separator ' ' + bold("#{filename} --hmac --secret p4ssword --counter 42") + ' # Generates a counter-based one-time password' parser.separator '' parser.separator green ' Options:' parser.on('-s', '--secret [SECRET]', 'The shared secret') do |secret| options!.secret = secret end parser.on('-c', '--counter [COUNTER]', 'The counter for counter-based hmac OTP') do |counter| options!.counter = counter.to_i end parser.on('-t', '--time', 'Use time-based OTP according to RFC 6238 (default)') do options!.mode = :time end parser.on('-m', '--hmac', 'Use counter-based OTP according to RFC 4226') do options!.mode = :hmac end parser.on_tail('-h', '--help', 'Show this message') do options!.mode = :help end end end def bold(string) "\033[1m#{string}\033[22m" end def green(string) "\033[32m#{string}\033[0m" end def red(string) "\033[31m#{string}\033[0m" end end end rotp-2.1.1/lib/rotp.rb0000644000175000017500000000022112540024327016036 0ustar balasankarcbalasankarcrequire 'cgi' require 'uri' require 'openssl' require 'rotp/base32' require 'rotp/otp' require 'rotp/hotp' require 'rotp/totp' module ROTP end rotp-2.1.1/LICENSE0000644000175000017500000000205712540024327014775 0ustar balasankarcbalasankarcCopyright (C) 2011 by Mark Percival Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rotp-2.1.1/bin/0000755000175000017500000000000012540024327014534 5ustar balasankarcbalasankarcrotp-2.1.1/bin/rotp0000755000175000017500000000022712540024327015447 0ustar balasankarcbalasankarc#!/usr/bin/env ruby $: << File.expand_path('../../lib', __FILE__) require 'rotp' require 'rotp/cli' ROTP::CLI.new(File.basename(__FILE__), ARGV).run rotp-2.1.1/doc/0000755000175000017500000000000012540024327014531 5ustar balasankarcbalasankarcrotp-2.1.1/doc/Rotp.html0000644000175000017500000001203512540024327016344 0ustar balasankarcbalasankarc Module: ROTP

Module: ROTP

Defined in:
lib/rotp.rb,
lib/rotp/otp.rb,
lib/rotp/totp.rb,
lib/rotp/hotp.rb

Defined Under Namespace

Classes: HOTP, OTP, TOTP

Constant Summary

BASE32 =
'abcdefghijklmnopqrstuvwxyz234567'

Class Method Summary (collapse)

Class Method Details

+ (Object) random_base32(length = 16)



10
11
12
13
14
15
# File 'lib/rotp.rb', line 10

def self.random_base32(length=16)
  b32 = ''
  OpenSSL::Random.random_bytes(length).each_byte do |b|
    BASE32[b % 32, 1]
  end
end
rotp-2.1.1/doc/css/0000755000175000017500000000000012540024327015321 5ustar balasankarcbalasankarcrotp-2.1.1/doc/css/style.css0000644000175000017500000003747512540024327017213 0ustar balasankarcbalasankarcbody { padding: 0 20px; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; font-size: 13px; } body.frames { padding: 0 5px; } h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dotted #d5d5d5; } h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; } h1.title { margin-bottom: 10px; } h1.alphaindex { margin-top: 0; font-size: 22px; } h2 { padding: 0; padding-bottom: 3px; border-bottom: 1px #aaa solid; font-size: 1.4em; margin: 1.8em 0 0.5em; } h2 small { font-weight: normal; font-size: 0.7em; display: block; float: right; } .clear { clear: both; } .inline { display: inline; } .inline p:first-child { display: inline; } .docstring h1, .docstring h2, .docstring h3, .docstring h4 { padding: 0; border: 0; border-bottom: 1px dotted #bbb; } .docstring h1 { font-size: 1.2em; } .docstring h2 { font-size: 1.1em; } .docstring h3, .docstring h4 { font-size: 1em; border-bottom: 0; padding-top: 10px; } .docstring .object_link { font-family: monospace; } .note { color: #222; -moz-border-radius: 3px; -webkit-border-radius: 3px; background: #e3e4e3; border: 1px solid #d5d5d5; padding: 7px 10px; display: block; } .note.todo { background: #ffffc5; border-color: #ececaa; } .note.returns_void { background: #efefef; } .note.deprecated { background: #ffe5e5; border-color: #e9dada; } .note.private { background: #ffffc5; border-color: #ececaa; } .note.title { text-transform: lowercase; padding: 1px 5px; font-size: 0.9em; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; display: inline; } .summary_signature + .note.title { margin-left: 7px; } h1 .note.title { font-size: 0.5em; font-weight: normal; padding: 3px 5px; position: relative; top: -3px; text-transform: capitalize; } .note.title.constructor { color: #fff; background: #6a98d6; border-color: #6689d6; } .note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; } .note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; } .note.title.private { background: #d5d5d5; border-color: #c5c5c5; } .discussion .note { margin-top: 6px; } .discussion .note:first-child { margin-top: 0; } h3.inherited { font-style: italic; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; font-weight: normal; padding: 0; margin: 0; margin-top: 12px; margin-bottom: 3px; font-size: 13px; } p.inherited { padding: 0; margin: 0; margin-left: 25px; } dl.box { width: 520px; font-size: 1em; } dl.box dt { float: left; display: block; width: 100px; margin: 0; text-align: right; font-weight: bold; border: 1px solid #aaa; border-width: 1px 0px 0px 1px; padding: 6px 0; padding-right: 10px; } dl.box dd { float: left; display: block; width: 380px; margin: 0; padding: 6px 0; padding-right: 20px; border: 1px solid #aaa; border-width: 1px 1px 0 0; } dl.box .last { border-bottom: 1px solid #aaa; } dl.box .r1 { background: #eee; } ul.toplevel { list-style: none; padding-left: 0; font-size: 1.1em; } #files { padding-left: 15px; font-size: 1.1em; } #files { padding: 0; } #files li { list-style: none; display: inline; padding: 7px 12px; line-height: 35px; } dl.constants { margin-left: 40px; } dl.constants dt { font-weight: bold; font-size: 1.1em; margin-bottom: 5px; } dl.constants dd { width: 75%; white-space: pre; font-family: monospace; margin-bottom: 18px; } .summary_desc { margin-left: 32px; display: block; font-family: sans-serif; } .summary_desc tt { font-size: 0.9em; } dl.constants .note { padding: 2px 6px; padding-right: 12px; margin-top: 6px; } dl.constants .docstring { margin-left: 32px; font-size: 0.9em; font-weight: normal; } dl.constants .tags { padding-left: 32px; font-size: 0.9em; line-height: 0.8em; } dl.constants .discussion *:first-child { margin-top: 0; } dl.constants .discussion *:last-child { margin-bottom: 0; } .method_details { border-top: 1px dotted #aaa; margin-top: 15px; padding-top: 0; } .method_details.first { border: 0; } p.signature { font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace; padding: 6px 10px; margin-top: 18px; background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px; } p.signature tt { font-family: Monaco, Consolas, Courier, monospace; } p.signature .overload { display: block; } p.signature .extras { font-weight: normal; font-family: sans-serif; color: #444; font-size: 1em; } p.signature .aliases { display: block; font-weight: normal; font-size: 0.9em; font-family: sans-serif; margin-top: 0px; color: #555; } p.signature .aliases .names { font-family: Monaco, Consolas, Courier, monospace; font-weight: bold; color: #000; font-size: 1.2em; } .tags h3 { font-size: 1em; margin-bottom: 0; } .tags ul { margin-top: 5px; padding-left: 30px; list-style: square; } .tags ul li { margin-bottom: 3px; } .tags ul .name { font-family: monospace; font-weight: bold; } .tags ul .note { padding: 3px 6px; } .tags { margin-bottom: 12px; } .tags .examples h3 { margin-bottom: 10px; } .tags .examples h4 { padding: 0; margin: 0; margin-left: 15px; font-weight: bold; font-size: 0.9em; } .tags .overload .overload_item { list-style: none; margin-bottom: 25px; } .tags .overload .overload_item .signature { padding: 2px 8px; background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px; } .tags .overload .signature { margin-left: -15px; font-family: monospace; display: block; font-size: 1.1em; } .tags .overload .docstring { margin-top: 15px; } .defines { display: none; } #method_missing_details .notice.this { position: relative; top: -8px; color: #888; padding: 0; margin: 0; } .showSource { font-size: 0.9em; } .showSource a:link, .showSource a:visited { text-decoration: none; color: #666; } #content a:link, #content a:visited { text-decoration: none; color: #05a; } #content a:hover { background: #ffffa5; } .docstring { margin-right: 6em; } ul.summary { list-style: none; font-family: monospace; font-size: 1em; line-height: 1.5em; } ul.summary a:link, ul.summary a:visited { text-decoration: none; font-size: 1.1em; } ul.summary li { margin-bottom: 5px; } .summary .summary_signature { padding: 1px 10px; background: #eaeaff; border: 1px solid #dfdfe5; -moz-border-radius: 3px; -webkit-border-radius: 3px; } .summary_signature:hover { background: #eeeeff; cursor: pointer; } ul.summary.compact li { display: inline-block; margin: 0px 5px 0px 0px; line-height: 2.6em;} ul.summary.compact .summary_signature { padding: 5px 7px; padding-right: 4px; } #content .summary_signature:hover a:link, #content .summary_signature:hover a:visited { background: transparent; color: #48f; } p.inherited a { font-family: monospace; font-size: 0.9em; } p.inherited { word-spacing: 5px; font-size: 1.2em; } p.children { font-size: 1.2em; } p.children a { font-size: 0.9em; } p.children strong { font-size: 0.8em; } p.children strong.modules { padding-left: 5px; } ul.fullTree { display: none; padding-left: 0; list-style: none; margin-left: 0; margin-bottom: 10px; } ul.fullTree ul { margin-left: 0; padding-left: 0; list-style: none; } ul.fullTree li { text-align: center; padding-top: 18px; padding-bottom: 12px; background: url(data:image/gif;base64,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) no-repeat top center; } ul.fullTree li:first-child { padding-top: 0; background: transparent; } ul.fullTree li:last-child { padding-bottom: 0; } .showAll ul.fullTree { display: block; } .showAll .inheritName { display: none; } #search { position: absolute; right: 14px; top: 0px; } #search a:link, #search a:visited { display: block; float: left; margin-right: 4px; padding: 8px 10px; text-decoration: none; color: #05a; border: 1px solid #d8d8e5; -moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px; -webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px; background: #eaf0ff; -webkit-box-shadow: -1px 1px 3px #ddd; } #search a:hover { background: #f5faff; color: #06b; } #search a.active { background: #568; padding-bottom: 20px; color: #fff; border: 1px solid #457; -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px; } #search a.inactive { color: #999; } .frames #search { display: none; } .inheritanceTree, .toggleDefines { float: right; } #menu { font-size: 1.3em; color: #bbb; top: -5px; position: relative; } #menu .title, #menu a { font-size: 0.7em; } #menu .title a { font-size: 1em; } #menu .title { color: #555; } #menu a:link, #menu a:visited { color: #333; text-decoration: none; border-bottom: 1px dotted #bbd; } #menu a:hover { color: #05a; } #menu .noframes { display: none; } .frames #menu .noframes { display: inline; float: right; } #footer { margin-top: 15px; border-top: 1px solid #ccc; text-align: center; padding: 7px 0; color: #999; } #footer a:link, #footer a:visited { color: #444; text-decoration: none; border-bottom: 1px dotted #bbd; } #footer a:hover { color: #05a; } #listing ul.alpha { font-size: 1.1em; } #listing ul.alpha { margin: 0; padding: 0; padding-bottom: 10px; list-style: none; } #listing ul.alpha li.letter { font-size: 1.4em; padding-bottom: 10px; } #listing ul.alpha ul { margin: 0; padding-left: 15px; } #listing ul small { color: #666; font-size: 0.7em; } li.r1 { background: #f0f0f0; } li.r2 { background: #fafafa; } #search_frame { z-index: 9999; background: #fff; display: none; position: absolute; top: 36px; right: 18px; width: 500px; height: 80%; overflow-y: scroll; border: 1px solid #999; border-collapse: collapse; -webkit-box-shadow: -7px 5px 25px #aaa; -moz-box-shadow: -7px 5px 25px #aaa; -moz-border-radius: 2px; -webkit-border-radius: 2px; } #content ul.summary li.deprecated a:link, #content ul.summary li.deprecated a:visited { text-decoration: line-through; font-style: italic; } #toc { padding: 20px; padding-right: 30px; border: 1px solid #ddd; float: right; background: #fff; margin-left: 20px; margin-bottom: 20px; max-width: 300px; -webkit-box-shadow: -2px 2px 6px #bbb; -moz-box-shadow: -2px 2px 6px #bbb; z-index: 5000; position: relative; } #toc.nofloat { float: none; max-width: none; border: none; padding: 0; margin: 20px 0; -webkit-box-shadow: none; -moz-box-shadow: none; } #toc.nofloat.hidden { padding: 0; background: 0; margin-bottom: 5px; } #toc .title { margin: 0; } #toc ol { padding-left: 1.8em; } #toc li { font-size: 1.1em; line-height: 1.7em; } #toc > ol > li { font-size: 1.1em; font-weight: bold; } #toc ol > ol { font-size: 0.9em; } #toc ol ol > ol { padding-left: 2.3em; } #toc ol + li { margin-top: 0.3em; } #toc.hidden { padding: 10px; background: #f6f6f6; -webkit-box-shadow: none; -moz-box-shadow: none; } #filecontents h1 + #toc.nofloat { margin-top: 0; } /* syntax highlighting */ .source_code { display: none; padding: 3px 8px; border-left: 8px solid #ddd; margin-top: 5px; } #filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; } #filecontents pre.code, .docstring pre.code { display: block; } .source_code .lines { padding-right: 12px; color: #555; text-align: right; } #filecontents pre.code, .docstring pre.code, .tags .example { padding: 5px 12px; margin-top: 4px; border: 1px solid #eef; background: #f5f5ff; } pre.code { color: #000; } pre.code .info.file { color: #555; } pre.code .val { color: #036A07; } pre.code .tstring_content, pre.code .heredoc_beg, pre.code .heredoc_end, pre.code .qwords_beg, pre.code .qwords_end, pre.code .tstring, pre.code .dstring { color: #036A07; } pre.code .fid, pre.code .id.new, pre.code .id.to_s, pre.code .id.to_sym, pre.code .id.to_f, pre.code .dot + pre.code .id, pre.code .id.to_i pre.code .id.each { color: #0085FF; } pre.code .comment { color: #0066FF; } pre.code .const, pre.code .constant { color: #585CF6; } pre.code .symbol { color: #C5060B; } pre.code .kw, pre.code .label, pre.code .id.require, pre.code .id.extend, pre.code .id.include { color: #0000FF; } pre.code .ivar { color: #318495; } pre.code .gvar, pre.code .id.backref, pre.code .id.nth_ref { color: #6D79DE; } pre.code .regexp, .dregexp { color: #036A07; } pre.code a { border-bottom: 1px dotted #bbf; } rotp-2.1.1/doc/css/full_list.css0000644000175000017500000001236012540024327020032 0ustar balasankarcbalasankarcbody { margin: 0; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; font-size: 13px; height: 101%; overflow-x: hidden; } h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; } .clear { clear: both; } #search { position: absolute; right: 5px; top: 9px; padding-left: 24px; } #content.insearch #search, #content.insearch #noresults { background: url(data:image/gif;base64,R0lGODlhEAAQAPYAAP///wAAAPr6+pKSkoiIiO7u7sjIyNjY2J6engAAAI6OjsbGxjIyMlJSUuzs7KamppSUlPLy8oKCghwcHLKysqSkpJqamvT09Pj4+KioqM7OzkRERAwMDGBgYN7e3ujo6Ly8vCoqKjY2NkZGRtTU1MTExDw8PE5OTj4+PkhISNDQ0MrKylpaWrS0tOrq6nBwcKysrLi4uLq6ul5eXlxcXGJiYoaGhuDg4H5+fvz8/KKiohgYGCwsLFZWVgQEBFBQUMzMzDg4OFhYWBoaGvDw8NbW1pycnOLi4ubm5kBAQKqqqiQkJCAgIK6urnJyckpKSjQ0NGpqatLS0sDAwCYmJnx8fEJCQlRUVAoKCggICLCwsOTk5ExMTPb29ra2tmZmZmhoaNzc3KCgoBISEiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCAAAACwAAAAAEAAQAAAHaIAAgoMgIiYlg4kACxIaACEJCSiKggYMCRselwkpghGJBJEcFgsjJyoAGBmfggcNEx0flBiKDhQFlIoCCA+5lAORFb4AJIihCRbDxQAFChAXw9HSqb60iREZ1omqrIPdJCTe0SWI09GBACH5BAkIAAAALAAAAAAQABAAAAdrgACCgwc0NTeDiYozCQkvOTo9GTmDKy8aFy+NOBA7CTswgywJDTIuEjYFIY0JNYMtKTEFiRU8Pjwygy4ws4owPyCKwsMAJSTEgiQlgsbIAMrO0dKDGMTViREZ14kYGRGK38nHguHEJcvTyIEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDAggPg4iJAAMJCRUAJRIqiRGCBI0WQEEJJkWDERkYAAUKEBc4Po1GiKKJHkJDNEeKig4URLS0ICImJZAkuQAhjSi/wQyNKcGDCyMnk8u5rYrTgqDVghgZlYjcACTA1sslvtHRgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCQARAtOUoQRGRiFD0kJUYWZhUhKT1OLhR8wBaaFBzQ1NwAlkIszCQkvsbOHL7Y4q4IuEjaqq0ZQD5+GEEsJTDCMmIUhtgk1lo6QFUwJVDKLiYJNUd6/hoEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4uen4ICCA+IkIsDCQkVACWmhwSpFqAABQoQF6ALTkWFnYMrVlhWvIKTlSAiJiVVPqlGhJkhqShHV1lCW4cMqSkAR1ofiwsjJyqGgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCSMhREZGIYYGY2ElYebi56fhyWQniSKAKKfpaCLFlAPhl0gXYNGEwkhGYREUywag1wJwSkHNDU3D0kJYIMZQwk8MjPBLx9eXwuETVEyAC/BOKsuEjYFhoEAIfkECQgAAAAsAAAAABAAEAAAB2eAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4ueICImip6CIQkJKJ4kigynKaqKCyMnKqSEK05StgAGQRxPYZaENqccFgIID4KXmQBhXFkzDgOnFYLNgltaSAAEpxa7BQoQF4aBACH5BAkIAAAALAAAAAAQABAAAAdogACCg4SFggJiPUqCJSWGgkZjCUwZACQkgxGEXAmdT4UYGZqCGWQ+IjKGGIUwPzGPhAc0NTewhDOdL7Ykji+dOLuOLhI2BbaFETICx4MlQitdqoUsCQ2vhKGjglNfU0SWmILaj43M5oEAOwAAAAAAAAAAAA==) no-repeat center left; } #full_list { padding: 0; list-style: none; margin-left: 0; } #full_list ul { padding: 0; } #full_list li { padding: 5px; padding-left: 12px; margin: 0; font-size: 1.1em; list-style: none; } #noresults { padding: 7px 12px; } #content.insearch #noresults { margin-left: 7px; } ul.collapsed ul, ul.collapsed li { display: none; } li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; } li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; } li { color: #888; cursor: pointer; } li.deprecated { text-decoration: line-through; font-style: italic; } li.r1 { background: #f0f0f0; } li.r2 { background: #fafafa; } li:hover { background: #ddd; } li small:before { content: "("; } li small:after { content: ")"; } li small.search_info { display: none; } a:link, a:visited { text-decoration: none; color: #05a; } li.clicked { background: #05a; color: #ccc; } li.clicked a:link, li.clicked a:visited { color: #eee; } li.clicked a.toggle { opacity: 0.5; background-position: bottom right; } li.collapsed.clicked a.toggle { background-position: top right; } #search input { border: 1px solid #bbb; -moz-border-radius: 3px; -webkit-border-radius: 3px; } #nav { margin-left: 10px; font-size: 0.9em; display: none; color: #aaa; } #nav a:link, #nav a:visited { color: #358; } #nav a:hover { background: transparent; color: #5af; } .frames #content h1 { margin-top: 0; } .frames li { white-space: nowrap; cursor: normal; } .frames li small { display: block; font-size: 0.8em; } .frames li small:before { content: ""; } .frames li small:after { content: ""; } .frames li small.search_info { display: none; } .frames #search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; padding-left: 0; padding-right: 24px; } .frames #content.insearch #search { background-position: center right; } .frames #search input { width: 110px; } .frames #nav { display: block; } #full_list.insearch li { display: none; } #full_list.insearch li.found { display: list-item; padding-left: 10px; } #full_list.insearch li a.toggle { display: none; } #full_list.insearch li small.search_info { display: block; } rotp-2.1.1/doc/css/common.css0000644000175000017500000000005212540024327017320 0ustar balasankarcbalasankarc/* Override this file with custom rules */rotp-2.1.1/doc/js/0000755000175000017500000000000012540024327015145 5ustar balasankarcbalasankarcrotp-2.1.1/doc/js/app.js0000644000175000017500000001435012540024327016266 0ustar balasankarcbalasankarcfunction createSourceLinks() { $('.method_details_list .source_code'). before("[View source]"); $('.toggleSource').toggle(function() { $(this).parent().next().slideDown(100); $(this).text("Hide source"); }, function() { $(this).parent().next().slideUp(100); $(this).text("View source"); }); } function createDefineLinks() { var tHeight = 0; $('.defines').after(" more..."); $('.toggleDefines').toggle(function() { tHeight = $(this).parent().prev().height(); $(this).prev().show(); $(this).parent().prev().height($(this).parent().height()); $(this).text("(less)"); }, function() { $(this).prev().hide(); $(this).parent().prev().height(tHeight); $(this).text("more...") }); } function createFullTreeLinks() { var tHeight = 0; $('.inheritanceTree').toggle(function() { tHeight = $(this).parent().prev().height(); $(this).parent().toggleClass('showAll'); $(this).text("(hide)"); $(this).parent().prev().height($(this).parent().height()); }, function() { $(this).parent().toggleClass('showAll'); $(this).parent().prev().height(tHeight); $(this).text("show all") }); } function fixBoxInfoHeights() { $('dl.box dd.r1, dl.box dd.r2').each(function() { $(this).prev().height($(this).height()); }); } function searchFrameLinks() { $('#method_list_link').click(function() { toggleSearchFrame(this, relpath + 'method_list.html'); }); $('#class_list_link').click(function() { toggleSearchFrame(this, relpath + 'class_list.html'); }); $('#file_list_link').click(function() { toggleSearchFrame(this, relpath + 'file_list.html'); }); } function toggleSearchFrame(id, link) { var frame = $('#search_frame'); $('#search a').removeClass('active').addClass('inactive'); if (frame.attr('src') == link && frame.css('display') != "none") { frame.slideUp(100); $('#search a').removeClass('active inactive'); } else { $(id).addClass('active').removeClass('inactive'); frame.attr('src', link).slideDown(100); } } function linkSummaries() { $('.summary_signature').click(function() { document.location = $(this).find('a').attr('href'); }); } function framesInit() { if (window.top.frames.main) { document.body.className = 'frames'; $('#menu .noframes a').attr('href', document.location); $('html head title', window.parent.document).text($('html head title').text()); } } function keyboardShortcuts() { if (window.top.frames.main) return; $(document).keypress(function(evt) { if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) return; if (typeof evt.orignalTarget !== "undefined" && (evt.originalTarget.nodeName == "INPUT" || evt.originalTarget.nodeName == "TEXTAREA")) return; switch (evt.charCode) { case 67: case 99: $('#class_list_link').click(); break; // 'c' case 77: case 109: $('#method_list_link').click(); break; // 'm' case 70: case 102: $('#file_list_link').click(); break; // 'f' } }); } function summaryToggle() { $('.summary_toggle').click(function() { localStorage.summaryCollapsed = $(this).text(); $(this).text($(this).text() == "collapse" ? "expand" : "collapse"); var next = $(this).parent().parent().next(); if (next.hasClass('compact')) { next.toggle(); next.next().toggle(); } else if (next.hasClass('summary')) { var list = $('