pontopass 0.0.3.2.1

Sign up to get free protection for your applications and to get access to all the features.
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: []