• R/O
  • SSH
  • HTTPS

cico: Commit


Commit MetaInfo

Revisión14 (tree)
Tiempo2020-02-19 06:01:24
Autorderekwildstar

Log Message

Incluída codificação para retornar uma mensagem de erro quando não for possível ler o status atual
Urls atualizadas
User Agent atualizado
Alguns comentários foram removidos
Criado o procedure ExecuteLogout, que simplesmente fecha a sessão atual do WinInet

Cambiar Resumen

Diferencia incremental

--- trunk/client/src/cicoda/UDAMOPrincipal.pas (revision 13)
+++ trunk/client/src/cicoda/UDAMOPrincipal.pas (revision 14)
@@ -293,6 +293,24 @@
293293 MAP: TMensagemAProcessar;
294294 CHI: TCheckInChecOutInfo;
295295 begin
296+ // A intenção deste programa é gerenciar as requisições de vários usuários,
297+ // porém eu notei que, dentro de uma mesma sessão (programa em execução), ao
298+ // realizar um login na página do controle de frequencia o WinInet faz tão bem
299+ // o trabalho de gerenciar os cookies que requisições subsequentes, mesmo ao
300+ // passar uma senha errada, conseguem de alguma forma realizar um login bem
301+ // sucedido. Isso é INDESEJÁVEL em uma situação onde será necessário fazer
302+ // login com usuários distintos. O seguinte teste foi feito: Uma senha errada
303+ // está salva e será utilizada nas funções abaixo, porém na chamada a
304+ // CurrentStatus (apenas a primeira vez!), o valor da senha foi alterado
305+ // durante a depuração para ser a correta. CurrentSatus consequentemente
306+ // funciona e retorna o esperado. Posteriormente, uma das funções (Check-In ou
307+ // Check-Out) será executada, desta vez mantendo a senha incorreta e
308+ // curiosamente elas são bem sucedidas, mesmo com a senha errada, porque
309+ // aparentemente, o primeiro login bem sucedido (realizado por CurrentStatus),
310+ // configurou algum Cookie que mantém o usuário conectado.
311+ // Para resolver este problema foi implementado um método para deslogar do
312+ // controle de frequência
313+
296314 for MAP in FMensagensAProcessar do
297315 begin
298316 if FDTAUsuarios.Locate('cpf',ObterCpf(MAP.De),[]) then
@@ -310,85 +328,83 @@
310328 ,KRDC.SubjectToString(KRDC.SingleEncryptDecrypt('123456',KRDC.StringToSubject(FDTAUsuariossenha.AsString),fDecrypt))
311329 ,ObterMatricula(MAP.De));
312330
313- // Caso seja uma mensagem de Check-In...
314- if MAP.Mensagem = 'ci' then
315- begin
316- // ...verifica se o status atual é igual a Checked-In. Isso acontece
317- // quando o banco de dados online está fora de sincronia com o sistema
318- // de frequência, permitindo assim o envio de uma mensagem que
319- // duplicaria a situação do usuário (dois registros de entrada). Caso
320- // isso aconteça...
321- if IsCheckedIn(CHI) then
331+ if CHI.UserName = '' then
332+ Responder(MAP,'Não foi possível obter o status atual. Talvez suas informações de login estejam erradas',tdrFalha)
333+ else
334+ // Caso seja uma mensagem de Check-In...
335+ if MAP.Mensagem = 'ci' then
322336 begin
323- // ...envia uma mensagem de aviso a respeito do Check-In já ter sido
324- // realizado anteriormente e logo na sequencia uma segunda mensagem,
325- // desta vez de sucesso, que tem finalidade de sincronizar os
326- // estados. Em outras palavras, a mensagem de sucesso informa ao
327- // servidor que a mensagem de Check-In foi processada com sucesso, o
328- // que no fim das contas é verdade (foi solicitado um Check-In e o
329- // Check-In foi (está!) feito)
330- Responder(MAP,'Check-In já realizado anteriormente',tdrAviso);
331- Responder(MAP,'',tdrSucesso);
337+ // ...verifica se o status atual é igual a Checked-In. Isso acontece
338+ // quando o banco de dados online está fora de sincronia com o sistema
339+ // de frequência, permitindo assim o envio de uma mensagem que
340+ // duplicaria a situação do usuário (dois registros de entrada). Caso
341+ // isso aconteça...
342+ if IsCheckedIn(CHI) then
343+ begin
344+ // ...envia uma mensagem de aviso a respeito do Check-In já ter sido
345+ // realizado anteriormente e logo na sequencia uma segunda mensagem,
346+ // desta vez de sucesso, que tem finalidade de sincronizar os
347+ // estados. Em outras palavras, a mensagem de sucesso informa ao
348+ // servidor que a mensagem de Check-In foi processada com sucesso, o
349+ // que no fim das contas é verdade (foi solicitado um Check-In e o
350+ // Check-In foi (está!) feito)
351+ Responder(MAP,'Check-In já realizado anteriormente',tdrAviso);
352+ Responder(MAP,'',tdrSucesso);
353+ end
354+ // Caso o status atual seja Checked-Out, significa que a mensagem de
355+ // Check-In é válida, portanto procedemos com a tentativa de
356+ // realização do Check-In. Se tudo ocorrer bem, a função retornará
357+ // true ou false normalmente e será enviada uma resposta de acordo com
358+ // este resultado. Se a função falhar, a exceção será capturada, uma
359+ // resposta informativa será enviada ao nosso servidor e o fluxo passa
360+ // para o próximo item da lista (mensagem do próximo usuário, se
361+ // houver)
362+ else if CheckIn(TFormPrincipal(Owner).Handle
363+ ,Configuracoes.Ambiente = aProducao
364+ ,ObterCpf(MAP.De)
365+ ,KRDC.SubjectToString(KRDC.SingleEncryptDecrypt('123456',KRDC.StringToSubject(FDTAUsuariossenha.AsString),fDecrypt))
366+ ,ObterMatricula(Map.De)) then
367+ Responder(MAP,'',tdrSucesso)
368+ else
369+ Responder(MAP,'Não foi possível realizar o Check-In. Talvez suas informações de login estejam erradas',tdrFalha);
332370 end
333- // Caso o status atual seja Checked-Out, significa que a mensagem de
334- // Check-In é válida, portanto procedemos com a tentativa de
335- // realização do Check-In. Se tudo ocorrer bem, a função retornará
336- // true ou false normalmente e será enviada uma resposta de acordo com
337- // este resultado. Se a função falhar, a exceção será capturada, uma
338- // resposta informativa será enviada ao nosso servidor e o fluxo passa
339- // para o próximo item da lista (mensagem do próximo usuário, se
340- // houver)
341- else if CheckIn(TFormPrincipal(Owner).Handle
342- ,Configuracoes.Ambiente = aProducao
343- ,ObterCpf(MAP.De)
344- ,KRDC.SubjectToString(KRDC.SingleEncryptDecrypt('123456',KRDC.StringToSubject(FDTAUsuariossenha.AsString),fDecrypt))
345- ,ObterMatricula(Map.De)) then
346- Responder(MAP,'',tdrSucesso)
347- else
348- Responder(MAP,'Talvez suas informações de login estejam erradas',tdrFalha);
349- end
350- // Caso seja uma mensagem de Check-Out...
351- else if MAP.Mensagem = 'co' then
352- begin
353- // ...verifica se o status atual é igual a Checked-Out. Isso acontece
354- // quando o banco de dados online está fora de sincronia com o sistema
355- // de frequência, permitindo assim o envio de uma mensagem que
356- // duplicaria a situação do usuário (dois registros de saída). Caso
357- // isso aconteça...
358- if not IsCheckedIn(CHI) then
371+ // Caso seja uma mensagem de Check-Out...
372+ else if MAP.Mensagem = 'co' then
359373 begin
360- // ...envia uma mensagem de aviso a respeito do Check-Out já ter
361- // sido realizado anteriormente e logo na sequencia uma segunda
362- // mensagem, desta vez de sucesso, que tem finalidade de sincronizar
363- // os estados. Em outras palavras, a mensagem de sucesso informa ao
364- // servidor que a mensagem de Check-Out foi processada com sucesso,
365- // o que no fim das contas é verdade (foi solicitado um Check-Out e
366- // o Check-Out foi (está!) feito)
367- Responder(MAP,'Check-Out já realizado anteriormente',tdrAviso);
368- Responder(MAP,'',tdrSucesso);
369- end
370- // Caso o status atual seja Checked-In, significa que a mensagem de
371- // Check-Out é válida, portanto procedemos com a tentativa de
372- // realização do Check-Out. Se tudo ocorrer bem, a função retornará
373- // true ou false normalmente e será enviada uma resposta de acordo com
374- // este resultado. Se a função falhar, a exceção será capturada, uma
375- // resposta informativa será enviada ao nosso servidor e o fluxo passa
376- // para o próximo item da lista (mensagem do próximo usuário, se
377- // houver)
378- else if CheckOut(TFormPrincipal(Owner).Handle
379- ,Configuracoes.Ambiente = aProducao
380- ,ObterCpf(MAP.De)
381- ,KRDC.SubjectToString(KRDC.SingleEncryptDecrypt('123456',KRDC.StringToSubject(FDTAUsuariossenha.AsString),fDecrypt))
382- ,ObterMatricula(MAP.de)) then
383- Responder(MAP,'',tdrSucesso)
384- else
385- Responder(MAP,'Talvez suas informações de login estejam erradas',tdrFalha);
386- end
387- // Caso seja uma mensagem de Sincronização de Status...
388- else if MAP.Mensagem = 'ss' then
389- begin
390- raise Exception.Create('A funcionalidade de sincronização de status ainda não foi implementada!');
391- end;
374+ // ...verifica se o status atual é igual a Checked-Out. Isso acontece
375+ // quando o banco de dados online está fora de sincronia com o sistema
376+ // de frequência, permitindo assim o envio de uma mensagem que
377+ // duplicaria a situação do usuário (dois registros de saída). Caso
378+ // isso aconteça...
379+ if not IsCheckedIn(CHI) then
380+ begin
381+ // ...envia uma mensagem de aviso a respeito do Check-Out já ter
382+ // sido realizado anteriormente e logo na sequencia uma segunda
383+ // mensagem, desta vez de sucesso, que tem finalidade de sincronizar
384+ // os estados. Em outras palavras, a mensagem de sucesso informa ao
385+ // servidor que a mensagem de Check-Out foi processada com sucesso,
386+ // o que no fim das contas é verdade (foi solicitado um Check-Out e
387+ // o Check-Out foi (está!) feito)
388+ Responder(MAP,'Check-Out já realizado anteriormente',tdrAviso);
389+ Responder(MAP,'',tdrSucesso);
390+ end
391+ // Caso o status atual seja Checked-In, significa que a mensagem de
392+ // Check-Out é válida, portanto procedemos com a tentativa de
393+ // realização do Check-Out. Se tudo ocorrer bem, a função retornará
394+ // true ou false normalmente e será enviada uma resposta de acordo com
395+ // este resultado. Se a função falhar, a exceção será capturada, uma
396+ // resposta informativa será enviada ao nosso servidor e o fluxo passa
397+ // para o próximo item da lista (mensagem do próximo usuário, se
398+ // houver)
399+ else if CheckOut(TFormPrincipal(Owner).Handle
400+ ,Configuracoes.Ambiente = aProducao
401+ ,ObterCpf(MAP.De)
402+ ,KRDC.SubjectToString(KRDC.SingleEncryptDecrypt('123456',KRDC.StringToSubject(FDTAUsuariossenha.AsString),fDecrypt))
403+ ,ObterMatricula(MAP.de)) then
404+ Responder(MAP,'',tdrSucesso)
405+ else
406+ Responder(MAP,'Não foi possível realizar o Check-Out. Talvez suas informações de login estejam erradas',tdrFalha);
407+ end;
392408 // ---------------------------------------------------------------------
393409 except
394410 on ECS: ECurrentStatus do
--- trunk/client/src/lib/UCiCo.pas (revision 13)
+++ trunk/client/src/lib/UCiCo.pas (revision 14)
@@ -42,7 +42,7 @@
4242
4343 const
4444 URLBASEH = 'https://homologacao-controlefrequencia.app.tjpe.gov.br/';
45- URLBASEP = 'https://www.tjpe.jus.br/controlefrequencia/';
45+ URLBASEP = 'https://controlefrequencia.app.tjpe.jus.br/';
4646 SEMVERIFICATIONCOOKIE = 'Não foi possível obter o cookie de verificação. Revise suas informações de login e tente novamente';
4747
4848 type
@@ -66,7 +66,7 @@
6666
6767 RO.AutoClearSSLState := True;
6868 RO.Content := nil;
69- RO.InternetOpenParams.Agent := 'Delphi Rulez Muthafucker!';
69+ RO.InternetOpenParams.Agent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 OPR/66.0.3515.72';
7070 RO.InternetOpenParams.AccessType := INTERNET_OPEN_TYPE_PRECONFIG;
7171 RO.InternetOpenParams.ProxyName := nil;
7272 RO.InternetOpenParams.ProxyBypass := nil;
@@ -153,7 +153,7 @@
153153 Free;
154154 end;
155155
156- RO.InternetOpenParams.Agent := 'Delphi Rulez Muthafucker!';
156+ RO.InternetOpenParams.Agent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 OPR/66.0.3515.72';
157157 RO.InternetOpenParams.AccessType := INTERNET_OPEN_TYPE_PRECONFIG;
158158
159159 if AProducao then
@@ -175,7 +175,6 @@
175175 RO.HttpOpenRequestParams.IgnoreInvalidCertificates := False;
176176 RO.HttpOpenRequestParams.Headers := TStringList.Create;
177177 RO.HttpOpenRequestParams.Headers.Add('Content-Type: application/x-www-form-urlencoded');
178-// RO.HttpOpenRequestParams.Headers.Add('Cookie: ' + AVerificationCookie + '; ' + ABaseCookie + '; ROUTEID=.1');
179178 RO.HttpSendRequestParams.IgnoreInvalidCertificateCA := True;
180179
181180 RE.Content := TStringStream.Create('');
@@ -218,7 +217,7 @@
218217 Free;
219218 end;
220219
221- RO.InternetOpenParams.Agent := 'Delphi Rulez Muthafucker!';
220+ RO.InternetOpenParams.Agent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 OPR/66.0.3515.72';
222221 RO.InternetOpenParams.AccessType := INTERNET_OPEN_TYPE_PRECONFIG;
223222
224223 if AProducao then
@@ -240,7 +239,6 @@
240239 RO.HttpOpenRequestParams.IgnoreInvalidCertificates := False;
241240 RO.HttpOpenRequestParams.Headers := TStringList.Create;
242241 RO.HttpOpenRequestParams.Headers.Add('Content-Type: application/x-www-form-urlencoded');
243-// RO.HttpOpenRequestParams.Headers.Add('Cookie: ' + AVerificationCookie + '; ' + ABaseCookie + '; ROUTEID=.1');
244242 RO.HttpSendRequestParams.IgnoreInvalidCertificateCA := True;
245243
246244 RE.Content := TStringStream.Create('');
@@ -308,7 +306,7 @@
308306 Free;
309307 end;
310308
311- RO.InternetOpenParams.Agent := 'Delphi Rulez Muthafucker!';
309+ RO.InternetOpenParams.Agent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 OPR/66.0.3515.72';
312310 RO.InternetOpenParams.AccessType := INTERNET_OPEN_TYPE_PRECONFIG;
313311 RO.InternetOpenParams.ProxyName := nil;
314312 RO.InternetOpenParams.ProxyBypass := nil;
@@ -412,6 +410,11 @@
412410 end;
413411 end;
414412
413+procedure ExecuteLogout(AHandle: THandle; AProducao: Boolean);
414+begin
415+ InternetSetOption(0, INTERNET_OPTION_END_BROWSER_SESSION, nil, 0);
416+end;
417+
415418 function ConfirmDirection(AHandle: THandle; AProducao: Boolean; AIn: Boolean): Boolean;
416419 var
417420 RO: TRequestOptions;
@@ -447,7 +450,7 @@
447450 Free;
448451 end;
449452
450- RO.InternetOpenParams.Agent := 'Delphi Rulez Muthafucker!';
453+ RO.InternetOpenParams.Agent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 OPR/66.0.3515.72';
451454 RO.InternetOpenParams.AccessType := INTERNET_OPEN_TYPE_PRECONFIG;
452455
453456 if AProducao then
@@ -513,6 +516,9 @@
513516
514517 // Fase 3: Abrir a página de registro de entrada / saída
515518 Result := OpenCheckInCheckOutPage(AHandle,AProducao,AdditionalInfo.IdBotaoRegistroEntradaSaida);
519+
520+ // Fase 4: Realiza o logout
521+ ExecuteLogout(AHandle,AProducao);
516522 except
517523 on E: Exception do
518524 raise ECurrentStatus.Create(E.Message);
@@ -538,6 +544,9 @@
538544
539545 // Fase 5: Confirma a entrada
540546 Result := ConfirmDirection(AHandle,AProducao,True);
547+
548+ // Fase 6: Realiza o logout
549+ ExecuteLogout(AHandle,AProducao);
541550 except
542551 on E: Exception do
543552 raise ECheckIn.Create(E.Message);
@@ -563,6 +572,9 @@
563572
564573 // Fase 5: Confirma a saída
565574 Result := ConfirmDirection(AHandle,AProducao,False);
575+
576+ // Fase 6: Realiza o logout
577+ ExecuteLogout(AHandle,AProducao);
566578 except
567579 on E: Exception do
568580 raise ECheckOut.Create(E.Message);
Show on old repository browser