exchange-offline-address-book 0.0.17 → 0.0.18

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fac082f0845c31c11f73e65eaf9813fc24dda020
4
- data.tar.gz: b42740d5fd7262e9d4516c62993a4b74c30e95ef
3
+ metadata.gz: c55abcbbc07e7d39590701b7f2ec5709be800391
4
+ data.tar.gz: 3ab636736cfbc68dd0a59e1adc43773f5a4e91f6
5
5
  SHA512:
6
- metadata.gz: e3ce63e305279799ec36e6bd3beeaa62a48242401e9a17c208ed8c55149940720b2f3f7bfcf113f5675d6dfc0309209c62091c2048b3726b557813d40056f080
7
- data.tar.gz: 70eb56ef0b4a2e159d6653da624cbb9d7c80fb0eb443220a8418158e086f9f2bb68e442b56ec258eb0b5d432d87622db96e480ca7fd8dfd0f8db6720d52ed9d8
6
+ metadata.gz: fbc1e9847734ae88a8692439e50609e3b4942f598be4f541a5340e058c54641d133ffd56df926d8d7fc8f7220b0f72f7b6e4458e4aed76f38cd67d50dfb2a5ae
7
+ data.tar.gz: 896827f3141bf08128b62eacf10a90226f0de383f10e9497e4d49e8d1e3cd75de996dbe3bf311e0fc0799354d5e5c1e3f335dba02b362d70942944ce9c698dd0
data/Gemfile.lock CHANGED
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- exchange-offline-address-book (0.0.17)
4
+ exchange-offline-address-book (0.0.18)
5
5
  autodiscover (~> 1)
6
6
  curb (~> 0.9)
7
+ hashie
7
8
  libmspack (~> 0.1)
8
9
  nokogiri (~> 1.8)
9
10
 
@@ -23,6 +24,7 @@ GEM
23
24
  ffi (>= 1.0.0)
24
25
  rake
25
26
  gem-release (1.0.0)
27
+ hashie (3.5.5)
26
28
  httpclient (2.8.3)
27
29
  libmspack (0.1.0)
28
30
  ffi
@@ -29,4 +29,5 @@ Gem::Specification.new do |spec|
29
29
  spec.add_runtime_dependency 'autodiscover', '~> 1'
30
30
  spec.add_runtime_dependency 'libmspack', '~> 0.1'
31
31
  spec.add_runtime_dependency 'curb', '~> 0.9'
32
+ spec.add_runtime_dependency 'hashie'
32
33
  end
@@ -7,14 +7,25 @@ require 'autodiscover'
7
7
  require "autodiscover/debug" if ENV['DEBUG']
8
8
  require 'yaml'
9
9
  require 'nokogiri'
10
- require 'tempfile'
11
10
  require 'json'
12
- require 'ostruct'
11
+ require 'hashie'
13
12
  require 'shellwords'
13
+ require 'tmpdir'
14
14
 
15
15
  require_relative 'exchange-offline-address-book/parser'
16
16
  require_relative 'exchange-offline-address-book/mspack'
17
17
 
18
+ # https://github.com/intridea/hashie/pull/416
19
+ if Hashie::VERSION == '3.5.5'
20
+ module Hashie
21
+ class Mash
22
+ def self.disable_warnings?
23
+ @disable_warnings ||= false
24
+ end
25
+ end
26
+ end
27
+ end
28
+
18
29
  class OfflineAddressBook
19
30
  def initialize(email: nil, password: nil, username: nil, cachedir: nil, baseurl: nil, update: true)
20
31
  @email = email
@@ -23,20 +34,16 @@ class OfflineAddressBook
23
34
  @cachedir = cachedir
24
35
  @update = update
25
36
  @baseurl = baseurl
26
- end
27
-
28
- def path(name)
29
- @files ||= {}
30
- @files[name] ||= (@cachedir ? File.join(@cachedir, name) : Tempfile.new(name).path)
31
- end
32
37
 
33
- def download(name)
34
- if !@cachedir || @update || !File.file?(path(name))
35
- system "curl --#{ENV['DEBUG'] ? 'verbose' : 'silent'} --ntlm --user #{[@username, @password].join(':').shellescape} #{[baseurl, name].join('').shellescape} -o #{path(name).shellescape}"
38
+ if cachedir
39
+ fetch_to(cachedir)
40
+ else
41
+ Dir.mktmpdir{|dir| fetch_to(dir) }
36
42
  end
37
- return path(name)
38
43
  end
39
44
 
45
+ attr_reader :records
46
+
40
47
  def baseurl
41
48
  @baseurl ||= begin
42
49
  client = Autodiscover::Client.new(email: @email, password: @password, username: @username)
