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.
- data/lib/pontopass.rb +407 -0
- 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álida",
|
39
|
+
100 => "Sessão criada",
|
40
|
+
110 => "Novo dispositivo permitido para o usuário",
|
41
|
+
150 => "Erro ao gravar session",
|
42
|
+
151 => "Erro ao gravar usuário - Usuário já existe",
|
43
|
+
152 => "Erro ao gravar usuário",
|
44
|
+
153 => "Erro ao deletar usuário",
|
45
|
+
155 => "IP e/ou User Agent incorreto(s)",
|
46
|
+
210 => "Erro de gravação no cache",
|
47
|
+
220 => "Erro Interno",
|
48
|
+
310 => "Erro Interno",
|
49
|
+
320 => "Erro Interno",
|
50
|
+
400 => "Usuário não encontrado",
|
51
|
+
405 => "Erro Interno",
|
52
|
+
410 => "Sessão não encontrada",
|
53
|
+
411 => "Aplicação não corresponde a session",
|
54
|
+
413 => "Session inválida",
|
55
|
+
415 => "Dispositivo não encontrado",
|
56
|
+
420 => "Método não encontrado",
|
57
|
+
422 => "Aplicação não encontrada",
|
58
|
+
425 => "Método não encontrado",
|
59
|
+
440 => "Erro Interno",
|
60
|
+
450 => "Erro Interno",
|
61
|
+
490 => "Sem permissão para gravar novo dispositivo",
|
62
|
+
492 => "Telefone invalido",
|
63
|
+
495 => "Novo método inserido",
|
64
|
+
510 => "Erro na Ligação",
|
65
|
+
520 => "Erro no SMS",
|
66
|
+
530 => "Erro no mobile Token",
|
67
|
+
540 => "Erro no Aplicativo Mobile",
|
68
|
+
600 => "Sem créditos disponíveis",
|
69
|
+
710 => "Erro no Login",
|
70
|
+
720 => "IP Inválido",
|
71
|
+
800 => "Aguardando resposta",
|
72
|
+
810 => "Login bloqueado - SMS",
|
73
|
+
820 => "Login bloqueado - Mobile Token",
|
74
|
+
830 => "Login bloqueado - Chamada nã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: []
|