Commit 914163589b24c36502004644802dcaa07f384699

Authored by ROGERIO CASSIMIRO DE SOUZA
1 parent 04a6ed49
Exists in master

redmine #4583 validacao usuario ldap ao assinar

cit-ecm-api/src/main/java/br/com/centralit/api/service/impl/AssinaturaServiceImpl.java
1 package br.com.centralit.api.service.impl; 1 package br.com.centralit.api.service.impl;
2 2
  3 +import java.util.Hashtable;
  4 +
  5 +import javax.naming.AuthenticationException;
  6 +import javax.naming.Context;
  7 +import javax.naming.NamingEnumeration;
  8 +import javax.naming.NamingException;
  9 +import javax.naming.directory.DirContext;
  10 +import javax.naming.directory.InitialDirContext;
  11 +import javax.naming.directory.SearchControls;
  12 +import javax.naming.directory.SearchResult;
  13 +
3 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.beans.factory.annotation.Value; 15 import org.springframework.beans.factory.annotation.Value;
5 import org.springframework.security.core.context.SecurityContextHolder; 16 import org.springframework.security.core.context.SecurityContextHolder;
@@ -24,7 +35,10 @@ import br.com.centralit.framework.service.arquitetura.GenericServiceImpl; @@ -24,7 +35,10 @@ import br.com.centralit.framework.service.arquitetura.GenericServiceImpl;
24 import br.com.centralit.framework.util.UtilObjeto; 35 import br.com.centralit.framework.util.UtilObjeto;
25 import br.com.centralit.framework.util.UtilString; 36 import br.com.centralit.framework.util.UtilString;
26 37
  38 +
27 /** 39 /**
  40 + * <p><b>Title: </b></p>
  41 + * <p><b>Description: </b></p>
28 * <p> 42 * <p>
29 * <b>Title: </b> 43 * <b>Title: </b>
30 * </p> 44 * </p>
@@ -36,41 +50,65 @@ import br.com.centralit.framework.util.UtilString; @@ -36,41 +50,65 @@ import br.com.centralit.framework.util.UtilString;
36 * @author rogerio.cassimiro 50 * @author rogerio.cassimiro
37 * 51 *
38 */ 52 */
  53 +@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