@@ -46,59 +53,70 @@ class OfflineAddressBook
46
53
  end
47
54
  end
48
55
 
49
- def addressbook
50
- @addressbook ||= begin
51
- lzx = nil
52
- if !@update & @cachedir
53
- oab = Dir[File.join(@cachedir, '*.oab')][0]
54
- lzx = File.basename(oab, File.extname(oab)) + '.lzx' if oab
55
- end
56
+ def header
57
+ @parsed ||= Parser.new(addressbook)
58
+ @parsed.header
59
+ end
56
60
 
57
- lzx ||= Nokogiri::XML(open(download('oab.xml'))).at('//Full').inner_text
58
- oab = File.basename(lzx, File.extname(lzx)) + '.oab'
61
+ def fetch_to(dir)
62
+ begin
63
+ @dir = dir
59
64
 
60
- if !File.file?(path(oab))
61
- if @cachedir
62
- %w{*.oab *.lzx *.yml *.json}.each{|ext|
63
- Dir[File.join(@cachedir, ext)].each{|f| File.unlink(f) }
64
- }
65
- end
65
+ if File.file?(cache)
66
+ @records = JSON.parse(open(cache).read, object_class: Hashie::Mash)
67
+ return
68
+ end
66
69
 
70
+ if !File.file?(addressbook)
71
+ %w{json oab lzx}.each{|ext|
72
+ Dir[File.join(@dir, "*.#{ext}")].each{|f| File.delete(f) }
73
+ }
74
+ lzx = File.basename(addressbook, File.extname(addressbook)) + '.lzx'
75
+ puts "OfflineAddressBook: Downloading #{lzx}" if ENV['DEBUG']
67
76
  download(lzx)
68
- LibMsPack.oab_decompress(path(lzx), path(oab))
77
+ puts "OfflineAddressBook: Decompressing #{lzx} to #{addressbook}" if ENV['DEBUG']
78
+ LibMsPack.oab_decompress(File.join(@dir, lzx), addressbook)
69
79
  end
80
+ puts "OfflineAddressBook: Addressbook ready at #{addressbook}" if ENV['DEBUG']
70
81
 
71
- path(oab)
82
+ parsed = Parser.new(addressbook)
83
+ @records = parsed.records.collect{|record|
84
+ record.to_h.each_pair{|k, v|
85
+ record[k] = v[0] if v.length == 1
86
+ }
87
+ # no idea what's going on here
88
+ record.AddressBookObjectGuid = record.AddressBookObjectGuid.inspect if record.AddressBookObjectGuid
89
+ record
90
+ }
91
+ open(cache, 'w'){|f| f.write(JSON.pretty_generate(@records.collect{|r| r.to_h}))} if @cachedir # this can ditch the collect with hashie
92
+ ensure
93
+ @dir = nil
72
94
  end
73
95
  end
74
96
 
75
- def cache
76
- @cache ||= path(File.basename(addressbook, File.extname(addressbook)) + '.json')
77
- end
97
+ private
78
98
 
79
- def header
80
- @parsed ||= Parser.new(addressbook)
81
- @parsed.header
99
+ def download(name)
100
+ puts "curl --#{ENV['DEBUG'] ? 'verbose' : 'silent'} --ntlm --user #{[@username, @password].join(':').shellescape} #{[baseurl, name].join('').shellescape} -o #{File.join(@dir, name).shellescape}" if ENV['DEBUG']
101
+ system "curl --#{ENV['DEBUG'] ? 'verbose' : 'silent'} --ntlm --user #{[@username, @password].join(':').shellescape} #{[baseurl, name].join('').shellescape} -o #{File.join(@dir, name).shellescape}"
102
+ return File.join(@dir, name)
82
103
  end
83
104
 
84
- def records
85
- @records ||= begin
86
- if File.file?(cache)
87
- parsed = JSON.parse(open(cache).read).collect{|record| OpenStruct.new(record) }
105
+ def addressbook
106
+ @addressbook ||= begin
107
+ if !@update && Dir[File.join(@dir, '*.oab')].length > 0
108
+ oab = File.basename(Dir[File.join(@dir, '*.oab')][0])
109
+ puts "OfflineAddressBook: Reusing #{oab}" if ENV['DEBUG']
88
110
  else
89
- @parsed ||= Parser.new(addressbook)
90
- parsed = @parsed.records.collect{|record|
91
- record.to_h.each_pair{|k, v|
92
- record[k] = v[0] if v.length == 1
93
- }
94
- # no idea what's going on here
95
- record.AddressBookObjectGuid = record.AddressBookObjectGuid.inspect if record.AddressBookObjectGuid
96
- record
97
- }
98
- open(cache, 'w'){|f| f.write(JSON.pretty_generate(parsed.collect{|r| r.to_h}))} if @cachedir
111
+ lzx = Nokogiri::XML(open(download('oab.xml'))).at('//Full').inner_text
112
+ oab = File.basename(lzx, File.extname(lzx)) + '.oab'
99
113
  end
