yandex-pdd 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. data/lib/yandex/pdd.rb +382 -0
  2. metadata +4 -4
  3. data/lib/yandex-pdd.rb +0 -5
@@ -0,0 +1,382 @@
1
+ module Yandex
2
+ class Pdd
3
+ API_URL = 'https://pddimp.yandex.ru/'
4
+ TIMEOUT = 10
5
+ POP3_PORT = 110
6
+ IMAP_PORT = 143
7
+ POP3 = 'pop3'
8
+ IMAP = 'imap'
9
+ IMPORT_METHOD = POP3
10
+ HTTP_ERROR = 'HTTP_ERROR'
11
+
12
+ NOT_AUTHORIZED = 'NOT_AUTHORIZED'
13
+ INVALID_RESPONSE = 'INVALID_RESPONSE'
14
+ REQUEST_FAILED = 'REQUEST_FAILED'
15
+
16
+ USER_NOT_FOUND = 'USER_NOT_FOUND'
17
+ LOGIN_OCCUPIED = 'LOGIN_OCCUPIED'
18
+ LOGIN_TOO_SHORT = 'LOGIN_TOO_SHORT'
19
+ LOGIN_TOO_LONG = 'LOGIN_TOO_LONG'
20
+ INVALID_LOGIN = 'INVALID_LOGIN'
21
+
22
+ INVALID_PASSWORD = 'INVALID_PASSWORD'
23
+ PASSWORD_TOO_SHORT = 'PASSWORD_TOO_SHORT'
24
+ PASSWORD_TOO_LONG = 'PASSWORD_TOO_LONG'
25
+
26
+ CANT_CREATE_ACCOUNT = 'CANT_CREATE_ACCOUNT'
27
+ USER_LIMIT_EXCEEDED = 'USER_LIMIT_EXCEEDED'
28
+
29
+ NO_IMPORT_SETTINGS = 'NO_IMPORT_SETTINGS'
30
+
31
+ SERVICE_ERROR = 'SERVICE_ERROR'
32
+ UNKNOWN_ERROR = 'UNKNOWN_ERROR'
33
+
34
+ ERR_R = {
35
+ 'not authenticated' => NOT_AUTHORIZED,
36
+ 'not_authorized' => NOT_AUTHORIZED,
37
+ 'no_login' => INVALID_LOGIN,
38
+ 'bad_login' => INVALID_LOGIN,
39
+ 'no_user' => USER_NOT_FOUND,
40
+ 'not_found' => USER_NOT_FOUND,
41
+ 'user_not_found' => USER_NOT_FOUND,
42
+ 'no such user registered' => USER_NOT_FOUND,
43
+ 'occupied' => LOGIN_OCCUPIED,
44
+ 'login_short' => LOGIN_TOO_SHORT,
45
+ 'badlogin_length' => LOGIN_TOO_LONG,
46
+ 'passwd-badpasswd' => INVALID_PASSWORD,
47
+ 'passwd-tooshort' => PASSWORD_TOO_SHORT,
48
+ 'passwd-toolong' => PASSWORD_TOO_LONG,
49
+ 'hundred_users_limit' => USER_LIMIT_EXCEEDED,
50
+
51
+ 'no-passwd_cryptpasswd' => INVALID_PASSWORD,
52
+ 'cant_create_account' => CANT_CREATE_ACCOUNT,
53
+
54
+ 'no_import_settings' => NO_IMPORT_SETTINGS,
55
+ 'no import info on this user' => USER_NOT_FOUND,
56
+ 'unknown' => REQUEST_FAILED,
57
+ }
58
+
59
+ attr_accessor :request, :response
60
+ attr_reader :error, :http_error
61
+
62
+ def initialize(token, cert_file=nil)
63
+ @token = token.to_s
64
+ @cert_file = cert_file.to_s
65
+ @timeout = TIMEOUT
66
+ end
67
+
68
+ def is_user_exists(login)
69
+ url = API_URL + 'check_user.xml?token=' + @token + '&login=' + quote_encode(login)
70
+ return nil unless make_request(url)
71
+ if ( result = get_node_text('/page/result') )
72
+ return true if ( 'exists' == result )
73
+ return false if ( 'nouser' == result )
74
+ end
75
+ return unknown_error()
76
+ end
77
+
78
+ alias is_user_exists? is_user_exists
79
+
80
+ def create_user(login, password, is_encrypted=false)
81
+ url = API_URL
82
+ if (is_encrypted)
83
+ url += 'reg_user_crypto.xml?token=' + @token + '&login=' + quote_encode(login) +
84
+ '&password=' + quote_encode(password)
85
+ else
86
+ url += 'reg_user_token.xml?token=' + @token + '&u_login=' + quote_encode(login) +
87
+ '&u_password=' + quote_encode(password)
88
+ end
89
+ return nil unless make_request(url)
90
+ if ( uid = get_node_attr('/page/ok/@uid') )
91
+ return uid
92
+ end
93
+ return unknown_error()
94
+ end
95
+
96
+ def create_user_encryped(login, password)
97
+ return create_user(login, password, true)
98
+ end
99
+
100
+ def update_user(login, data)
101
+ url = API_URL + 'edit_user.xml?token=' + @token + '&login=' + quote_encode(login) +
102
+ '&password=' + quote_encode(data[:password]) +
103
+ '&iname=' + quote_encode(data[:iname] ) +
104
+ '&fname=' + quote_encode(data[:fname] ) +
105
+ '&sex=' + quote_encode(data[:sex] ) +
106
+ '&hintq=' + quote_encode(data[:hintq] ) +
107
+ '&hinta=' + quote_encode(data[:hinta] )
108
+
109
+ return nil unless make_request(url)
110
+
111
+ if ( uid = get_node_attr('/page/ok/@uid') )
112
+ return uid
113
+ end
114
+ return unknown_error()
115
+ end
116
+
117
+ def delete_user(login)
118
+ url = API_URL + 'delete_user.xml?token=' + @token + '&login=' + quote_encode(login)
119
+ return nil unless make_request(url)
120
+ return true if is_response_ok
121
+ return unknown_error()
122
+ end
123
+
124
+ def get_unread_count(login)
125
+ url = API_URL + 'get_mail_info.xml?token=' + @token + '&login=' + quote_encode(login)
126
+ return nil unless make_request(url)
127
+
128
+ if ( count = get_node_attr('/page/ok/@new_messages') )
129
+ return count
130
+ end
131
+
132
+ return unknown_error()
133
+ end
134
+
135
+ def set_forward(login, email, save_copy='no')
136
+ save_copy = (save_copy and not 'no' == save_copy) ? 'yes' : 'no'
137
+ url = API_URL + 'set_forward.xml?token=' + @token + '&login=' + quote_encode(login) +
138
+ '&address=' + quote_encode(address) +
139
+ '&copy=' + save_copy
140
+
141
+ return nil unless make_request(url)
142
+
143
+ return true if is_response_ok
144
+ return unknown_error()
145
+ end
146
+
147
+ def get_user(login)
148
+ url = API_URL + 'get_user_info.xml?token=' + @token + '&login=' + quote_encode(login)
149
+ return nil unless make_request(url)
150
+ user = {
151
+ :domain => get_node_text('/page/domain/name'),
152
+ :login => get_node_text('/page/domain/user/login'),
153
+ :birth_date => get_node_text('/page/domain/user/birth_date'),
154
+ :fname => get_node_text('/page/domain/user/fname'),
155
+ :iname => get_node_text('/page/domain/user/iname'),
156
+ :hinta => get_node_text('/page/domain/user/hinta'),
157
+ :hintq => get_node_text('/page/domain/user/hintq'),
158
+ :mail_format => get_node_text('/page/domain/user/mail_format'),
159
+ :charset => get_node_text('/page/domain/user/charset'),
160
+ :nickname => get_node_text('/page/domain/user/nickname'),
161
+ :sex => get_node_text('/page/domain/user/sex'),
162
+ :enabled => get_node_text('/page/domain/user/enabled'),
163
+ :signed_eula => get_node_text('/page/domain/user/signed_eula'),
164
+ }
165
+
166
+ return user
167
+ end
168
+
169
+ def get_user_list(page=1, per_page=100)
170
+ url = API_URL + 'get_domain_users.xml?token=' + @token + '&page=%20' + quote_encode(page) + # HACK XXX
171
+ '&per_page=' + quote_encode(per_page)
172
+ return nil unless make_request(url)
173
+
174
+ emails = []
175
+
176
+ get_node('/page/domains/domain/emails/email/name').each do |n|
177
+ emails.push(n.inner_xml) unless n.nil?
178
+ end
179
+
180
+ data = {
181
+ :action_status => get_node_text('/page/domains/domain/emails/action-status'),
182
+ :found => get_node_text('/page/domains/domain/emails/found'),
183
+ :total => get_node_text('/page/domains/domain/emails/total'),
184
+ :domain => get_node_text('/page/domains/domain/name'),
185
+ :status => get_node_text('/page/domains/domain/status'),
186
+ :emails_max_count => get_node_text('/page/domains/domain/emails-max-count'),
187
+ :emails => emails,
188
+ }
189
+
190
+ return data
191
+ end
192
+
193
+ def prepare_import(server, data={})
194
+ data[:method] = 'pop3' unless ( data[:method] and data[:method] !~ /^pop3|imap$/i )
195
+
196
+ url = API_URL + 'set_domain.xml?token=' + @token + '&ext_serv=' + server + '&method=' + data[:method]
197
+ url += '&ext_port=' + data[:port] if ( data[:port] )
198
+ url += '&callback=' + data[:callback] if ( data[:callback] )
199
+ url += '&isssl=no' unless ( data[:use_ssl] )
200
+
201
+ return nil unless make_request(url)
202
+
203
+ return true if is_response_ok
204
+ return unknown_error()
205
+ end
206
+
207
+ def start_import(login, data)
208
+ url = API_URL + 'start_import.xml?token=' + @token + '&login=' + quote_encode(login) +
209
+ '&ext_login=' + quote_encode(data[:login]) + '&password=' + quote_encode(data[:password])
210
+
211
+ return nil unless make_request(url)
212
+ return true
213
+ end
214
+
215
+ def import_user(login, password, data)
216
+ data[:login] ||= login
217
+ data[:save_copy] = ( data[:save_copy] ) ? 'yes' : '0'
218
+ url = API_URL + 'reg_and_imp.xml?token=' + @token +
219
+ '&login=' + quote_encode(login) +
220
+ '&inn_password=' + quote_encode(password) +
221
+ '&ext_login=' + quote_encode(data[:login]) +
222
+ '&ext_password=' + quote_encode(data[:password]) +
223
+ '&fwd_email=' + quote_encode(data[:forward_to]) +
224
+ '&fwd_copy=' + quote_encode(data[:save_copy])
225
+
226
+ return nil unless make_request(url)
227
+ return true if is_response_ok
228
+ return unknown_error()
229
+ end
230
+
231
+ def get_import_status(login)
232
+ url = API_URL + 'check_import.xml?token=' + @token + '&login=' + quote_encode(login)
233
+ return nil unless make_request(url)
234
+ data = {
235
+ :last_check => get_node_attr('/page/ok/@last_check'),
236
+ :imported => get_node_attr('/page/ok/@imported'),
237
+ :state => get_node_attr('/page/ok/@state'),
238
+ }
239
+
240
+ return data
241
+ end
242
+
243
+ # # fails for registered users
244
+ # def import_imap_folder(login, data)
245
+ #
246
+ # data[:login] ||= login
247
+ #
248
+ # my $url = API_URL + 'import_imap.xml?token=' + @token + '&login=' + quote_encode(login) +
249
+ # '&ext_login=' + quote_encode(data[:login]) +
250
+ ## '&int_password=' + quote_encode(password) +
251
+ # '&ext_password=' + quote_encode(data[:password]) +
252
+ # '&copy_one_folder=' + quote_encode(data[:folder])
253
+ # return nil unless make_request(url)
254
+ #
255
+ # return true if is_response_ok
256
+ # return unknown_error()
257
+ # end
258
+
259
+ def stop_import(login)
260
+ return nil unless (login)
261
+ url = API_URL + 'stop_import.xml?token=' + @token + '&login=' + quote_encode(login)
262
+ return nil unless make_request(url)
263
+ return true if is_response_ok
264
+ return unknown_error()
265
+ end
266
+
267
+ private
268
+ def reset_error
269
+ @error = nil
270
+ @http_error = nil
271
+ end
272
+
273
+ def get_node(xpath, xml=nil)
274
+ xml = @xml unless xml
275
+ return xml.find(xpath)
276
+ end
277
+
278
+ def get_node_text(xpath, xml=nil)
279
+ xml = @xml unless xml
280
+ node = get_node(xpath, xml).first
281
+ return nil if node.nil?
282
+ return node.inner_xml
283
+ end
284
+
285
+ def get_node_attr(xpath, xml=nil)
286
+ xml = @xml unless xml
287
+ a = xml.find(xpath).first
288
+ return nil if a.nil?
289
+ return a.value
290
+ end
291
+
292
+ def identify_error(error)
293
+ return ERR_R[ error.split(',').first ] || REQUEST_FAILED
294
+ end
295
+
296
+ def set_error(code, info, is_http=false)
297
+ if (is_http)
298
+ @error = { :code => HTTP_ERROR }
299
+ @http_error = { :code => code, :info => info }
300
+ else
301
+ @error = { :code => code, :info => info }
302
+ @http_error = nil
303
+ end
304
+ end
305
+
306
+ def unknown_error
307
+ set_error( UNKNOWN_ERROR, @response ? @response.body : '' )
308
+ return nil
309
+ end
310
+
311
+ def handle_http_error
312
+ set_error( @response.code, @response.body, true )
313
+ end
314
+
315
+ def handle_error
316
+ set_error( identify_error( @_error ), @_error )
317
+ end
318
+
319
+ def parse_response
320
+ @xml = LibXML::XML::Parser.string( @response.body ).parse
321
+ if ( @_error = get_node_attr('/page/error/@reason') )
322
+ handle_error()
323
+ return nil
324
+ end
325
+
326
+ if ( get_node_attr('/page/xscript_invoke_failed/@error') )
327
+ info = ''
328
+ [ 'error', 'block', 'method', 'object', 'exception' ].each do |s|
329
+ info += s + ': "' + get_node_attr('/page/xscript_invoke_failed/@' + s) + '" '
330
+ end
331
+
332
+ set_error(SERVICE_ERROR, info)
333
+ return nil
334
+ end
335
+ return true
336
+ rescue
337
+ @xml = nil
338
+ set_error(INVALID_RESPONSE, (@response) ? @response.body : '')
339
+ return nil
340
+ end
341
+
342
+ def is_response_ok
343
+ return (not get_node('/page/ok').first.nil?)
344
+ end
345
+
346
+ alias is_response_ok? is_response_ok
347
+
348
+ def make_request(url)
349
+ reset_error()
350
+ @uri = URI::parse(url)
351
+ @request = Net::HTTP::new(@uri.host, @uri.port)
352
+ @request.open_timeout = @timeout
353
+ @request.read_timeout = @timeout
354
+ @request.use_ssl = true
355
+
356
+ if @cert_file
357
+ @request.verify_mode = OpenSSL::SSL::VERIFY_PEER
358
+ @request.ca_file = @cert_file
359
+ end
360
+
361
+ @response = @request.get(@uri.request_uri)
362
+
363
+ unless ( @response.is_a?(Net::HTTPSuccess) )
364
+ handle_http_error()
365
+ return nil
366
+ end
367
+
368
+ return parse_response()
369
+
370
+ rescue Exception => e
371
+ set_error(SERVICE_ERROR, e.to_s)
372
+ return nil
373
+ end
374
+
375
+ def quote_encode(s)
376
+ return s.to_s.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
377
+ end
378
+ end
379
+ end
380
+
381
+ __END__
382
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yandex-pdd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-03-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: libxml-ruby
16
- requirement: &76985410 !ruby/object:Gem::Requirement
16
+ requirement: &67691090 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,14 +21,14 @@ dependencies:
21
21
  version: 1.1.3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *76985410
24
+ version_requirements: *67691090
25
25
  description: pdd.yandex.ru api gem from https://github.com/dctabuyz/Yandex-API-PDD.ruby
26
26
  email: vick.orel@gmail.com
27
27
  executables: []
28
28
  extensions: []
29
29
  extra_rdoc_files: []
30
30
  files:
31
- - lib/yandex-pdd.rb
31
+ - lib/yandex/pdd.rb
32
32
  homepage: http://rubygems.org/gems/yandex-pdd
33
33
  licenses: []
34
34
  post_install_message:
@@ -1,5 +0,0 @@
1
- require 'rubygems'
2
- require 'net/https'
3
- require 'xml/libxml'
4
- require 'openssl'
5
- require 'yandex/pdd'