summaryrefslogtreecommitdiffstats
path: root/vendor/plugins/ruby-net-ldap-0.0.4/lib/net/ldap/dataset.rb
blob: 1480a8f84c8dd68a8924d0d9ee4f7eced72e2970 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# $Id: dataset.rb 78 2006-04-26 02:57:34Z blackhedd $
#
#
#----------------------------------------------------------------------------
#
# Copyright (C) 2006 by Francis Cianfrocca. All Rights Reserved.
#
# Gmail: garbagecat10
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
#---------------------------------------------------------------------------
#
#




module Net
class LDAP

class Dataset < Hash

  attr_reader :comments


  def Dataset::read_ldif io
    ds = Dataset.new

    line = io.gets && chomp
    dn = nil

    while line
      io.gets and chomp
      if $_ =~ /^[\s]+/
        line << " " << $'
      else
        nextline = $_

        if line =~ /^\#/
          ds.comments << line
        elsif line =~ /^dn:[\s]*/i
          dn = $'
          ds[dn] = Hash.new {|k,v| k[v] = []}
        elsif line.length == 0
          dn = nil
        elsif line =~ /^([^:]+):([\:]?)[\s]*/
          # $1 is the attribute name
          # $2 is a colon iff the attr-value is base-64 encoded
          # $' is the attr-value
          # Avoid the Base64 class because not all Ruby versions have it.
          attrvalue = ($2 == ":") ? $'.unpack('m').shift : $'
          ds[dn][$1.downcase.intern] << attrvalue
        end

        line = nextline
      end
    end
  
    ds
  end


  def initialize
    @comments = []
  end


  def to_ldif
    ary = []
    ary += (@comments || [])

    keys.sort.each {|dn|
      ary << "dn: #{dn}"

      self[dn].keys.map {|sym| sym.to_s}.sort.each {|attr|
        self[dn][attr.intern].each {|val|
          ary << "#{attr}: #{val}"
        }
      }

      ary << ""
    }

    block_given? and ary.each {|line| yield line}

    ary
  end


end # Dataset

end # LDAP
end # Net