39 @Service("assinaturaService") 54 @Service("assinaturaService")
40 public class AssinaturaServiceImpl extends GenericServiceImpl<Assinatura, Long> implements AssinaturaService { 55 public class AssinaturaServiceImpl extends GenericServiceImpl<Assinatura, Long> implements AssinaturaService {
41 56
42 @Autowired 57 @Autowired
43 private AssinaturaDao assinaturaDao; 58 private AssinaturaDao assinaturaDao;
  59 +
44 60
45 @Autowired 61 @Autowired
46 private DocumentoGedService documentoGedService; 62 private DocumentoGedService documentoGedService;
  63 +
47 64
48 @Autowired 65 @Autowired
49 private UsuarioService usuarioService; 66 private UsuarioService usuarioService;
  67 +
50 68
51 @Autowired 69 @Autowired
52 private DominioService dominioService; 70 private DominioService dominioService;
  71 +
53 72
54 @Autowired 73 @Autowired
55 private FuncaoService funcaoService; 74 private FuncaoService funcaoService;
  75 +
56 76
57 @Autowired 77 @Autowired
58 private PessoaService pessoaService; 78 private PessoaService pessoaService;
  79 +
59 80
60 @Autowired 81 @Autowired
61 private HistoricoAlteracaoProcessoService historicoAlteracaoProcessoService; 82 private HistoricoAlteracaoProcessoService historicoAlteracaoProcessoService;
  83 +
62 84
63 @Autowired 85 @Autowired
64 private TarjaAssinaturaService tarjaAssinaturaService; 86 private TarjaAssinaturaService tarjaAssinaturaService;
  87 +
65 88
66 @Value("${metodo.autenticacao.ldap}") 89 @Value("${metodo.autenticacao.ldap}")
67 private String ldap; 90 private String ldap;
  91 +
  92 +
  93 + @Value("${ldap.host.name}")
  94 + public String ldapHostName;
  95 +
  96 + @Value("${ldap.userDn}")
  97 + public String ldapUserDn = "CN=CitSmart,OU=CitSmart,OU=Pro,OU=ContasServicos,OU=CentralIT,DC=cit,DC=local";
  98 +
  99 + @Value("${ldap.manager.password}")
  100 + public String ldapManagerPassword;
  101 +
  102 + @Value("${ldap.searchDC}")
  103 + public String ldapSearchDC;
68 104
69 @Autowired 105 @Autowired
  106 + public AssinaturaServiceImpl( AssinaturaDao assinaturaDao) {
70 public AssinaturaServiceImpl( AssinaturaDao assinaturaDao ) { 107 public AssinaturaServiceImpl( AssinaturaDao assinaturaDao ) {
71 108
72 this.dao = assinaturaDao; 109 this.dao = assinaturaDao;
73 } 110 }
  111 +
74 112
75 /** 113 /**
76 * Salva assinatura do documento e gera histórico 114 * Salva assinatura do documento e gera histórico
@@ -82,6 +120,7 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt; @@ -82,6 +120,7 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt;
82 validarSenha(assinatura.getPassword(), usuario); 120 validarSenha(assinatura.getPassword(), usuario);
83 montarTransients(assinatura, usuario); 121 montarTransients(assinatura, usuario);
84 historicoAlteracaoProcessoService.gerarHistoricoAssinatura(assinatura); 122 historicoAlteracaoProcessoService.gerarHistoricoAssinatura(assinatura);
  123 + tarjaAssinaturaService.gerarAssinaturaInternaUsuario(assinatura,assinatura.getDocumentoGed().getFormaCriacao().getCodigo());
85 tarjaAssinaturaService.gerarAssinaturaInternaUsuario(assinatura, assinatura.getDocumentoGed().getFormaCriacao().getCodigo()); 124 tarjaAssinaturaService.gerarAssinaturaInternaUsuario(assinatura, assinatura.getDocumentoGed().getFormaCriacao().getCodigo());
86 alterarEstadoDocumento(assinatura.getDocumentoGed()); 125 alterarEstadoDocumento(assinatura.getDocumentoGed());
87 return super.save(assinatura); 126 return super.save(assinatura);
@@ -94,6 +133,7 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt; @@ -94,6 +133,7 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt;
94 * @param documentoGed 133 * @param documentoGed
95 */ 134 */
96 private void alterarEstadoDocumento(DocumentoGed documentoGed) { 135 private void alterarEstadoDocumento(DocumentoGed documentoGed) {
  136 + if(documentoGed.getFormaCriacao().getCodigo().equals(1L) && !documentoGed.getEstado().getCodigo().equals(2L))
97 137
98 if (documentoGed.getFormaCriacao().getCodigo().equals(1L) && !documentoGed.getEstado().getCodigo().equals(2L)) 138 if (documentoGed.getFormaCriacao().getCodigo().equals(1L) && !documentoGed.getEstado().getCodigo().equals(2L))
99 documentoGed.setEstado(dominioService.findByChaveAndCodigo("estadoDocumentoGed", 2L)); 139 documentoGed.setEstado(dominioService.findByChaveAndCodigo("estadoDocumentoGed", 2L));
@@ -114,6 +154,7 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt; @@ -114,6 +154,7 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt;
114 assinatura.setTipoAssinatura(dominioService.findByChaveAndCodigo(Dominio.TIPO_ASSINATURA, Dominio.TIPO_ASSINATURA_INTERNA)); 154 assinatura.setTipoAssinatura(dominioService.findByChaveAndCodigo(Dominio.TIPO_ASSINATURA, Dominio.TIPO_ASSINATURA_INTERNA));
115 assinatura.setFuncao(funcaoService.getReference(assinatura.getFuncao().getId())); 155 assinatura.setFuncao(funcaoService.getReference(assinatura.getFuncao().getId()));
116 } 156 }
  157 +
117 158
118 /** 159 /**
119 * Método responsável por validar senha para assinar o documento 160 * Método responsável por validar senha para assinar o documento
@@ -123,21 +164,85 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt; @@ -123,21 +164,85 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt;
123 * @param usuario 164 * @param usuario
124 */ 165 */
125 private void validarSenha(String password, Usuario usuario) { 166 private void validarSenha(String password, Usuario usuario) {
  167 +
  168 + if(!UtilString.isNullOrEmpty(ldap) && ldap.equals("false")) {
126 169
127 - if (!UtilString.isNullOrEmpty(ldap) && ldap.equals("false")) { 170 + if(UtilString.isNullOrEmpty(password))
  171 + if (!UtilString.isNullOrEmpty(ldap) && !Boolean.parseBoolean(ldap)) {
128 172
129 if (UtilString.isNullOrEmpty(password)) 173 if (UtilString.isNullOrEmpty(password))
130 throw new BusinessException("ECM.VALIDACAO.SENHA_ASSINATURA", CodigoErro.REGRA_NEGOCIO.getValue(), ""); 174 throw new BusinessException("ECM.VALIDACAO.SENHA_ASSINATURA", CodigoErro.REGRA_NEGOCIO.getValue(), "");
  175 +
  176 + if(!UtilObjeto.isReferencia(this.usuarioService.loadUserByUsernamePasswordMobile(usuario.getUsername(), password)))
131 177
132 if (!UtilObjeto.isReferencia(this.usuarioService.loadUserByUsernamePasswordMobile(usuario.getUsername(), password))) 178 if (!UtilObjeto.isReferencia(this.usuarioService.loadUserByUsernamePasswordMobile(usuario.getUsername(), password)))
133 throw new BusinessException("ECM.VALIDACAO.SENHA_ASSINATURA_INVALIDA", CodigoErro.REGRA_NEGOCIO.getValue(), ""); 179 throw new BusinessException("ECM.VALIDACAO.SENHA_ASSINATURA_INVALIDA", CodigoErro.REGRA_NEGOCIO.getValue(), "");
  180 +
134 181
135 - } else {  
136 - // TODO LDAP validação 182 + } else if (!UtilString.isNullOrEmpty(ldap) && Boolean.parseBoolean(ldap)) {
  183 +
  184 + autenticarMaster(password, usuario.getUsername());
137 } 185 }
138 } 186 }
139 187
140 /** 188 /**
  189 + * Método responsável por autenticar usuário master do LDAP
  190 + *
  191 + * @author rogerio.cassimiro
  192 + * @return {@link Boolean}
  193 + */
  194 + public boolean autenticarMaster(String password, String userName) {
  195 +
  196 + Hashtable authEnv = new Hashtable(11);
  197 + authEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
  198 + authEnv.put(Context.PROVIDER_URL, ldapHostName);
  199 + authEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
  200 + authEnv.put(Context.SECURITY_PRINCIPAL, ldapUserDn);
  201 + authEnv.put(Context.SECURITY_CREDENTIALS, ldapManagerPassword);
  202 +
  203 + try {
  204 +
  205 + SearchControls groupsSearchCtls = new SearchControls();
  206 + groupsSearchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
  207 + DirContext authContext = new InitialDirContext(authEnv);
  208 + NamingEnumeration results = authContext.search(ldapSearchDC, "(sAMAccountName=" + userName + ")", groupsSearchCtls);
  209 + while (results.hasMore()) {
  210 + SearchResult result = (SearchResult) results.next();
  211 + if (autenticarUser(result.getName() + "," + ldapSearchDC, password)) {
  212 + return Boolean.TRUE;
  213 + } else {
  214 + //TODO LDAP validação
  215 + throw new BusinessException("ECM.VALIDACAO.SENHA_ASSINATURA_INVALIDA", CodigoErro.REGRA_NEGOCIO.getValue(), "");
  216 + }
  217 + }
  218 +
  219 + } catch (AuthenticationException authEx) {
  220 + throw new BusinessException("ECM.VALIDACAO.SENHA_ASSINATURA_INVALIDA", CodigoErro.REGRA_NEGOCIO.getValue(), "");
  221 + } catch (NamingException namEx) {
  222 + throw new BusinessException("ECM.VALIDACAO.SENHA_ASSINATURA_INVALIDA", CodigoErro.REGRA_NEGOCIO.getValue(), "");
  223 + }
  224 + return Boolean.FALSE;
  225 + }
  226 +
  227 + private boolean autenticarUser(String caminho, String senha) {
  228 +
  229 + Hashtable authEnv = new Hashtable(11);
  230 + authEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
  231 + authEnv.put(Context.PROVIDER_URL, ldapHostName);
  232 + authEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
  233 + authEnv.put(Context.SECURITY_PRINCIPAL, caminho);
  234 + authEnv.put(Context.SECURITY_CREDENTIALS, senha);
  235 + try {
  236 + DirContext authContext = new InitialDirContext(authEnv);
  237 + return true;
  238 + } catch (AuthenticationException authEx) {
  239 + } catch (NamingException namEx) {
  240 + }
  241 + return false;
  242 +
  243 + }
  244 +
  245 + /**
141 * Método responsável por validar se o usuário já teve assinatura anterior para o documento informado 246 * Método responsável por validar se o usuário já teve assinatura anterior para o documento informado
142 * 247 *
143 * @author rogerio.cassimiro 248 * @author rogerio.cassimiro
@@ -145,6 +250,7 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt; @@ -145,6 +250,7 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt;
145 */ 250 */
146 @Override 251 @Override
147 public Boolean validarAssinaturaPorUsuario(Long idDocumento) { 252 public Boolean validarAssinaturaPorUsuario(Long idDocumento) {
  253 + return this.assinaturaDao.validarAssinaturaPorUsuario(idDocumento, ((Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId());
148 254
149 return this.assinaturaDao.validarAssinaturaPorUsuario(idDocumento, ( (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal() ).getId()); 255 return this.assinaturaDao.validarAssinaturaPorUsuario(idDocumento, ( (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal() ).getId());
150 } 256 }
@@ -154,10 +260,10 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt; @@ -154,10 +260,10 @@ public class AssinaturaServiceImpl extends GenericServiceImpl&lt;Assinatura, Long&gt;
154 260
155 Assinatura assinatura = (Assinatura) this.assinaturaDao.getReference(id); 261 Assinatura assinatura = (Assinatura) this.assinaturaDao.getReference(id);
156 assinatura.getConteudoTarja().setConteudo(tarjaAssinaturaService.decrypted(assinatura.getConteudoTarja().getConteudoCriptografado())); 262 assinatura.getConteudoTarja().setConteudo(tarjaAssinaturaService.decrypted(assinatura.getConteudoTarja().getConteudoCriptografado()));
  263 + if(UtilObjeto.isReferencia(assinatura.getDocumentoGed().getConteudoTarja())){
157 if (UtilObjeto.isReferencia(assinatura.getDocumentoGed().getConteudoTarja())) { 264 if (UtilObjeto.isReferencia(assinatura.getDocumentoGed().getConteudoTarja())) {
158 assinatura.getDocumentoGed().getConteudoTarja().setConteudo(tarjaAssinaturaService.decrypted(assinatura.getDocumentoGed().getConteudoTarja().getConteudoCriptografado())); 265 assinatura.getDocumentoGed().getConteudoTarja().setConteudo(tarjaAssinaturaService.decrypted(assinatura.getDocumentoGed().getConteudoTarja().getConteudoCriptografado()));
159 } 266 }
160 return assinatura; 267 return assinatura;
161 } 268 }
162 -  
163 -} 269 +}
164 \ No newline at end of file 270 \ No newline at end of file
cit-ecm-api/src/main/java/br/com/centralit/api/service/impl/TarjaAssinaturaServiceImpl.java
@@ -52,6 +52,7 @@ import com.lowagie.text.DocumentException; @@ -52,6 +52,7 @@ import com.lowagie.text.DocumentException;
52 * @author ciro.junior (<a href="mailto:ciro.junior@centralit.com.br">ciro.junior@centralit.com.br</a>) 52 * @author ciro.junior (<a href="mailto:ciro.junior@centralit.com.br">ciro.junior@centralit.com.br</a>)
53 * 53 *
54 */ 54 */
  55 +
55 @Service("tarjaAssinaturaService") 56 @Service("tarjaAssinaturaService")
56 public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatura, Long> implements TarjaAssinaturaService { 57 public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatura, Long> implements TarjaAssinaturaService {
57 58
@@ -147,7 +148,7 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl&lt;TarjaAssinatu @@ -147,7 +148,7 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl&lt;TarjaAssinatu
147 TarjaAssinatura tarjaAssinatura = (TarjaAssinatura) tarjaAssinaturaDao.getReference(assinatura.getConteudoTarja().getIdTarjaAssinatura()); 148 TarjaAssinatura tarjaAssinatura = (TarjaAssinatura) tarjaAssinaturaDao.getReference(assinatura.getConteudoTarja().getIdTarjaAssinatura());
148 String conteudoAssinatura = getConteudoTarja(assinatura, tarjaAssinatura.getConteudo(), tarjaAssinatura); 149 String conteudoAssinatura = getConteudoTarja(assinatura, tarjaAssinatura.getConteudo(), tarjaAssinatura);
149 150
150 - gerarAssinaturaDocAnexo(assinatura, tarjaAssinatura.getAnexoImagem(), conteudoAssinatura); 151 + gerarAssinaturaDocAnexo(assinatura, tarjaAssinatura.getAnexoImagem(), conteudoAssinatura, formaCriacao);
151 if (formaCriacao == 1) 152 if (formaCriacao == 1)
152 gerarAssinaturaDocOnline(assinatura, tarjaAssinatura.getAnexoImagem(), conteudoAssinatura); 153 gerarAssinaturaDocOnline(assinatura, tarjaAssinatura.getAnexoImagem(), conteudoAssinatura);
153 } 154 }
@@ -196,12 +197,23 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl&lt;TarjaAssinatu @@ -196,12 +197,23 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl&lt;TarjaAssinatu
196 * @throws DocumentException 197 * @throws DocumentException
197 * @throws IOException 198 * @throws IOException
198 */ 199 */
199 - private void gerarAssinaturaDocAnexo(Assinatura assinatura, AnexoImagem anexoImagem, String conteudoAssinatura) { 200 + private void gerarAssinaturaDocAnexo(Assinatura assinatura, AnexoImagem anexoImagem, String conteudoAssinatura, Long formaCriacao) {
200 201
201 assinatura.getConteudoTarja().setConteudoCriptografado(this.encrypted(conteudoAssinatura)); 202 assinatura.getConteudoTarja().setConteudoCriptografado(this.encrypted(conteudoAssinatura));
202 assinatura.getConteudoTarja().setAnexoImagem(anexoImagem); 203 assinatura.getConteudoTarja().setAnexoImagem(anexoImagem);
  204 +
  205 + if (formaCriacao == 2){
  206 + StringBuilder conteudoOriginalDocAnexo = new StringBuilder();
  207 + if (UtilObjeto.isReferencia(assinatura.getDocumentoGed().getConteudoTarja())) {
  208 + conteudoOriginalDocAnexo.append(decrypted(assinatura.getDocumentoGed().getConteudoTarja().getConteudoCriptografado()));
  209 + } else {
  210 + assinatura.getDocumentoGed().setConteudoTarja(new ConteudoTarja());
  211 + }
  212 + conteudoOriginalDocAnexo.append(conteudoAssinatura);
  213 + assinatura.getDocumentoGed().getConteudoTarja().setConteudoCriptografado(this.encrypted(conteudoOriginalDocAnexo.toString()));
  214 + }
203 } 215 }
204 - 216 +
205 /** 217 /**
206 * Método responsável por gerar assinatura em documento online 218 * Método responsável por gerar assinatura em documento online
207 * 219 *
cit-ecm-web/src/main/webapp/html/assinatura/documentoAssinaturas.html
@@ -43,10 +43,7 @@ @@ -43,10 +43,7 @@
43 <td colspan="7"> 43 <td colspan="7">
44 <iframe id="conteudoPrototipo" srcdoc="{{assinaturaSelecionada.documentoGed.conteudoTarja.conteudo}}" allowfullscreen class="iframe-assinatura" ng-if="visualizarAssinaturaOnLine"></iframe> 44 <iframe id="conteudoPrototipo" srcdoc="{{assinaturaSelecionada.documentoGed.conteudoTarja.conteudo}}" allowfullscreen class="iframe-assinatura" ng-if="visualizarAssinaturaOnLine"></iframe>
45 <div class="row" style="margin-top: 10px; margin-bottom: 10px;" ng-hide="visualizarAssinaturaOnLine"> 45 <div class="row" style="margin-top: 10px; margin-bottom: 10px;" ng-hide="visualizarAssinaturaOnLine">
46 - <div class="col-sm-2" ng-show="assinaturaSelecionada.conteudoTarja.anexoImagem.anexo">  
47 - <img ng-src="data:image/JPEG;base64,{{assinaturaSelecionada.conteudoTarja.anexoImagem.anexo}}" class="img-thumbnail" style="max-width: 80px; height: 80px;">  
48 - </div>  
49 - <div class="col-md-10"> 46 + <div class="col-md-12">
50 <iframe id="conteudoAssinado" srcdoc="{{assinaturaSelecionada.conteudoTarja.conteudo}}" allowfullscreen class="iframe-assinatura" 47 <iframe id="conteudoAssinado" srcdoc="{{assinaturaSelecionada.conteudoTarja.conteudo}}" allowfullscreen class="iframe-assinatura"
51 style="min-height: 80px !important; max-height: 120px !important;"> 48 style="min-height: 80px !important; max-height: 120px !important;">
52 </iframe> 49 </iframe>