100
114
 
101
- parsed
115
+ File.join(@dir, oab)
102
116
  end
103
117
  end
118
+
119
+ def cache
120
+ @cache ||= File.join(@dir, File.basename(addressbook, File.extname(addressbook)) + '.json')
121
+ end
104
122
  end
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'ostruct'
3
+ require 'hashie'
4
4
 
5
- MapiPropertyDataType = OpenStruct.new({
5
+ MapiPropertyDataType = Hashie::Mash.new({
6
6
  Unspecified: 0,
7
7
  Null: 1,
8
8
  Short: 2,
@@ -648,7 +648,7 @@ class OfflineAddressBook
648
648
  def _propertyTypes
649
649
  n = _uint32
650
650
  return 1.upto(n).collect{|i|
651
- prop = OpenStruct.new
651
+ prop = Hashie::Mash.new
652
652
  prop.pos = pos
653
653
 
654
654
  id = _uint32
@@ -689,12 +689,12 @@ class OfflineAddressBook
689
689
  else
690
690
  value = _scalar(prop.type)
691
691
  end
692
- p = OpenStruct.new(type: prop.type, id: prop.id, name: prop.name, value: value)
692
+ p = Hashie::Mash.new(type: prop.type, id: prop.id, name: prop.name, value: value)
693
693
  return p
694
694
  end
695
695
 
696
696
  def _scalar(type)
697
- case type
697
+ case type.to_sym
698
698
  when :Long then return _integer
699
699
  when :Boolean then return (_ubyte > 0)
700
700
  when :Binary then return @oab.read(_integer)
@@ -713,7 +713,7 @@ class OfflineAddressBook
713
713
  def _record(headerRecord = false)
714
714
  initialPosition = @oab.pos
715
715
  recordSize = 0
716
- record = OpenStruct.new
716
+ record = Hashie::Mash.new
717
717
  begin
718
718
  properties = headerRecord ? @headerProperties : @oabProperties
719
719
  recordSize = _uint32
@@ -1,3 +1,3 @@
1
1
  class OfflineAddressBook
2
- VERSION = '0.0.17'
2
+ VERSION = '0.0.18'
3
3
  end
@@ -4,16 +4,20 @@ require 'minitest/autorun'
4
4
  require 'exchange-offline-address-book'
5
5
 
6
6
  class EOABTest < Minitest::Test
7
- def test_downlod
7
+ # def test_downlod
8
+ # oab = OfflineAddressBook.new(username: ENV['EWS_USERNAME'], password: ENV['EWS_PASSWORD'], email: ENV['EWS_EMAIL'])
9
+ # puts oab.addressbook
10
+ # end
11
+ # def test_baseurl
12
+ # oab = OfflineAddressBook.new(username: ENV['EWS_USERNAME'], password: ENV['EWS_PASSWORD'], email: ENV['EWS_EMAIL'])
13
+ # puts oab.baseurl
14
+ # end
15
+ # def test_given_baseurl
16
+ # oab = OfflineAddressBook.new(username: ENV['EWS_USERNAME'], password: ENV['EWS_PASSWORD'], email: ENV['EWS_EMAIL'], baseurl: ENV['EWS_BASEURL'])
17
+ # puts oab.addressbook
18
+ # end
19
+ def test_records
8
20
  oab = OfflineAddressBook.new(username: ENV['EWS_USERNAME'], password: ENV['EWS_PASSWORD'], email: ENV['EWS_EMAIL'])
9
- puts oab.addressbook
10
- end
11
- def test_baseurl
12
- oab = OfflineAddressBook.new(username: ENV['EWS_USERNAME'], password: ENV['EWS_PASSWORD'], email: ENV['EWS_EMAIL'])
13
- puts oab.baseurl
14
- end
15
- def test_given_baseurl
16
- oab = OfflineAddressBook.new(username: ENV['EWS_USERNAME'], password: ENV['EWS_PASSWORD'], email: ENV['EWS_EMAIL'], baseurl: ENV['EWS_BASEURL'])
17
- puts oab.addressbook
21
+ puts oab.records.length
18
22
  end
19
23
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exchange-offline-address-book
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.17
4
+ version: 0.0.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emiliano Heyns
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-17 00:00:00.000000000 Z
11
+ date: 2017-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0.9'
139
+ - !ruby/object:Gem::Dependency
140
+ name: hashie
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
139
153
  description: Get Exchange Offline Address Book
140
154
  email:
141
155
  - Emiliano.Heyns@iris-advies.com