Commit 00286f74a3d7c5b805a3050c17dc8721217eb125
1 parent
04a6ed49
Exists in
master
[4583] - Assinar documento digital.
Showing
4 changed files
with
145 additions
and
14 deletions
Show diff stats
cit-ecm-api/src/main/java/br/com/centralit/api/model/DocumentoGed.java
| @@ -120,6 +120,12 @@ public class DocumentoGed extends PersistentObjectUnidade implements Cloneable { | @@ -120,6 +120,12 @@ public class DocumentoGed extends PersistentObjectUnidade implements Cloneable { | ||
| 120 | @Type(type = "org.hibernate.type.BinaryType") | 120 | @Type(type = "org.hibernate.type.BinaryType") |
| 121 | private byte[] conteudoCriptografado; | 121 | private byte[] conteudoCriptografado; |
| 122 | 122 | ||
| 123 | + /** Atributo conteudoAssinado. */ | ||
| 124 | + @Lob | ||
| 125 | + @Basic(fetch = FetchType.LAZY) | ||
| 126 | + @Type(type = "org.hibernate.type.BinaryType") | ||
| 127 | + private byte[] conteudoAssinado; | ||
| 128 | + | ||
| 123 | /** Atributo icon. */ | 129 | /** Atributo icon. */ |
| 124 | @JsonView({ ViewsEcm.DocumentoGedEdit.class, Views.ProcessoEdit.class, ViewsEcm.ClassificacaoDocumentoGedView.class }) | 130 | @JsonView({ ViewsEcm.DocumentoGedEdit.class, Views.ProcessoEdit.class, ViewsEcm.ClassificacaoDocumentoGedView.class }) |
| 125 | private String icon; | 131 | private String icon; |
| @@ -1070,4 +1076,24 @@ public class DocumentoGed extends PersistentObjectUnidade implements Cloneable { | @@ -1070,4 +1076,24 @@ public class DocumentoGed extends PersistentObjectUnidade implements Cloneable { | ||
| 1070 | this.tresAssinaturas = tresAssinaturas; | 1076 | this.tresAssinaturas = tresAssinaturas; |
| 1071 | } | 1077 | } |
| 1072 | 1078 | ||
| 1079 | + /** | ||
| 1080 | + * Retorna o valor do atributo <code>conteudoAssinado</code> | ||
| 1081 | + * | ||
| 1082 | + * @return <code>byte[]</code> | ||
| 1083 | + */ | ||
| 1084 | + public byte[] getConteudoAssinado() { | ||
| 1085 | + | ||
| 1086 | + return conteudoAssinado; | ||
| 1087 | + } | ||
| 1088 | + | ||
| 1089 | + /** | ||
| 1090 | + * Define o valor do atributo <code>conteudoAssinado</code>. | ||
| 1091 | + * | ||
| 1092 | + * @param conteudoAssinado | ||
| 1093 | + */ | ||
| 1094 | + public void setConteudoAssinado(byte[] conteudoAssinado) { | ||
| 1095 | + | ||
| 1096 | + this.conteudoAssinado = conteudoAssinado; | ||
| 1097 | + } | ||
| 1098 | + | ||
| 1073 | } | 1099 | } |
cit-ecm-api/src/main/java/br/com/centralit/api/service/AssinaturaUtilService.java
| 1 | package br.com.centralit.api.service; | 1 | package br.com.centralit.api.service; |
| 2 | 2 | ||
| 3 | +import java.security.NoSuchAlgorithmException; | ||
| 4 | + | ||
| 3 | /** | 5 | /** |
| 4 | * <p> | 6 | * <p> |
| 5 | * <img src="http://centralit.com.br/images/logo_central.png"> | 7 | * <img src="http://centralit.com.br/images/logo_central.png"> |
| @@ -53,4 +55,42 @@ public interface AssinaturaUtilService { | @@ -53,4 +55,42 @@ public interface AssinaturaUtilService { | ||
| 53 | */ | 55 | */ |
| 54 | byte[] geraAssinatura(byte[] conteudo) throws Exception; | 56 | byte[] geraAssinatura(byte[] conteudo) throws Exception; |
| 55 | 57 | ||
| 58 | + /** | ||
| 59 | + * <p> | ||
| 60 | + * <b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a> | ||
| 61 | + * </p> | ||
| 62 | + * | ||
| 63 | + * <p> | ||
| 64 | + * <b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a> | ||
| 65 | + * </p> | ||
| 66 | + * | ||
| 67 | + * Método responsável por gerar o hash do documento | ||
| 68 | + * | ||
| 69 | + * @author rogerio.costa | ||
| 70 | + * | ||
| 71 | + * @param doc | ||
| 72 | + * @return | ||
| 73 | + * @throws NoSuchAlgorithmException | ||
| 74 | + */ | ||
| 75 | + byte[] gerarHash(byte[] doc) throws NoSuchAlgorithmException; | ||
| 76 | + | ||
| 77 | + /** | ||
| 78 | + * <p> | ||
| 79 | + * <b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a> | ||
| 80 | + * </p> | ||
| 81 | + * | ||
| 82 | + * <p> | ||
| 83 | + * <b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a> | ||
| 84 | + * </p> | ||
| 85 | + * | ||
| 86 | + * Método responsável por por gerar o hash do documento | ||
| 87 | + * | ||
| 88 | + * @author rogerio.costa | ||
| 89 | + * | ||
| 90 | + * @param doc | ||
| 91 | + * @return | ||
| 92 | + * @throws NoSuchAlgorithmException | ||
| 93 | + */ | ||
| 94 | + String gerarHash(String doc) throws NoSuchAlgorithmException; | ||
| 95 | + | ||
| 56 | } | 96 | } |
cit-ecm-api/src/main/java/br/com/centralit/api/service/impl/AssinaturaUtilServiceImpl.java
| @@ -214,11 +214,63 @@ public class AssinaturaUtilServiceImpl implements AssinaturaUtilService { | @@ -214,11 +214,63 @@ public class AssinaturaUtilServiceImpl implements AssinaturaUtilService { | ||
| 214 | */ | 214 | */ |
| 215 | public byte[] gerarHash(byte[] doc) throws NoSuchAlgorithmException { | 215 | public byte[] gerarHash(byte[] doc) throws NoSuchAlgorithmException { |
| 216 | 216 | ||
| 217 | - MessageDigest md = MessageDigest.getInstance("MD5"); | 217 | + MessageDigest md = MessageDigest.getInstance("SHA-1"); |
| 218 | 218 | ||
| 219 | md.update(doc); | 219 | md.update(doc); |
| 220 | 220 | ||
| 221 | return md.digest(); | 221 | return md.digest(); |
| 222 | } | 222 | } |
| 223 | 223 | ||
| 224 | + /** | ||
| 225 | + * <p> | ||
| 226 | + * <b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a> | ||
| 227 | + * </p> | ||
| 228 | + * | ||
| 229 | + * <p> | ||
| 230 | + * <b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a> | ||
| 231 | + * </p> | ||
| 232 | + * | ||
| 233 | + * Método responsável por por gerar o hash do documento | ||
| 234 | + * | ||
| 235 | + * @author rogerio.costa | ||
| 236 | + * | ||
| 237 | + * @param doc | ||
| 238 | + * @return | ||
| 239 | + * @throws NoSuchAlgorithmException | ||
| 240 | + */ | ||
| 241 | + public String gerarHash(String doc) throws NoSuchAlgorithmException { | ||
| 242 | + | ||
| 243 | + MessageDigest digest = MessageDigest.getInstance("SHA-1"); | ||
| 244 | + | ||
| 245 | + digest.update(doc.getBytes()); | ||
| 246 | + | ||
| 247 | + return convertByteArrayToHexString(digest.digest()); | ||
| 248 | + } | ||
| 249 | + | ||
| 250 | + /** | ||
| 251 | + * <p> | ||
| 252 | + * <b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a> | ||
| 253 | + * </p> | ||
| 254 | + * | ||
| 255 | + * <p> | ||
| 256 | + * <b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a> | ||
| 257 | + * </p> | ||
| 258 | + * | ||
| 259 | + * Método responsável por converter byte para String | ||
| 260 | + * | ||
| 261 | + * @author rogerio.costa | ||
| 262 | + * | ||
| 263 | + * @param arrayBytes | ||
| 264 | + * | ||
| 265 | + * @return String | ||
| 266 | + */ | ||
| 267 | + private static String convertByteArrayToHexString(byte[] arrayBytes) { | ||
| 268 | + | ||
| 269 | + StringBuffer stringBuffer = new StringBuffer(); | ||
| 270 | + for (int i = 0; i < arrayBytes.length; i++) { | ||
| 271 | + stringBuffer.append(Integer.toString(( arrayBytes[i] & 0xff ) + 0x100, 16).substring(1)); | ||
| 272 | + } | ||
| 273 | + return stringBuffer.toString(); | ||
| 274 | + } | ||
| 275 | + | ||
| 224 | } | 276 | } |
cit-ecm-api/src/main/java/br/com/centralit/api/service/impl/TarjaAssinaturaServiceImpl.java
| @@ -19,6 +19,7 @@ import br.com.centralit.api.model.Assinatura; | @@ -19,6 +19,7 @@ import br.com.centralit.api.model.Assinatura; | ||
| 19 | import br.com.centralit.api.model.ConteudoTarja; | 19 | import br.com.centralit.api.model.ConteudoTarja; |
| 20 | import br.com.centralit.api.model.TarjaAssinatura; | 20 | import br.com.centralit.api.model.TarjaAssinatura; |
| 21 | import br.com.centralit.api.service.AnexoImagemService; | 21 | import br.com.centralit.api.service.AnexoImagemService; |
| 22 | +import br.com.centralit.api.service.AssinaturaUtilService; | ||
| 22 | import br.com.centralit.api.service.DominioService; | 23 | import br.com.centralit.api.service.DominioService; |
| 23 | import br.com.centralit.api.service.OrganizacaoService; | 24 | import br.com.centralit.api.service.OrganizacaoService; |
| 24 | import br.com.centralit.api.service.TarjaAssinaturaService; | 25 | import br.com.centralit.api.service.TarjaAssinaturaService; |
| @@ -65,6 +66,10 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatu | @@ -65,6 +66,10 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatu | ||
| 65 | 66 | ||
| 66 | private TarjaAssinaturaDao tarjaAssinaturaDao; | 67 | private TarjaAssinaturaDao tarjaAssinaturaDao; |
| 67 | 68 | ||
| 69 | + /** Atributo assinaturaUtilService. */ | ||
| 70 | + @Autowired | ||
| 71 | + private AssinaturaUtilService assinaturaUtilService; | ||
| 72 | + | ||
| 68 | @Autowired | 73 | @Autowired |
| 69 | private DominioService dominioService; | 74 | private DominioService dominioService; |
| 70 | 75 | ||
| @@ -162,23 +167,21 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatu | @@ -162,23 +167,21 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatu | ||
| 162 | */ | 167 | */ |
| 163 | private String getConteudoTarja(Assinatura assinatura, String conteudoAssinatura, TarjaAssinatura tarjaAssinatura) { | 168 | private String getConteudoTarja(Assinatura assinatura, String conteudoAssinatura, TarjaAssinatura tarjaAssinatura) { |
| 164 | 169 | ||
| 165 | - conteudoAssinatura = conteudoAssinatura.replaceAll(TarjaAssinatura.NOME_ASSINANTE, assinatura.getPessoa().getNome()) | ||
| 166 | - .replaceAll(TarjaAssinatura.FUNCAO_ASSINANTE, assinatura.getFuncao().getNome()) | ||
| 167 | - .replaceAll(TarjaAssinatura.DATA_ASSINATURA, UtilDate.getDataSemHorasString(Calendar.getInstance().getTime())) | ||
| 168 | - .replaceAll(TarjaAssinatura.HORA_ASSINATURA, UtilDate.getHoraAtualHHMMSS()) | ||
| 169 | - .replaceAll(TarjaAssinatura.LOGO, getStringBase64(tarjaAssinatura)); | 170 | + conteudoAssinatura = conteudoAssinatura.replaceAll(TarjaAssinatura.NOME_ASSINANTE, assinatura.getPessoa().getNome()).replaceAll(TarjaAssinatura.FUNCAO_ASSINANTE, assinatura.getFuncao().getNome()).replaceAll(TarjaAssinatura.DATA_ASSINATURA, UtilDate.getDataSemHorasString(Calendar.getInstance().getTime())).replaceAll(TarjaAssinatura.HORA_ASSINATURA, UtilDate.getHoraAtualHHMMSS()).replaceAll(TarjaAssinatura.LOGO, getStringBase64(tarjaAssinatura)); |
| 170 | return conteudoAssinatura; | 171 | return conteudoAssinatura; |
| 171 | } | 172 | } |
| 172 | - | 173 | + |
| 173 | /** | 174 | /** |
| 174 | * Método responsável por obter string em formato Base64 para apresentação no html | 175 | * Método responsável por obter string em formato Base64 para apresentação no html |
| 176 | + * | ||
| 175 | * @author rogerio.cassimiro | 177 | * @author rogerio.cassimiro |
| 176 | * @param assinatura | 178 | * @param assinatura |
| 177 | * @return {@link String} | 179 | * @return {@link String} |
| 178 | */ | 180 | */ |
| 179 | private String getStringBase64(TarjaAssinatura tarjaAssinatura) { | 181 | private String getStringBase64(TarjaAssinatura tarjaAssinatura) { |
| 182 | + | ||
| 180 | StringBuilder imgBase64 = new StringBuilder(""); | 183 | StringBuilder imgBase64 = new StringBuilder(""); |
| 181 | - if(tarjaAssinatura.getConteudo().contains("@logo@") && UtilObjeto.isReferencia(tarjaAssinatura.getAnexoImagem()) && UtilObjeto.isReferencia(tarjaAssinatura.getAnexoImagem().getAnexo())){ | 184 | + if (tarjaAssinatura.getConteudo().contains("@logo@") && UtilObjeto.isReferencia(tarjaAssinatura.getAnexoImagem()) && UtilObjeto.isReferencia(tarjaAssinatura.getAnexoImagem().getAnexo())) { |
| 182 | imgBase64.append("<img src='data:image/png;base64, "); | 185 | imgBase64.append("<img src='data:image/png;base64, "); |
| 183 | imgBase64.append(UtilBase64.byteToBase64(tarjaAssinatura.getAnexoImagem().getAnexo())); | 186 | imgBase64.append(UtilBase64.byteToBase64(tarjaAssinatura.getAnexoImagem().getAnexo())); |
| 184 | imgBase64.append("' height='60' width='60' />"); | 187 | imgBase64.append("' height='60' width='60' />"); |
| @@ -193,11 +196,11 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatu | @@ -193,11 +196,11 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatu | ||
| 193 | * @param assinatura | 196 | * @param assinatura |
| 194 | * @param tarjaAssinatura | 197 | * @param tarjaAssinatura |
| 195 | * @param conteudoAssinatura | 198 | * @param conteudoAssinatura |
| 196 | - * @throws DocumentException | ||
| 197 | - * @throws IOException | 199 | + * @throws DocumentException |
| 200 | + * @throws IOException | ||
| 198 | */ | 201 | */ |
| 199 | private void gerarAssinaturaDocAnexo(Assinatura assinatura, AnexoImagem anexoImagem, String conteudoAssinatura) { | 202 | private void gerarAssinaturaDocAnexo(Assinatura assinatura, AnexoImagem anexoImagem, String conteudoAssinatura) { |
| 200 | - | 203 | + |
| 201 | assinatura.getConteudoTarja().setConteudoCriptografado(this.encrypted(conteudoAssinatura)); | 204 | assinatura.getConteudoTarja().setConteudoCriptografado(this.encrypted(conteudoAssinatura)); |
| 202 | assinatura.getConteudoTarja().setAnexoImagem(anexoImagem); | 205 | assinatura.getConteudoTarja().setAnexoImagem(anexoImagem); |
| 203 | } | 206 | } |
| @@ -213,7 +216,7 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatu | @@ -213,7 +216,7 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatu | ||
| 213 | private void gerarAssinaturaDocOnline(Assinatura assinatura, AnexoImagem anexoImagem, String conteudoAssinatura) { | 216 | private void gerarAssinaturaDocOnline(Assinatura assinatura, AnexoImagem anexoImagem, String conteudoAssinatura) { |
| 214 | 217 | ||
| 215 | StringBuilder conteudoOriginalDocOnLine = new StringBuilder(); | 218 | StringBuilder conteudoOriginalDocOnLine = new StringBuilder(); |
| 216 | - | 219 | + |
| 217 | if (UtilObjeto.isReferencia(assinatura.getDocumentoGed().getConteudoTarja())) { | 220 | if (UtilObjeto.isReferencia(assinatura.getDocumentoGed().getConteudoTarja())) { |
| 218 | conteudoOriginalDocOnLine.append(decrypted(assinatura.getDocumentoGed().getConteudoTarja().getConteudoCriptografado())); | 221 | conteudoOriginalDocOnLine.append(decrypted(assinatura.getDocumentoGed().getConteudoTarja().getConteudoCriptografado())); |
| 219 | } else { | 222 | } else { |
| @@ -221,9 +224,19 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatu | @@ -221,9 +224,19 @@ public class TarjaAssinaturaServiceImpl extends GenericServiceImpl<TarjaAssinatu | ||
| 221 | conteudoOriginalDocOnLine.append(decrypted(assinatura.getDocumentoGed().getConteudoCriptografado())); | 224 | conteudoOriginalDocOnLine.append(decrypted(assinatura.getDocumentoGed().getConteudoCriptografado())); |
| 222 | } | 225 | } |
| 223 | conteudoOriginalDocOnLine.append("<br />").append(conteudoAssinatura); | 226 | conteudoOriginalDocOnLine.append("<br />").append(conteudoAssinatura); |
| 224 | - assinatura.getDocumentoGed().getConteudoTarja().setConteudoCriptografado(this.encrypted(conteudoOriginalDocOnLine.toString())); | 227 | + try { |
| 228 | + // Assinar documento | ||
| 229 | + assinatura.getDocumentoGed().setConteudoAssinado(this.assinaturaUtilService.geraAssinatura(conteudoOriginalDocOnLine.toString().getBytes())); | ||
| 230 | + | ||
| 231 | + conteudoOriginalDocOnLine.append("<br />").append(this.assinaturaUtilService.gerarHash(conteudoOriginalDocOnLine.toString())); | ||
| 232 | + | ||
| 233 | + assinatura.getDocumentoGed().getConteudoTarja().setConteudoCriptografado(this.encrypted(conteudoOriginalDocOnLine.toString())); | ||
| 234 | + | ||
| 235 | + } catch (Exception e) { | ||
| 236 | + e.printStackTrace(); | ||
| 237 | + } | ||
| 225 | } | 238 | } |
| 226 | - | 239 | + |
| 227 | /** | 240 | /** |
| 228 | * Método responsável por criptografar o texto através da chave | 241 | * Método responsável por criptografar o texto através da chave |
| 229 | * | 242 | * |