pontopass 0.0.3.2.1

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 (2) hide show
  1. data/lib/pontopass.rb +407 -0
  2. metadata +45 -0
data/lib/pontopass.rb ADDED
@@ -0,0 +1,407 @@
1
+ #encoding: UTF-8
2
+ # = Using RDoc # # :title: Pontopass SDK
3
+ #requires
4
+ require 'net/http'
5
+ require 'json'
6
+ require 'cgi'
7
+ #require 'rack'
8
+
9
+ # <b> Descrição </b>
10
+ #
11
+ # A classe pontopassAuth é utilizada para conexão e autenticação no sistema Pontopass.
12
+ # O Pontopass é um sistema para fácil implementação de autenticação em duas etapas, ou autenticação forte.
13
+ # Para utilizar o sistema, é necessário primeiro se cadastrar em https://pontopass.com.
14
+ # Para maiores detalhes, acesse https://pontopass.com e https://pontosec.com.
15
+ class PontopassAuth
16
+ # atributo que contem o user agent. Atribuido automaticamente pelo header 'HTTP_USER_AGENT'
17
+ attr_accessor :user_agent
18
+ # atributo que contem o user agent. Atribuido automaticamente pelo header 'REMOTE_ADDRESS'
19
+ attr_accessor :user_ip
20
+ # numero da session do usuário. Atribuído automaticamente após a execução do método init
21
+ attr_accessor :user_session
22
+
23
+ # atributos privados
24
+ @@api_server = "api.pontopass.com" #"localhost:3000"
25
+ @@frameurl = "http://pontopass.com/demo/js/frame.html"
26
+ @@token_type = { 1 => "telefone", 2 => "sms", 3 => "app", 4 => "token"}
27
+
28
+ #status da sessão atual
29
+ @status = nil
30
+ #url de retorno para o widget
31
+ @return_url = nil
32
+ #tipo de retorno desejado para o Widget (GET/POST)
33
+ @return_method = "POST"
34
+
35
+ #mensagens de status
36
+ @@statustxt = {0 => "Sucesso",
37
+ 20 => "Erro ao iniciar",
38
+ 30 => "Chave inv&Atilde;&iexcl;lida",
39
+ 100 => "Sess&Atilde;&pound;o criada",
40
+ 110 => "Novo dispositivo permitido para o usu&Atilde;&iexcl;rio",
41
+ 150 => "Erro ao gravar session",
42
+ 151 => "Erro ao gravar usu&Atilde;&iexcl;rio - Usu&Atilde;&iexcl;rio j&Atilde;&iexcl; existe",
43
+ 152 => "Erro ao gravar usu&Atilde;&iexcl;rio",
44
+ 153 => "Erro ao deletar usu&Atilde;&iexcl;rio",
45
+ 155 => "IP e/ou User Agent incorreto(s)",
46
+ 210 => "Erro de grava&Atilde;&sect;&Atilde;&pound;o no cache",
47
+ 220 => "Erro Interno",
48
+ 310 => "Erro Interno",
49
+ 320 => "Erro Interno",
50
+ 400 => "Usu&Atilde;&iexcl;rio n&Atilde;&pound;o encontrado",
51
+ 405 => "Erro Interno",
52
+ 410 => "Sess&Atilde;&pound;o n&Atilde;&pound;o encontrada",
53
+ 411 => "Aplica&Atilde;&sect;&Atilde;&pound;o n&Atilde;&pound;o corresponde a session",
54
+ 413 => "Session inv&Atilde;&iexcl;lida",
55
+ 415 => "Dispositivo n&Atilde;&pound;o encontrado",
56
+ 420 => "M&Atilde;&copy;todo n&Atilde;&pound;o encontrado",
57
+ 422 => "Aplica&Atilde;&sect;&Atilde;&pound;o n&Atilde;&pound;o encontrada",
58
+ 425 => "M&Atilde;&copy;todo n&Atilde;&pound;o encontrado",
59
+ 440 => "Erro Interno",
60
+ 450 => "Erro Interno",
61
+ 490 => "Sem permiss&Atilde;&pound;o para gravar novo dispositivo",
62
+ 492 => "Telefone invalido",
63
+ 495 => "Novo m&Atilde;&copy;todo inserido",
64
+ 510 => "Erro na Liga&Atilde;&sect;&Atilde;&pound;o",
65
+ 520 => "Erro no SMS",
66
+ 530 => "Erro no mobile Token",
67
+ 540 => "Erro no Aplicativo Mobile",
68
+ 600 => "Sem cr&Atilde;&copy;ditos dispon&Atilde;&shy;veis",
69
+ 710 => "Erro no Login",
70
+ 720 => "IP Inv&Atilde;&iexcl;lido",
71
+ 800 => "Aguardando resposta",
72
+ 810 => "Login bloqueado - SMS",
73
+ 820 => "Login bloqueado - Mobile Token",
74
+ 830 => "Login bloqueado - Chamada n&Atilde;&pound;o atendida",
75
+ 840 => "Login bloqueado - Push / Telefone",
76
+ 999 => "Sessão não iniciada ou não definida"}
77
+
78
+
79
+ # <b>Descrição</b>
80
+ #
81
+ # - Gera a classe com os dados de autenticação.
82
+ #
83
+ # <b>Parâmetros</b>
84
+ #
85
+ # <b>Entrada</b>
86
+ # api_id:: ID de autenticação da API Pontopass
87
+ # api_key:: Chave para acesso na API Pontopass
88
+ def initialize(api_id, api_key)
89
+ @api_id = api_id
90
+ @api_key = api_key
91
+ @user_agent = ENV['HTTP_USER_AGENT']
92
+ @user_ip = ENV['REMOTE_ADDR']
93
+ @user_remember = 0
94
+ @integration_type = 1
95
+ end
96
+
97
+ # <b>Descrição </b>
98
+ #
99
+ # Uso interno para solicitações http
100
+ protected
101
+ def send(path)
102
+ #define URL para acesso
103
+ url = "https://" + @@api_server + '/' + path + '/json'
104
+ uri = URI.parse(url)
105
+ #gera a conexao http
106
+ http = Net::HTTP.new(uri.host, uri.port)
107
+ #define com SSL
108
+ http.use_ssl = true
109
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
110
+ request = Net::HTTP::Get.new(uri.request_uri)
111
+ request.basic_auth(@api_id,@api_key)
112
+ response = http.request(request)
113
+ #se a resposta nao for 200, retorna o codigo de erro
114
+ if (not response) or (response.code != "200")
115
+ @status = response ? response.code : 999
116
+ return 999
117
+ end
118
+ #converte o retorno em json e obtem seu status
119
+ decode = JSON.parse(response.body)
120
+ @status = decode["status"] ? decode["status"] : 999
121
+ decode
122
+ end
123
+
124
+ # <b> Descrição</b>
125
+ #
126
+ # Exibe a descrição em texto do último status ocorrido
127
+ #
128
+ # <b> Parâmetros</b>
129
+ #
130
+ # <b>Saída</b>
131
+ # StatusString::texto descritivo do ultimo status
132
+ public
133
+ def lastStatus
134
+ @@statustxt[@status];
135
+ end
136
+
137
+ # <b>Descrição</b>
138
+ #
139
+ # Inicializa uma nova session para o usuário com Ip e user agent determinados automaticamente.
140
+ #
141
+ # <b>Parâmetros</b>
142
+ #
143
+ # <b>Entrada</b>
144
+ # username:: Login do usuário
145
+ # use_widget:: false: Utiliza API; true: Utiliza Widget JavaScript <i>(default = false)</i>
146
+ # save_session:: false: não grava a session; true: grava a session no database<i>(default = false)</i>
147
+ #
148
+ # <b>Saída</b>
149
+ # Status 0:: OK
150
+ # Status 999:: ERROR
151
+ def init(username,use_widget=nil,user_remember=nil,user_ip=nil,user_agent=nil)
152
+ @integration_type = use_widget ? 1 : 0
153
+ @user_remember = user_remember ? 1 : 0
154
+ if user_ip
155
+ @user_ip = user_ip
156
+ end
157
+ if user_agent
158
+ @user_agent = user_agent
159
+ end
160
+ @user = username
161
+
162
+ ret = send("init/#{username}/#{@integration_type}/#{@user_remember}/#{@user_ip}/#{CGI::escape(@user_agent)}");
163
+
164
+ if(ret["session"])
165
+ @user_session = ret["session"]
166
+ end
167
+ ret["status"] ? ret["status"] : 999
168
+ end
169
+
170
+ # <b>Descrição</b>
171
+ #
172
+ # Lista os dispositivos do usuario da session inicializada.
173
+ #
174
+ # <b>Requisitos</b>
175
+ #
176
+ # Session válida existente
177
+ #
178
+ # <b>Parâmetros</b>
179
+ #
180
+ # <b>Saída</b>
181
+ # NULL:: caso não obtenha os dados corretamente
182
+ # JSON:: métodos de login do usuário.
183
+ # <b>Campos:</b>
184
+ # <tt>{"description":"descrição",
185
+ # "id":"Id do método",
186
+ # "number":"número de telefone",
187
+ # "token_type":"tipo de método"}</tt>
188
+ def listMethods()
189
+ @user_session ? send("list/#{@user_session}/#{@user_ip}/#{CGI::escape(@user_agent)}") : false
190
+ end
191
+
192
+ # <b>Descrição</b>
193
+ #
194
+ # Solicita a autenticação com o método desejado
195
+ #
196
+ # <b>Requisitos</b>
197
+ #
198
+ # Session válida inicializada
199
+ #
200
+ # Métodos para autenticação listados
201
+ #
202
+ # <b>Parâmetros</b>
203
+ #
204
+ # <b>Entrada</b>
205
+ # methodID:: ID do método, obtido no array recebido do ListMethods
206
+ # <b>Saída</b>
207
+ # statusCode:: Código do status do processo
208
+ def ask(device_id)
209
+ if @user_session
210
+ ret = send("ask/#{@user_session}/#{device_id.to_s}/#{@user_ip}/#{CGI::escape(user_agent)}")
211
+ ret["status"] ? ret["status"] : 999
212
+ else
213
+ return 999;
214
+ end
215
+ end
216
+
217
+
218
+ # <b>Descrição</b>
219
+ #
220
+ # Valida a autenticação desejada
221
+ #
222
+ # <b>Requisitos</b>
223
+ #
224
+ # Autenticação solicitada
225
+ #
226
+ # <b>Parâmetros</b>
227
+ #
228
+ # <b>Entrada</b>
229
+ # answer:: Codigo para validação
230
+ # token_type:: tipo de device solicitado no método ask
231
+ #
232
+ # <b>Saída</b>
233
+ # statusCode:: Código do status do processo
234
+ def validate(answer,token_type)
235
+ if(@user_session)
236
+ url = "validate/#{@@token_type[token_type].to_s}/#{@user_session}/#{answer}/#{@user_ip}/#{CGI::escape(user_agent)}"
237
+ ret = send(url)
238
+ ret["status"]# ? ret["status"] : 999
239
+ else
240
+ 999
241
+ end
242
+ end
243
+
244
+ # <b>Descrição</b>
245
+ #
246
+ # Gera o widget do pontopass: <b> BETA </b>
247
+ #
248
+ # <b>Parâmetros</b>
249
+ #
250
+ # <b>Entrada</b>
251
+ # return_url:: url onde o widget devera ser gerado
252
+ # h:: altura do widget (default = 500px)
253
+ # w:: largura do widget (default = 500px)
254
+ # return_method:: GET ou POST (default = POST)
255
+ # post:: Parâmetros Post (default = nil)
256
+ # get:: Parâmetros Get (default = nil)
257
+ #
258
+ # <b>Saída</b>
259
+ # statusCode:: Código do status do processo
260
+ def widget(return_url, h=500, w=500, return_method="POST", post=nil, get=nil)
261
+ postparams = ""
262
+ getparams = ""
263
+ if post
264
+ post.each do |key,value|
265
+ postparams += "post_$#{key}=#{CGI::escape(value)}&"
266
+ end
267
+ end
268
+ if get
269
+ post.each do |key,value|
270
+ postparams += "get_$#{key}=#{CGI::escape(value)}&"
271
+ end
272
+ end
273
+ url = "#{@frameurl}?#pontopass_save=#{@user_remember}&pontopass_url=#{CGI::escape(@return_url)}&pontopass_sess=#{@user_session}&#{postparams}#{getparams}"
274
+ "<iframe src='#{url}' width='#{w}' height='#{h}' frameBorder='0'></iframe>"
275
+ end
276
+
277
+ # <b>Descrição</b>
278
+ #
279
+ # Checa o status e validade da sessão atual. Utilizado para métodos phone e mobile push.
280
+ #
281
+ # <b>Parâmetros<b>
282
+ #
283
+ # <b>Entrada</b>
284
+ # login:: login do usuario
285
+ # <b>Saída</b>
286
+ # status:: true ou false para autenticação da sessão atual
287
+ def checkAnswer(login)
288
+ if not @user_session
289
+ if (params['pontopass_session'])
290
+ @user_session = params['pontopass_session']
291
+ end
292
+ end
293
+ if not @user_session
294
+ ret = send("auth/#{params['pontopass_session']}/#{@user_ip}/#{CGI::escape(@user_agent)}")
295
+ if ret["login"]
296
+ ret["login"] == login
297
+ else
298
+ false
299
+ end
300
+ else
301
+ false
302
+ end
303
+ end
304
+
305
+ # <b>Descrição</b>
306
+ #
307
+ # Checa o status e validade da sessão atual. Utilizado para métodos phone e mobile push.
308
+ #
309
+ # <b>Parâmetros</b>
310
+ #
311
+ # <b>Saída</b>
312
+ # status:: true ou false para autenticação da sessão atual
313
+ def status()
314
+ ret = send("status/#{@user_session}/#{@user_ip}/#{CGI::escape(@user_agent)}")
315
+ ret["status"] ? ret["status"] : 999
316
+ end
317
+ end
318
+
319
+ # <b>Descrição</b>
320
+ #
321
+ # A classe PontopassUser é utilizada para gerenciamento dos dados de usuários no Pontopass.
322
+ # O Pontopass é um sistema para fácil implementação de autenticação em duas etapas, ou autenticação forte.
323
+ # Para utilizar o sistema, é necessário primeiro se cadastrar em https://pontopass.com.
324
+ # Para maiores detalhes, acesse https://pontopass.com e https://pontosec.com.
325
+ class PontopassUser < PontopassAuth
326
+
327
+ # <b>Descrição</b>
328
+ #
329
+ # Cria um novo login de usuário no Pontopass
330
+ #
331
+ # <b>Parâmetros</b>
332
+ #
333
+ # <b>Entrada</b>
334
+ # login:: login do usuário
335
+ # name:: nome de exibição do usuário (default = login)
336
+ # <b>Saída</b>
337
+ # statusCode:: Código do status da criação
338
+ def create(login,name="")
339
+ ret = send("manage/user/insert/#{@login}/#{CGI::escape(name)}")
340
+ ret["status"]
341
+ end
342
+
343
+ # <b>Descrição</b>
344
+ #
345
+ # Remove um usuário do Pontopass
346
+ #
347
+ # <b>Parâmetros</b>
348
+ #
349
+ # <b>Entrada<b>
350
+ # login:: login do usuário
351
+ # <b>Saída</b>
352
+ # statusCode:: Código do status da remoção
353
+ def delete(login)
354
+ ret = send("manage/user/delete/#{login}")
355
+ ret["status"]
356
+ end
357
+
358
+ # <b>Descrição</b>
359
+ #
360
+ # Insere um dispositivo de autenticação
361
+ #
362
+ # <b>Parâmetros</b>
363
+ #
364
+ # <b>Entrada</b>
365
+ #
366
+ # login:: login do usuário
367
+ # type:: tipo de autenticação
368
+ # phone:: telefone
369
+ # desc:: descrição do dispositivo (default = nil)
370
+ # <b>Saída</b>
371
+ # statusCode:: Código do status da criação
372
+ def insertDevice(login,type,phone,desc=null)
373
+ ret = send("manage/method/insert/#{login}/#{type}/#{phone}/#{desc}")
374
+ ret["status"]
375
+ end
376
+
377
+ # <b>Descrição</b>
378
+ #
379
+ # Remove um dispositivo de autenticação
380
+ #
381
+ # <b>Parâmetros</b>
382
+ #
383
+ # <b>Entrada</b>
384
+ # login:: login do usuário
385
+ # methodid:: id do método de autenticação
386
+ # <b>Saída</b>
387
+ # statusCode:: Código do status da remoção
388
+ def deleteDevice(login, methodid)
389
+ ret = send("manage/method/delete/#{login}/#{methodid}")
390
+ ret["status"]
391
+ end
392
+
393
+ # <b>Descrição</b>
394
+ #
395
+ # Lista os dispositivos para autenticação do usuário
396
+ #
397
+ # <b>Parâmetros</b>
398
+ #
399
+ # <b>Entrada</b>
400
+ # login:: login do usuário
401
+ # <b>Saída</b>
402
+ # JSON:: array json com os métodos de autenticação do usuário
403
+ def listMethods(login)
404
+ ret = send("manage/method/list/#{login}")
405
+ ret
406
+ end
407
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pontopass
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3.2.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Guilherme Leite
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-16 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Gem com funcoes de acesso e gerenciamento do Pontopass
15
+ email: guilherme@pontosec.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/pontopass.rb
21
+ homepage: http://pontopass.com
22
+ licenses: []
23
+ post_install_message:
24
+ rdoc_options: []
25
+ require_paths:
26
+ - lib
27
+ required_ruby_version: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 1.8.23
42
+ signing_key:
43
+ specification_version: 3
44
+ summary: Pontopass API
45
+ test_files: []