PageRenderTime 111ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/tine20/library/Prodemge/Tinebase/SscHelper.php

https://gitlab.com/israel.correa/Expresso
PHP | 136 lines | 69 code | 17 blank | 50 comment | 2 complexity | cfd722c774d0733c909de127da3a5e62 MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-3.0, LGPL-2.1, LGPL-3.0, JSON, Apache-2.0
  1. <?php
  2. /**
  3. * Tine 2.0
  4. *
  5. * @package Prodemge
  6. * @subpackage Tinebase
  7. * @license http://www.gnu.org/licenses/agpl.html AGPL Version 3
  8. * @copyright Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
  9. * @author Victor Pinheiro <victor.prodemge.gov.br>
  10. *
  11. */
  12. /**
  13. *
  14. * @package Prodemge
  15. * @subpackage Tinebase
  16. */
  17. class Prodemge_Tinebase_SscHelper
  18. {
  19. /**
  20. * Monta a url de chamada do Sistema Segurança Corporativo com os parametros exigidos
  21. * @param string $operacao:
  22. * @param string $type: 'full' - completa, 'base' - apenas a url base, 'params' - apenas os parametros
  23. * @param string $refererFull: se retorna a url completa ou apenas o contexto
  24. * @return string da url
  25. */
  26. public function getUrlSSC( $operacao = 'login', $type = 'full') {
  27. $referer = "";
  28. // url do IDP do SSC cadastrado em config.inc.php
  29. $urlIDP = Tinebase_Core::getConfig()->global->plugins->ssc->hostIDP;
  30. // url do IDP do SSC cadastrado em config.inc.php
  31. $referer = Tinebase_Core::getConfig()->global->plugins->ssc->referer;
  32. // encode base64 exigido pelo SSC
  33. $referer = base64_encode( $referer );
  34. // xml do SAMLRequest codificado na base64
  35. switch ( $operacao ) {
  36. case "login":
  37. $xmlBase64 = $this->getXmlLoginBase64();
  38. break;
  39. case "logout":
  40. $xmlBase64 = $this->getXmlLogoutBase64();
  41. break;
  42. default:
  43. break;
  44. }
  45. // formata a url com a url do idp mais os parametros exigigos pelo SSC
  46. switch ( $type ) {
  47. // a url completa
  48. case "full":
  49. $urlSSC = $urlIDP;
  50. $urlSSC .= "?Referer=". $referer;
  51. $urlSSC .= "&SAMLRequest=". $xmlBase64;
  52. break;
  53. // penas a url base
  54. case 'base':
  55. $urlSSC = $urlIDP;
  56. break;
  57. // apenas os parametros formato GET
  58. case 'params':
  59. $urlSSC = "Referer=". $referer;
  60. $urlSSC .= "&SAMLRequest=". $xmlBase64;
  61. break;
  62. // a url completa
  63. default:
  64. $urlSSC = $urlIDP;
  65. $urlSSC .= "?Referer=". $referer;
  66. $urlSSC .= "&SAMLRequest=". $xmlBase64;
  67. break;
  68. }
  69. return $urlSSC;
  70. }
  71. /**
  72. * Monta o XML esperado no Sistema Seguran�a Corporativo (SSC) ao solicitar o login
  73. * @return string do xml na base64
  74. */
  75. public function getXmlLoginBase64() {
  76. // parametros necessários para o SAMLRequest
  77. $assertion = Tinebase_Core::getConfig()->global->plugins->ssc->appUrl;
  78. $destination = Tinebase_Core::getConfig()->global->plugins->ssc->hostIDP;
  79. $id = 'ID_'. uniqid();
  80. $issuer = Tinebase_Core::getConfig()->global->plugins->ssc->appUrl;
  81. $datetime = date('Y-m-d\TH:i:s');
  82. $xml = sprintf('<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns="urn:oasis:names:tc:SAML:2.0:assertion" AssertionConsumerServiceURL="%s" Destination="%s" ID="%s" IssueInstant="%s.724Z" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0"><saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">%s</saml:Issuer><samlp:NameIDPolicy AllowCreate="true" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/></samlp:AuthnRequest>',
  83. $assertion, $destination, $id, $datetime, $issuer);
  84. return base64_encode($xml);
  85. }
  86. /**
  87. * Monta o XML esperado no Sistema Segurança Corporativo (SSC) ao solicitar o logout
  88. * @return string do xml na base64
  89. */
  90. public function getXmlLogoutBase64() {
  91. // parametros necessários para o SAMLRequest
  92. $username = Tinebase_Core::getUser();
  93. $id = 'ID_'. session_id();
  94. $issuer = Tinebase_Core::getConfig()->global->plugins->ssc->appUrl;
  95. $datetime = date('Y-m-d\TH:i:s');
  96. $sessionIndex = 0;
  97. $xml = sprintf('<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="%s" IssueInstant="%s.724Z" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Destination="%s" Version="2.0"> <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">%s</saml:Issuer> <saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">%s</saml:NameID></samlp:LogoutRequest>',
  98. $id, $datetime, $issuer, $issuer, $username);
  99. return base64_encode($xml);
  100. }
  101. /**
  102. * @return string
  103. */
  104. public function getRefererBase64() {
  105. return base64_encode(Tinebase_Core::getConfig()->global->plugins->ssc->referer);
  106. }
  107. /**
  108. * @return string
  109. */
  110. public function getHostIdpBase64() {
  111. return Tinebase_Core::getConfig()->global->plugins->ssc->hostIDP;
  112. }
  113. /**
  114. * @return string
  115. */
  116. public function getUrlLogout(){
  117. return Tinebase_Core::getConfig()->global->plugins->ssc->urlLogout;
  118. }
  119. }