Browse Source

Pull request #443: 无JIRA任务 final到feature

Merge in CORE/base-third from ~ZHOUPING/base-third:feature/10.0 to feature/10.0

* commit 'c26da295490f5de3121dfed5064055011119ad83': (24 commits)
  REPORT-31938 改进
  REPORT-31938 html解析支持rgba
  REPORT-29654 jgit 打包的时候少了 resources
  REPORT-31421 间距设置导致切割后的HTML 含有line-height属性
  111
  DEC-13199 websocket序列化时区设置
  REPORT-31053 PDF导出,<br>标签丢失
  REPORT-30379 test补充注释
  REPORT-30379 在third中加一个 third(不在打包范围内,需要自己添加junit依赖才能跑)
  REPORT-30379 bouncycastle存在安全问题,fine-itext、fine-itext-old 适配高版本
  REPORT-29182 & REPORT-29600 weblogic部署导出excel报错
  KERNEL-3881  状态服务器+集群锁相关代码解耦,脱离依赖redis
  KERNEL-3881 状态服务器+集群锁相关代码解耦,脱离依赖redis
  REPORT-27284 <table>标签导出pdf,含加粗字体时,边框颜色异常
  REPORT-29490 安全漏洞by zack
  REPORT-29784 third删减引起定时调度失败
  REPORT-27284 table解析导出PDF后 单元格背景、边框与预览不一致
  DEC-12783 【迭代】迁移db2数据库后,多语言插件添加key失败
  REPORT-29126 导出pdf,字体加粗效果没有了(漏提)
  REPORT-29126 导出pdf,字体加粗效果没有了(漏提)
  ...
research/11.0
zhouping 5 years ago
parent
commit
c1a6c6b76e
  1. 3
      fine-commons-codec/src/main/java/org/apache/commons/codec/digest/DigestUtils.java
  2. 2
      fine-deprecated-utils/src/main/java/edu/emory/mathcs/backport/java/util/Arrays.java
  3. 15
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/cfg/annotations/SimpleValueBinder.java
  4. 2
      fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/html/Markup.java
  5. 48
      fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/html/Utils/BackgroundUtil.java
  6. 364
      fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/html/WebColors.java
  7. 368
      fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/OcspClientBouncyCastle.java
  8. 8
      fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/PdfGraphics2D.java
  9. 268
      fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/PdfPKCS7.java
  10. 45
      fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/PdfPublicKeySecurityHandler.java
  11. 40
      fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/PdfReader.java
  12. 460
      fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/TSAClientBouncyCastle.java
  13. 12
      fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/crypto/AESCipher.java
  14. 74
      fine-itext-old/test/com/fr/third/com/lowagie/text/pdf/PdfEncryptDecryptTest.java
  15. 2
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/html/Markup.java
  16. 57
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/html/WebColors.java
  17. 3
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/html/simpleparser/FactoryProperties.java
  18. 33
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/html/simpleparser/IncCell.java
  19. 21
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/html/simpleparser/IncTable.java
  20. 370
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/OcspClientBouncyCastle.java
  21. 2
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/PdfLine.java
  22. 266
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/PdfPKCS7.java
  23. 6
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/PdfPTable.java
  24. 45
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/PdfPublicKeySecurityHandler.java
  25. 40
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/PdfReader.java
  26. 460
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/TSAClientBouncyCastle.java
  27. 15
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/TableProperties.java
  28. 12
      fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/crypto/AESCipher.java
  29. 1989
      fine-jedis/src/main/java/com/fr/third/redis/clients/jedis/JedisCluster.java
  30. 187
      fine-jedis/src/main/java/com/fr/third/redis/clients/jedis/JedisPubSub.java
  31. 3
      fine-poi/src/main/java/com/fr/third/v2/org/apache/poi/util/TempFile.java
  32. 4
      fine-socketio/src/main/java/com/fr/third/socketio/protocol/JacksonJsonSupport.java
  33. 6
      fine-third-default/fine-sjsxp/src/main/java/com/fr/third/javax/xml/stream/XMLEntityManager.java

3
fine-commons-codec/src/main/java/org/apache/commons/codec/digest/DigestUtils.java

@ -9,4 +9,7 @@ public class DigestUtils {
public static String sha1Hex(String data) {
return com.fr.third.org.apache.commons.codec.digest.DigestUtils.sha1Hex(data);
}
public static String md5Hex(String data) {
return com.fr.third.org.apache.commons.codec.digest.DigestUtils.md5Hex(data);
}
}

2
fine-deprecated-utils/src/main/java/edu/emory/mathcs/backport/java/util/Arrays.java

@ -795,4 +795,4 @@ public class Arrays {
buf.append(']');
seen.remove(seen.size() - 1);
}
}
}

15
fine-hibernate/src/main/java/com/fr/third/org/hibernate/cfg/annotations/SimpleValueBinder.java

@ -54,6 +54,7 @@ import com.fr.third.org.hibernate.type.PrimitiveCharacterArrayNClobType;
import com.fr.third.org.hibernate.type.SerializableToBlobType;
import com.fr.third.org.hibernate.type.StandardBasicTypes;
import com.fr.third.org.hibernate.type.StringNVarcharType;
import com.fr.third.org.hibernate.type.StringType;
import com.fr.third.org.hibernate.type.WrappedMaterializedBlobType;
import com.fr.third.org.hibernate.usertype.DynamicParameterizedType;
@ -89,6 +90,14 @@ public class SimpleValueBinder {
private AttributeConverterDescriptor attributeConverterDescriptor;
private static String DRIVER_CLASS;
private static final String DB2_PREFIX = "db2";
public static void setDriverClass(String driverClass) {
DRIVER_CLASS = driverClass;
}
public void setReferencedEntityName(String referencedEntityName) {
this.referencedEntityName = referencedEntityName;
}
@ -278,7 +287,7 @@ public class SimpleValueBinder {
else if ( isNationalized ) {
if ( buildingContext.getBuildingOptions().getReflectionManager().equals( returnedClassOrElement, String.class ) ) {
// nvarchar
type = StringNVarcharType.INSTANCE.getName();
type = DRIVER_CLASS != null && DRIVER_CLASS.contains(DB2_PREFIX) ? StringType.INSTANCE.getName() : StringNVarcharType.INSTANCE.getName();
explicitType = type;
}
else if ( buildingContext.getBuildingOptions().getReflectionManager().equals( returnedClassOrElement, Character.class ) ||
@ -454,7 +463,7 @@ public class SimpleValueBinder {
public void fillSimpleValue() {
LOG.debugf( "Starting fillSimpleValue for %s", propertyName );
if ( attributeConverterDescriptor != null ) {
if ( ! BinderHelper.isEmptyAnnotationValue( explicitType ) ) {
throw new AnnotationException(
@ -531,7 +540,7 @@ public class SimpleValueBinder {
if ( timeStampVersionType != null ) {
simpleValue.setTypeName( timeStampVersionType );
}
if ( simpleValue.getTypeName() != null && simpleValue.getTypeName().length() > 0
&& simpleValue.getMetadata().getTypeResolver().basic( simpleValue.getTypeName() ) == null ) {
try {

2
fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/html/Markup.java

@ -422,7 +422,7 @@ public class Markup {
try {
return WebColors.getRGBColor(s);
}
catch(IllegalArgumentException iae) {
catch(Exception iae) {
return null;
}
}

48
fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/html/Utils/BackgroundUtil.java

@ -0,0 +1,48 @@
package com.fr.third.v2.lowagie.text.html.Utils;
import com.fr.third.v2.lowagie.text.html.CSSUtils;
import com.fr.third.v2.lowagie.text.html.simpleparser.ChainedProperties;
import java.util.HashMap;
import java.util.Map;
/**
* @author Hugh.C
* @version 1.0
* Created by Hugh.C on 2020/2/26
*/
public class BackgroundUtil {
public static Map<String, String> parse2RulesMap(ChainedProperties props) {
Map<String, String> backgroundRules = new HashMap<String, String>();
String value = props.getProperty("bgcolor");
if (value != null) {
backgroundRules.put("background-color", value);
}
value = props.getLastChainProperty("background-size");
if (value != null) {
backgroundRules.put("background-size", value);
}
value = props.getLastChainProperty("background");
if (value != null) {
Map<String, String> backgroundStyles = CSSUtils.processBackground(value);
backgroundRules.putAll(backgroundStyles);
}
value = props.getLastChainProperty("background-color");
if (value != null) {
backgroundRules.put("background-color", value);
}
value = props.getLastChainProperty("background-position");
if (value != null) {
backgroundRules.put("background-position", value);
}
value = props.getLastChainProperty("background-repeat");
if (value != null) {
backgroundRules.put("background-repeat", value);
}
value = props.getLastChainProperty("background-image");
if (value != null) {
backgroundRules.put("background-image", value);
}
return backgroundRules;
}
}

364
fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/html/WebColors.java

@ -66,147 +66,170 @@ public class WebColors extends HashMap {
/** HashMap containing all the names and corresponding color values. */
public static final WebColors NAMES = new WebColors();
static {
NAMES.put("aliceblue", new int[] { 0xf0, 0xf8, 0xff, 0x00 });
NAMES.put("antiquewhite", new int[] { 0xfa, 0xeb, 0xd7, 0x00 });
NAMES.put("aqua", new int[] { 0x00, 0xff, 0xff, 0x00 });
NAMES.put("aquamarine", new int[] { 0x7f, 0xff, 0xd4, 0x00 });
NAMES.put("azure", new int[] { 0xf0, 0xff, 0xff, 0x00 });
NAMES.put("beige", new int[] { 0xf5, 0xf5, 0xdc, 0x00 });
NAMES.put("bisque", new int[] { 0xff, 0xe4, 0xc4, 0x00 });
NAMES.put("black", new int[] { 0x00, 0x00, 0x00, 0x00 });
NAMES.put("blanchedalmond", new int[] { 0xff, 0xeb, 0xcd, 0x00 });
NAMES.put("blue", new int[] { 0x00, 0x00, 0xff, 0x00 });
NAMES.put("blueviolet", new int[] { 0x8a, 0x2b, 0xe2, 0x00 });
NAMES.put("brown", new int[] { 0xa5, 0x2a, 0x2a, 0x00 });
NAMES.put("burlywood", new int[] { 0xde, 0xb8, 0x87, 0x00 });
NAMES.put("cadetblue", new int[] { 0x5f, 0x9e, 0xa0, 0x00 });
NAMES.put("chartreuse", new int[] { 0x7f, 0xff, 0x00, 0x00 });
NAMES.put("chocolate", new int[] { 0xd2, 0x69, 0x1e, 0x00 });
NAMES.put("coral", new int[] { 0xff, 0x7f, 0x50, 0x00 });
NAMES.put("cornflowerblue", new int[] { 0x64, 0x95, 0xed, 0x00 });
NAMES.put("cornsilk", new int[] { 0xff, 0xf8, 0xdc, 0x00 });
NAMES.put("crimson", new int[] { 0xdc, 0x14, 0x3c, 0x00 });
NAMES.put("cyan", new int[] { 0x00, 0xff, 0xff, 0x00 });
NAMES.put("darkblue", new int[] { 0x00, 0x00, 0x8b, 0x00 });
NAMES.put("darkcyan", new int[] { 0x00, 0x8b, 0x8b, 0x00 });
NAMES.put("darkgoldenrod", new int[] { 0xb8, 0x86, 0x0b, 0x00 });
NAMES.put("darkgray", new int[] { 0xa9, 0xa9, 0xa9, 0x00 });
NAMES.put("darkgreen", new int[] { 0x00, 0x64, 0x00, 0x00 });
NAMES.put("darkkhaki", new int[] { 0xbd, 0xb7, 0x6b, 0x00 });
NAMES.put("darkmagenta", new int[] { 0x8b, 0x00, 0x8b, 0x00 });
NAMES.put("darkolivegreen", new int[] { 0x55, 0x6b, 0x2f, 0x00 });
NAMES.put("darkorange", new int[] { 0xff, 0x8c, 0x00, 0x00 });
NAMES.put("darkorchid", new int[] { 0x99, 0x32, 0xcc, 0x00 });
NAMES.put("darkred", new int[] { 0x8b, 0x00, 0x00, 0x00 });
NAMES.put("darksalmon", new int[] { 0xe9, 0x96, 0x7a, 0x00 });
NAMES.put("darkseagreen", new int[] { 0x8f, 0xbc, 0x8f, 0x00 });
NAMES.put("darkslateblue", new int[] { 0x48, 0x3d, 0x8b, 0x00 });
NAMES.put("darkslategray", new int[] { 0x2f, 0x4f, 0x4f, 0x00 });
NAMES.put("darkturquoise", new int[] { 0x00, 0xce, 0xd1, 0x00 });
NAMES.put("darkviolet", new int[] { 0x94, 0x00, 0xd3, 0x00 });
NAMES.put("deeppink", new int[] { 0xff, 0x14, 0x93, 0x00 });
NAMES.put("deepskyblue", new int[] { 0x00, 0xbf, 0xff, 0x00 });
NAMES.put("dimgray", new int[] { 0x69, 0x69, 0x69, 0x00 });
NAMES.put("dodgerblue", new int[] { 0x1e, 0x90, 0xff, 0x00 });
NAMES.put("firebrick", new int[] { 0xb2, 0x22, 0x22, 0x00 });
NAMES.put("floralwhite", new int[] { 0xff, 0xfa, 0xf0, 0x00 });
NAMES.put("forestgreen", new int[] { 0x22, 0x8b, 0x22, 0x00 });
NAMES.put("fuchsia", new int[] { 0xff, 0x00, 0xff, 0x00 });
NAMES.put("gainsboro", new int[] { 0xdc, 0xdc, 0xdc, 0x00 });
NAMES.put("ghostwhite", new int[] { 0xf8, 0xf8, 0xff, 0x00 });
NAMES.put("gold", new int[] { 0xff, 0xd7, 0x00, 0x00 });
NAMES.put("goldenrod", new int[] { 0xda, 0xa5, 0x20, 0x00 });
NAMES.put("gray", new int[] { 0x80, 0x80, 0x80, 0x00 });
NAMES.put("green", new int[] { 0x00, 0x80, 0x00, 0x00 });
NAMES.put("greenyellow", new int[] { 0xad, 0xff, 0x2f, 0x00 });
NAMES.put("honeydew", new int[] { 0xf0, 0xff, 0xf0, 0x00 });
NAMES.put("hotpink", new int[] { 0xff, 0x69, 0xb4, 0x00 });
NAMES.put("indianred", new int[] { 0xcd, 0x5c, 0x5c, 0x00 });
NAMES.put("indigo", new int[] { 0x4b, 0x00, 0x82, 0x00 });
NAMES.put("ivory", new int[] { 0xff, 0xff, 0xf0, 0x00 });
NAMES.put("khaki", new int[] { 0xf0, 0xe6, 0x8c, 0x00 });
NAMES.put("lavender", new int[] { 0xe6, 0xe6, 0xfa, 0x00 });
NAMES.put("lavenderblush", new int[] { 0xff, 0xf0, 0xf5, 0x00 });
NAMES.put("lawngreen", new int[] { 0x7c, 0xfc, 0x00, 0x00 });
NAMES.put("lemonchiffon", new int[] { 0xff, 0xfa, 0xcd, 0x00 });
NAMES.put("lightblue", new int[] { 0xad, 0xd8, 0xe6, 0x00 });
NAMES.put("lightcoral", new int[] { 0xf0, 0x80, 0x80, 0x00 });
NAMES.put("lightcyan", new int[] { 0xe0, 0xff, 0xff, 0x00 });
NAMES.put("lightgoldenrodyellow", new int[] { 0xfa, 0xfa, 0xd2, 0x00 });
NAMES.put("lightgreen", new int[] { 0x90, 0xee, 0x90, 0x00 });
NAMES.put("lightgrey", new int[] { 0xd3, 0xd3, 0xd3, 0x00 });
NAMES.put("lightpink", new int[] { 0xff, 0xb6, 0xc1, 0x00 });
NAMES.put("lightsalmon", new int[] { 0xff, 0xa0, 0x7a, 0x00 });
NAMES.put("lightseagreen", new int[] { 0x20, 0xb2, 0xaa, 0x00 });
NAMES.put("lightskyblue", new int[] { 0x87, 0xce, 0xfa, 0x00 });
NAMES.put("lightslategray", new int[] { 0x77, 0x88, 0x99, 0x00 });
NAMES.put("lightsteelblue", new int[] { 0xb0, 0xc4, 0xde, 0x00 });
NAMES.put("lightyellow", new int[] { 0xff, 0xff, 0xe0, 0x00 });
NAMES.put("lime", new int[] { 0x00, 0xff, 0x00, 0x00 });
NAMES.put("limegreen", new int[] { 0x32, 0xcd, 0x32, 0x00 });
NAMES.put("linen", new int[] { 0xfa, 0xf0, 0xe6, 0x00 });
NAMES.put("magenta", new int[] { 0xff, 0x00, 0xff, 0x00 });
NAMES.put("maroon", new int[] { 0x80, 0x00, 0x00, 0x00 });
NAMES.put("mediumaquamarine", new int[] { 0x66, 0xcd, 0xaa, 0x00 });
NAMES.put("mediumblue", new int[] { 0x00, 0x00, 0xcd, 0x00 });
NAMES.put("mediumorchid", new int[] { 0xba, 0x55, 0xd3, 0x00 });
NAMES.put("mediumpurple", new int[] { 0x93, 0x70, 0xdb, 0x00 });
NAMES.put("mediumseagreen", new int[] { 0x3c, 0xb3, 0x71, 0x00 });
NAMES.put("mediumslateblue", new int[] { 0x7b, 0x68, 0xee, 0x00 });
NAMES.put("mediumspringgreen", new int[] { 0x00, 0xfa, 0x9a, 0x00 });
NAMES.put("mediumturquoise", new int[] { 0x48, 0xd1, 0xcc, 0x00 });
NAMES.put("mediumvioletred", new int[] { 0xc7, 0x15, 0x85, 0x00 });
NAMES.put("midnightblue", new int[] { 0x19, 0x19, 0x70, 0x00 });
NAMES.put("mintcream", new int[] { 0xf5, 0xff, 0xfa, 0x00 });
NAMES.put("mistyrose", new int[] { 0xff, 0xe4, 0xe1, 0x00 });
NAMES.put("moccasin", new int[] { 0xff, 0xe4, 0xb5, 0x00 });
NAMES.put("navajowhite", new int[] { 0xff, 0xde, 0xad, 0x00 });
NAMES.put("navy", new int[] { 0x00, 0x00, 0x80, 0x00 });
NAMES.put("oldlace", new int[] { 0xfd, 0xf5, 0xe6, 0x00 });
NAMES.put("olive", new int[] { 0x80, 0x80, 0x00, 0x00 });
NAMES.put("olivedrab", new int[] { 0x6b, 0x8e, 0x23, 0x00 });
NAMES.put("orange", new int[] { 0xff, 0xa5, 0x00, 0x00 });
NAMES.put("orangered", new int[] { 0xff, 0x45, 0x00, 0x00 });
NAMES.put("orchid", new int[] { 0xda, 0x70, 0xd6, 0x00 });
NAMES.put("palegoldenrod", new int[] { 0xee, 0xe8, 0xaa, 0x00 });
NAMES.put("palegreen", new int[] { 0x98, 0xfb, 0x98, 0x00 });
NAMES.put("paleturquoise", new int[] { 0xaf, 0xee, 0xee, 0x00 });
NAMES.put("palevioletred", new int[] { 0xdb, 0x70, 0x93, 0x00 });
NAMES.put("papayawhip", new int[] { 0xff, 0xef, 0xd5, 0x00 });
NAMES.put("peachpuff", new int[] { 0xff, 0xda, 0xb9, 0x00 });
NAMES.put("peru", new int[] { 0xcd, 0x85, 0x3f, 0x00 });
NAMES.put("pink", new int[] { 0xff, 0xc0, 0xcb, 0x00 });
NAMES.put("plum", new int[] { 0xdd, 0xa0, 0xdd, 0x00 });
NAMES.put("powderblue", new int[] { 0xb0, 0xe0, 0xe6, 0x00 });
NAMES.put("purple", new int[] { 0x80, 0x00, 0x80, 0x00 });
NAMES.put("red", new int[] { 0xff, 0x00, 0x00, 0x00 });
NAMES.put("rosybrown", new int[] { 0xbc, 0x8f, 0x8f, 0x00 });
NAMES.put("royalblue", new int[] { 0x41, 0x69, 0xe1, 0x00 });
NAMES.put("saddlebrown", new int[] { 0x8b, 0x45, 0x13, 0x00 });
NAMES.put("salmon", new int[] { 0xfa, 0x80, 0x72, 0x00 });
NAMES.put("sandybrown", new int[] { 0xf4, 0xa4, 0x60, 0x00 });
NAMES.put("seagreen", new int[] { 0x2e, 0x8b, 0x57, 0x00 });
NAMES.put("seashell", new int[] { 0xff, 0xf5, 0xee, 0x00 });
NAMES.put("sienna", new int[] { 0xa0, 0x52, 0x2d, 0x00 });
NAMES.put("silver", new int[] { 0xc0, 0xc0, 0xc0, 0x00 });
NAMES.put("skyblue", new int[] { 0x87, 0xce, 0xeb, 0x00 });
NAMES.put("slateblue", new int[] { 0x6a, 0x5a, 0xcd, 0x00 });
NAMES.put("slategray", new int[] { 0x70, 0x80, 0x90, 0x00 });
NAMES.put("snow", new int[] { 0xff, 0xfa, 0xfa, 0x00 });
NAMES.put("springgreen", new int[] { 0x00, 0xff, 0x7f, 0x00 });
NAMES.put("steelblue", new int[] { 0x46, 0x82, 0xb4, 0x00 });
NAMES.put("tan", new int[] { 0xd2, 0xb4, 0x8c, 0x00 });
NAMES.put("transparent", new int[] { 0x00, 0x00, 0x00, 0xff });
NAMES.put("teal", new int[] { 0x00, 0x80, 0x80, 0x00 });
NAMES.put("thistle", new int[] { 0xd8, 0xbf, 0xd8, 0x00 });
NAMES.put("tomato", new int[] { 0xff, 0x63, 0x47, 0x00 });
NAMES.put("turquoise", new int[] { 0x40, 0xe0, 0xd0, 0x00 });
NAMES.put("violet", new int[] { 0xee, 0x82, 0xee, 0x00 });
NAMES.put("wheat", new int[] { 0xf5, 0xde, 0xb3, 0x00 });
NAMES.put("white", new int[] { 0xff, 0xff, 0xff, 0x00 });
NAMES.put("whitesmoke", new int[] { 0xf5, 0xf5, 0xf5, 0x00 });
NAMES.put("yellow", new int[] { 0xff, 0xff, 0x00, 0x00 });
NAMES.put("yellowgreen", new int[] { 0x9, 0xacd, 0x32, 0x00 });
//比对 https://html-color-codes.info/color-names/
//Red color names
NAMES.put("indianred", new int[]{0xcd, 0x5c, 0x5c, 0xff});
NAMES.put("lightcoral", new int[]{0xf0, 0x80, 0x80, 0xff});
NAMES.put("salmon", new int[]{0xfa, 0x80, 0x72, 0xff});
NAMES.put("darksalmon", new int[]{0xe9, 0x96, 0x7a, 0xff});
NAMES.put("lightsalmon", new int[]{0xff, 0xa0, 0x7a, 0xff});
NAMES.put("crimson", new int[]{0xdc, 0x14, 0x3c, 0xff});
NAMES.put("firebrick", new int[]{0xb2, 0x22, 0x22, 0xff});
NAMES.put("darkred", new int[]{0x8b, 0x00, 0x00, 0xff});
NAMES.put("red", new int[]{0xff, 0x00, 0x00, 0xff});
//Pink color names
NAMES.put("pink", new int[]{0xff, 0xc0, 0xcb, 0xff});
NAMES.put("lightpink", new int[]{0xff, 0xb6, 0xc1, 0xff});
NAMES.put("hotpink", new int[]{0xff, 0x69, 0xb4, 0xff});
NAMES.put("deeppink", new int[]{0xff, 0x14, 0x93, 0xff});
NAMES.put("mediumvioletred", new int[]{0xc7, 0x15, 0x85, 0xff});
NAMES.put("palevioletred", new int[]{0xdb, 0x70, 0x93, 0xff});
//Orange color names
NAMES.put("coral", new int[]{0xff, 0x7f, 0x50, 0xff});
NAMES.put("tomato", new int[]{0xff, 0x63, 0x47, 0xff});
NAMES.put("orangered", new int[]{0xff, 0x45, 0x00, 0xff});
NAMES.put("darkorange", new int[]{0xff, 0x8c, 0x00, 0xff});
NAMES.put("orange", new int[]{0xff, 0xa5, 0x00, 0xff});
//Orange color names
NAMES.put("gold", new int[]{0xff, 0xd7, 0x00, 0xff});
NAMES.put("yellow", new int[]{0xff, 0xff, 0x00, 0xff});
NAMES.put("lightyellow", new int[]{0xff, 0xff, 0xefe, 0xff});
NAMES.put("lemonchiffon", new int[]{0xff, 0xfa, 0xcd, 0xff});
NAMES.put("lightgoldenrodyellow", new int[]{0xfa, 0xfa, 0xd2, 0xff});
NAMES.put("papayawhip", new int[]{0xff, 0xef, 0xd5, 0xff});
NAMES.put("moccasin", new int[]{0xff, 0xe4, 0xb5, 0xff});
NAMES.put("peachpuff", new int[]{0xff, 0xda, 0xb9, 0xff});
NAMES.put("palegoldenrod", new int[]{0xee, 0xe8, 0xaa, 0xff});
NAMES.put("khaki", new int[]{0xf0, 0xe6, 0x8c, 0xff});
NAMES.put("darkkhaki", new int[]{0xbd, 0xb7, 0x6b, 0xff});
//Purple color names
NAMES.put("lavender", new int[]{0xe6, 0xe6, 0xfa, 0xff});
NAMES.put("thistle", new int[]{0xd8, 0xbf, 0xd8, 0xff});
NAMES.put("plum", new int[]{0xdd, 0xa0, 0xdd, 0xff});
NAMES.put("violet", new int[]{0xee, 0x82, 0xee, 0xff});
NAMES.put("orchid", new int[]{0xda, 0x70, 0xd6, 0xff});
NAMES.put("fuchsia", new int[]{0xff, 0x00, 0xff, 0xff});
NAMES.put("magenta", new int[]{0xff, 0x00, 0xff, 0xff});
NAMES.put("mediumorchid", new int[]{0xba, 0x55, 0xd3, 0xff});
NAMES.put("mediumpurple", new int[]{0x93, 0x70, 0xdb, 0xff});
NAMES.put("amethyst", new int[]{0x99, 0x66, 0xcc, 0xff});
NAMES.put("blueviolet", new int[]{0x8a, 0x2b, 0xe2, 0xff});
NAMES.put("darkviolet", new int[]{0x94, 0x00, 0xd3, 0xff});
NAMES.put("darkorchid", new int[]{0x99, 0x32, 0xcc, 0xff});
NAMES.put("darkmagenta", new int[]{0x8b, 0x00, 0x8b, 0xff});
NAMES.put("purple", new int[]{0x80, 0x00, 0x80, 0xff});
NAMES.put("indigo", new int[]{0x4b, 0x00, 0x82, 0xff});
NAMES.put("slateblue", new int[]{0x6a, 0x5a, 0xcd, 0xff});
NAMES.put("darkslateblue", new int[]{0x48, 0x3d, 0x8b, 0xff});
NAMES.put("mediumslateblue", new int[]{0x7b, 0x68, 0xee, 0xff});
//Green color names
NAMES.put("greenyellow", new int[]{0xad, 0xff, 0x2f, 0xff});
NAMES.put("chartreuse", new int[]{0x7f, 0xff, 0x00, 0xff});
NAMES.put("lawngreen", new int[]{0x7c, 0xfc, 0x00, 0xff});
NAMES.put("lime", new int[]{0x00, 0xff, 0x00, 0xff});
NAMES.put("limegreen", new int[]{0x32, 0xcd, 0x32, 0xff});
NAMES.put("palegreen", new int[]{0x98, 0xfb, 0x98, 0xff});
NAMES.put("lightgreen", new int[]{0x90, 0xee, 0x90, 0xff});
NAMES.put("mediumspringgreen", new int[]{0x00, 0xfa, 0x9a, 0xff});
NAMES.put("springgreen", new int[]{0x00, 0xff, 0x7f, 0xff});
NAMES.put("mediumseagreen", new int[]{0x3c, 0xb3, 0x71, 0xff});
NAMES.put("seagreen", new int[]{0x2e, 0x8b, 0x57, 0xff});
NAMES.put("forestgreen", new int[]{0x22, 0x8b, 0x22, 0xff});
NAMES.put("green", new int[]{0x00, 0x80, 0x00, 0xff});
NAMES.put("darkgreen", new int[]{0x00, 0x64, 0x00, 0xff});
NAMES.put("yellowgreen", new int[]{0x9a, 0xcd, 0x32, 0xff});
NAMES.put("olivedrab", new int[]{0x6b, 0x8e, 0x23, 0xff});
NAMES.put("olive", new int[]{0x80, 0x80, 0x00, 0xff});
NAMES.put("darkolivegreen", new int[]{0x55, 0x6b, 0x2f, 0xff});
NAMES.put("mediumaquamarine", new int[]{0x66, 0xcd, 0xaa, 0xff});
NAMES.put("darkseagreen", new int[]{0x8f, 0xbc, 0x8f, 0xff});
NAMES.put("lightseagreen", new int[]{0x20, 0xb2, 0xaa, 0xff});
NAMES.put("darkcyan", new int[]{0x00, 0x8b, 0x8b, 0xff});
NAMES.put("teal", new int[]{0x00, 0x80, 0x80, 0xff});
//Blue color names
NAMES.put("aqua", new int[]{0x00, 0xff, 0xff, 0xff});
NAMES.put("cyan", new int[]{0x00, 0xff, 0xff, 0xff});
NAMES.put("lightcyan", new int[]{0xe0, 0xff, 0xff, 0xff});
NAMES.put("paleturquoise", new int[]{0xaf, 0xee, 0xee, 0xff});
NAMES.put("aquamarine", new int[]{0x7f, 0xff, 0xd4, 0xff});
NAMES.put("turquoise", new int[]{0x40, 0xe0, 0xd0, 0xff});
NAMES.put("mediumturquoise", new int[]{0x48, 0xd1, 0xcc, 0xff});
NAMES.put("darkturquoise", new int[]{0x00, 0xce, 0xd1, 0xff});
NAMES.put("cadetblue", new int[]{0x5f, 0x9e, 0xa0, 0xff});
NAMES.put("steelblue", new int[]{0x46, 0x82, 0xb4, 0xff});
NAMES.put("lightsteelblue", new int[]{0xb0, 0xc4, 0xde, 0xff});
NAMES.put("powderblue", new int[]{0xb0, 0xe0, 0xe6, 0xff});
NAMES.put("lightblue", new int[]{0xad, 0xd8, 0xe6, 0xff});
NAMES.put("skyblue", new int[]{0x87, 0xce, 0xeb, 0xff});
NAMES.put("lightskyblue", new int[]{0x87, 0xce, 0xfa, 0xff});
NAMES.put("deepskyblue", new int[]{0x00, 0xbf, 0xff, 0xff});
NAMES.put("dodgerblue", new int[]{0x1e, 0x90, 0xff, 0xff});
NAMES.put("cornflowerblue", new int[]{0x64, 0x95, 0xed, 0xff});
NAMES.put("royalblue", new int[]{0x41, 0x69, 0xe1, 0xff});
NAMES.put("blue", new int[]{0x00, 0x00, 0xff, 0xff});
NAMES.put("mediumblue", new int[]{0x00, 0x00, 0xcd, 0xff});
NAMES.put("darkblue", new int[]{0x00, 0x00, 0x8b, 0xff});
NAMES.put("navy", new int[]{0x00, 0x00, 0x80, 0xff});
NAMES.put("midnightblue", new int[]{0x19, 0x19, 0x70, 0xff});
//Brown color names
NAMES.put("cornsilk", new int[]{0xff, 0xf8, 0xdc, 0xff});
NAMES.put("blanchedalmond", new int[]{0xff, 0xeb, 0xcd, 0xff});
NAMES.put("bisque", new int[]{0xff, 0xe4, 0xc4, 0xff});
NAMES.put("navajowhite", new int[]{0xff, 0xde, 0xad, 0xff});
NAMES.put("wheat", new int[]{0xf5, 0xde, 0xb3, 0xff});
NAMES.put("burlywood", new int[]{0xde, 0xb8, 0x87, 0xff});
NAMES.put("tan", new int[]{0xd2, 0xb4, 0x8c, 0xff});
NAMES.put("rosybrown", new int[]{0xbc, 0x8f, 0x8f, 0xff});
NAMES.put("sandybrown", new int[]{0xf4, 0xa4, 0x60, 0xff});
NAMES.put("goldenrod", new int[]{0xda, 0xa5, 0x20, 0xff});
NAMES.put("darkgoldenrod", new int[]{0xb8, 0x86, 0x0b, 0xff});
NAMES.put("peru", new int[]{0xcd, 0x85, 0x3f, 0xff});
NAMES.put("chocolate", new int[]{0xd2, 0x69, 0x1e, 0xff});
NAMES.put("saddlebrown", new int[]{0x8b, 0x45, 0x13, 0xff});
NAMES.put("sienna", new int[]{0xa0, 0x52, 0x2d, 0xff});
NAMES.put("brown", new int[]{0xa5, 0x2a, 0x2a, 0xff});
NAMES.put("maroon", new int[]{0x80, 0x00, 0x00, 0xff});
//White color names
NAMES.put("white", new int[]{0xff, 0xff, 0xff, 0xff});
NAMES.put("snow", new int[]{0xff, 0xfa, 0xfa, 0xff});
NAMES.put("honeydew", new int[]{0xf0, 0xff, 0xf0, 0xff});
NAMES.put("mintcream", new int[]{0xf5, 0xff, 0xfa, 0xff});
NAMES.put("azure", new int[]{0xf0, 0xff, 0xff, 0xff});
NAMES.put("aliceblue", new int[]{0xf0, 0xf8, 0xff, 0xff});
NAMES.put("ghostwhite", new int[]{0xf8, 0xf8, 0xff, 0xff});
NAMES.put("whitesmoke", new int[]{0xf5, 0xf5, 0xf5, 0xff});
NAMES.put("seashell", new int[]{0xff, 0xf5, 0xee, 0xff});
NAMES.put("beige", new int[]{0xf5, 0xf5, 0xdc, 0xff});
NAMES.put("oldlace", new int[]{0xfd, 0xf5, 0xe6, 0xff});
NAMES.put("floralwhite", new int[]{0xff, 0xfa, 0xf0, 0xff});
NAMES.put("ivory", new int[]{0xff, 0xff, 0xf0, 0xff});
NAMES.put("antiquewhite", new int[]{0xfa, 0xeb, 0xd7, 0xff});
NAMES.put("linen", new int[]{0xfa, 0xf0, 0xe6, 0xff});
NAMES.put("lavenderblush", new int[]{0xff, 0xf0, 0xf5, 0xff});
NAMES.put("mistyrose", new int[]{0xff, 0xe4, 0xe1, 0xff});
//Grey color names
NAMES.put("gainsboro", new int[]{0xdc, 0xdc, 0xdc, 0xff});
NAMES.put("lightgrey", new int[]{0xd3, 0xd3, 0xd3, 0xff});
NAMES.put("silver", new int[]{0xc0, 0xc0, 0xc0, 0xff});
NAMES.put("darkgray", new int[]{0xa9, 0xa9, 0xa9, 0xff});
NAMES.put("gray", new int[]{0x80, 0x80, 0x80, 0xff});
NAMES.put("dimgray", new int[]{0x69, 0x69, 0x69, 0xff});
NAMES.put("lightslategray", new int[]{0x77, 0x88, 0x99, 0xff});
NAMES.put("slategray", new int[]{0x70, 0x80, 0x90, 0xff});
NAMES.put("darkslategray", new int[]{0x2f, 0x4f, 0x4f, 0xff});
NAMES.put("black", new int[]{0x00, 0x00, 0x00, 0xff});
//Transparent color names
NAMES.put("transparent", new int[]{0xff, 0xff, 0xff, 0x00});
}
/**
@ -237,27 +260,60 @@ public class WebColors extends HashMap {
}
throw new IllegalArgumentException(
"Unknown color format. Must be #RGB or #RRGGBB");
}
else if (name.startsWith("rgb(")) {
} else if (name.startsWith("rgb(")) {
StringTokenizer tok = new StringTokenizer(name, "rgb(), \t\r\n\f");
for (int k = 0; k < 3; ++k) {
String v = tok.nextToken();
if (v.endsWith("%"))
c[k] = Integer.parseInt(v.substring(0, v.length() - 1)) * 255 / 100;
else
c[k] = Integer.parseInt(v);
if (c[k] < 0)
c[k] = 0;
else if (c[k] > 255)
c[k] = 255;
c[k] = parseColorValue(tok.nextToken());
}
return new Color(c[0], c[1], c[2], c[3]);
}
} else if (name.startsWith("rgba(")) {
StringTokenizer tok = new StringTokenizer(name, "rgba(), \t\r\n\f");
for (int k = 0; k < 3; ++k) {
c[k] = parseColorValue(tok.nextToken());
}
try {
c[3] = parseAlphaValue(tok.nextToken());
} catch (Exception e) {
//alpha 值可写可不写
}
return new Color(c[0], c[1], c[2], c[3]);
}
name = name.toLowerCase();
if (!NAMES.containsKey(name))
throw new IllegalArgumentException("Color '" + name
+ "' not found.");
c = (int[]) NAMES.get(name);
return new Color(c[0], c[1], c[2], 255);
return new Color(c[0], c[1], c[2], c[3]);
}
/**
* 转化 alpha
* @param v
* @return 0~ 255
*/
public static int parseAlphaValue(String v) {
if (v.endsWith("%")) {
return parseColorValue(v);
}
float r = Float.parseFloat(v) * 255;
if (r < 0)
r = 0;
else if (r > 255)
r = 255;
return (int) r;
}
/**
* 转化 rgb
* @param v
* @return 0~ 255
*/
public static int parseColorValue(String v) {
int r = v.endsWith("%") ? Integer.parseInt(v.substring(0, v.length() - 1)) * 255 / 100 : Integer.parseInt(v);
if (r < 0)
r = 0;
else if (r > 255)
r = 255;
return r;
}
}

368
fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/OcspClientBouncyCastle.java

@ -1,184 +1,184 @@
/*
* $Id: OcspClientBouncyCastle.java 3959 2009-06-09 08:31:05Z blowagie $
*
* Copyright 2009 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2009 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
package com.fr.third.com.lowagie.text.pdf;
import com.fr.third.com.lowagie.text.ExceptionConverter;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.Vector;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
import org.bouncycastle.asn1.x509.X509Extension;
import org.bouncycastle.asn1.x509.X509Extensions;
import org.bouncycastle.ocsp.BasicOCSPResp;
import org.bouncycastle.ocsp.CertificateID;
import org.bouncycastle.ocsp.CertificateStatus;
import org.bouncycastle.ocsp.OCSPException;
import org.bouncycastle.ocsp.OCSPReq;
import org.bouncycastle.ocsp.OCSPReqGenerator;
import org.bouncycastle.ocsp.OCSPResp;
import org.bouncycastle.ocsp.SingleResp;
/**
* OcspClient implementation using BouncyCastle.
* @author psoares
* @since 2.1.6
*/
public class OcspClientBouncyCastle implements OcspClient {
/** root certificate */
private X509Certificate rootCert;
/** check certificate */
private X509Certificate checkCert;
/** OCSP URL */
private String url;
/**
* Creates an instance of an OcspClient that will be using BouncyCastle.
* @param checkCert the check certificate
* @param rootCert the root certificate
* @param url the OCSP URL
*/
public OcspClientBouncyCastle(X509Certificate checkCert, X509Certificate rootCert, String url) {
this.checkCert = checkCert;
this.rootCert = rootCert;
this.url = url;
}
/**
* Generates an OCSP request using BouncyCastle.
* @param issuerCert certificate of the issues
* @param serialNumber serial number
* @return an OCSP request
* @throws OCSPException
* @throws IOException
*/
private static OCSPReq generateOCSPRequest(X509Certificate issuerCert, BigInteger serialNumber) throws OCSPException, IOException {
//Add provider BC
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
// Generate the id for the certificate we are looking for
CertificateID id = new CertificateID(CertificateID.HASH_SHA1, issuerCert, serialNumber);
// basic request generation with nonce
OCSPReqGenerator gen = new OCSPReqGenerator();
gen.addRequest(id);
// create details for nonce extension
Vector oids = new Vector();
Vector values = new Vector();
oids.add(OCSPObjectIdentifiers.id_pkix_ocsp_nonce);
values.add(new X509Extension(false, new DEROctetString(new DEROctetString(PdfEncryption.createDocumentId()).getEncoded())));
gen.setRequestExtensions(new X509Extensions(oids, values));
return gen.generate();
}
/**
* @return a byte array
* @see com.fr.third.com.lowagie.text.pdf.OcspClient#getEncoded()
*/
public byte[] getEncoded() {
try {
OCSPReq request = generateOCSPRequest(rootCert, checkCert.getSerialNumber());
byte[] array = request.getEncoded();
URL urlt = new URL(url);
HttpURLConnection con = (HttpURLConnection)urlt.openConnection();
con.setRequestProperty("Content-Type", "application/ocsp-request");
con.setRequestProperty("Accept", "application/ocsp-response");
con.setDoOutput(true);
OutputStream out = con.getOutputStream();
DataOutputStream dataOut = new DataOutputStream(new BufferedOutputStream(out));
dataOut.write(array);
dataOut.flush();
dataOut.close();
if (con.getResponseCode() / 100 != 2) {
throw new IOException("Invalid HTTP response");
}
//Get Response
InputStream in = (InputStream) con.getContent();
OCSPResp ocspResponse = new OCSPResp(in);
if (ocspResponse.getStatus() != 0)
throw new IOException("Invalid status: " + ocspResponse.getStatus());
BasicOCSPResp basicResponse = (BasicOCSPResp) ocspResponse.getResponseObject();
if (basicResponse != null) {
SingleResp[] responses = basicResponse.getResponses();
if (responses.length == 1) {
SingleResp resp = responses[0];
Object status = resp.getCertStatus();
if (status == CertificateStatus.GOOD) {
return basicResponse.getEncoded();
}
else if (status instanceof org.bouncycastle.ocsp.RevokedStatus) {
throw new IOException("OCSP Status is revoked!");
}
else {
throw new IOException("OCSP Status is unknown!");
}
}
}
}
catch (Exception ex) {
throw new ExceptionConverter(ex);
}
return null;
}
}
///*
// * $Id: OcspClientBouncyCastle.java 3959 2009-06-09 08:31:05Z blowagie $
// *
// * Copyright 2009 Paulo Soares
// *
// * The contents of this file are subject to the Mozilla Public License Version 1.1
// * (the "License"); you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at http://www.mozilla.org/MPL/
// *
// * Software distributed under the License is distributed on an "AS IS" basis,
// * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// * for the specific language governing rights and limitations under the License.
// *
// * The Original Code is 'iText, a free JAVA-PDF library'.
// *
// * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
// * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
// * All Rights Reserved.
// * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
// * are Copyright (C) 2009 by Paulo Soares. All Rights Reserved.
// *
// * Contributor(s): all the names of the contributors are added in the source code
// * where applicable.
// *
// * Alternatively, the contents of this file may be used under the terms of the
// * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
// * provisions of LGPL are applicable instead of those above. If you wish to
// * allow use of your version of this file only under the terms of the LGPL
// * License and not to allow others to use your version of this file under
// * the MPL, indicate your decision by deleting the provisions above and
// * replace them with the notice and other provisions required by the LGPL.
// * If you do not delete the provisions above, a recipient may use your version
// * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
// *
// * This library is free software; you can redistribute it and/or modify it
// * under the terms of the MPL as stated above or under the terms of the GNU
// * Library General Public License as published by the Free Software Foundation;
// * either version 2 of the License, or any later version.
// *
// * This library is distributed in the hope that it will be useful, but WITHOUT
// * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
// * details.
// *
// * If you didn't download this code from the following link, you should check if
// * you aren't using an obsolete version:
// * http://www.lowagie.com/iText/
// */
//
//package com.fr.third.com.lowagie.text.pdf;
//
//import com.fr.third.com.lowagie.text.ExceptionConverter;
//import java.io.BufferedOutputStream;
//import java.io.DataOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.OutputStream;
//import java.math.BigInteger;
//import java.net.HttpURLConnection;
//import java.net.URL;
//import java.security.Security;
//import java.security.cert.X509Certificate;
//import java.util.Vector;
//import org.bouncycastle.asn1.DEROctetString;
//import org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
//import org.bouncycastle.asn1.x509.X509Extension;
//import org.bouncycastle.asn1.x509.X509Extensions;
//import org.bouncycastle.ocsp.BasicOCSPResp;
//import org.bouncycastle.ocsp.CertificateID;
//import org.bouncycastle.ocsp.CertificateStatus;
//import org.bouncycastle.ocsp.OCSPException;
//import org.bouncycastle.ocsp.OCSPReq;
//import org.bouncycastle.ocsp.OCSPReqGenerator;
//import org.bouncycastle.ocsp.OCSPResp;
//import org.bouncycastle.ocsp.SingleResp;
//
///**
// * OcspClient implementation using BouncyCastle.
// * @author psoares
// * @since 2.1.6
// */
//public class OcspClientBouncyCastle implements OcspClient {
// /** root certificate */
// private X509Certificate rootCert;
// /** check certificate */
// private X509Certificate checkCert;
// /** OCSP URL */
// private String url;
//
// /**
// * Creates an instance of an OcspClient that will be using BouncyCastle.
// * @param checkCert the check certificate
// * @param rootCert the root certificate
// * @param url the OCSP URL
// */
// public OcspClientBouncyCastle(X509Certificate checkCert, X509Certificate rootCert, String url) {
// this.checkCert = checkCert;
// this.rootCert = rootCert;
// this.url = url;
// }
//
// /**
// * Generates an OCSP request using BouncyCastle.
// * @param issuerCert certificate of the issues
// * @param serialNumber serial number
// * @return an OCSP request
// * @throws OCSPException
// * @throws IOException
// */
// private static OCSPReq generateOCSPRequest(X509Certificate issuerCert, BigInteger serialNumber) throws OCSPException, IOException {
// //Add provider BC
// Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
//
// // Generate the id for the certificate we are looking for
// CertificateID id = new CertificateID(CertificateID.HASH_SHA1, issuerCert, serialNumber);
//
// // basic request generation with nonce
// OCSPReqGenerator gen = new OCSPReqGenerator();
//
// gen.addRequest(id);
//
// // create details for nonce extension
// Vector oids = new Vector();
// Vector values = new Vector();
//
// oids.add(OCSPObjectIdentifiers.id_pkix_ocsp_nonce);
// values.add(new X509Extension(false, new DEROctetString(new DEROctetString(PdfEncryption.createDocumentId()).getEncoded())));
//
// gen.setRequestExtensions(new X509Extensions(oids, values));
//
// return gen.generate();
// }
//
// /**
// * @return a byte array
// * @see com.fr.third.com.lowagie.text.pdf.OcspClient#getEncoded()
// */
// public byte[] getEncoded() {
// try {
// OCSPReq request = generateOCSPRequest(rootCert, checkCert.getSerialNumber());
// byte[] array = request.getEncoded();
// URL urlt = new URL(url);
// HttpURLConnection con = (HttpURLConnection)urlt.openConnection();
// con.setRequestProperty("Content-Type", "application/ocsp-request");
// con.setRequestProperty("Accept", "application/ocsp-response");
// con.setDoOutput(true);
// OutputStream out = con.getOutputStream();
// DataOutputStream dataOut = new DataOutputStream(new BufferedOutputStream(out));
// dataOut.write(array);
// dataOut.flush();
// dataOut.close();
// if (con.getResponseCode() / 100 != 2) {
// throw new IOException("Invalid HTTP response");
// }
// //Get Response
// InputStream in = (InputStream) con.getContent();
// OCSPResp ocspResponse = new OCSPResp(in);
//
// if (ocspResponse.getStatus() != 0)
// throw new IOException("Invalid status: " + ocspResponse.getStatus());
// BasicOCSPResp basicResponse = (BasicOCSPResp) ocspResponse.getResponseObject();
// if (basicResponse != null) {
// SingleResp[] responses = basicResponse.getResponses();
// if (responses.length == 1) {
// SingleResp resp = responses[0];
// Object status = resp.getCertStatus();
// if (status == CertificateStatus.GOOD) {
// return basicResponse.getEncoded();
// }
// else if (status instanceof org.bouncycastle.ocsp.RevokedStatus) {
// throw new IOException("OCSP Status is revoked!");
// }
// else {
// throw new IOException("OCSP Status is unknown!");
// }
// }
// }
// }
// catch (Exception ex) {
// throw new ExceptionConverter(ex);
// }
// return null;
// }
//}

8
fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/PdfGraphics2D.java

@ -429,10 +429,11 @@ public class PdfGraphics2D extends Graphics2D {
// Simulate a bold font.
// 30有点粗 ,换成40
float strokeWidth = font.getSize2D() * (weight.floatValue() - TextAttribute.WEIGHT_REGULAR.floatValue()) / 40f;
//重点是这个渲染模式的设置,其他无所谓
cb.setTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE);
if (strokeWidth != 1) {
cb.setLineWidth(strokeWidth);
if(realPaint instanceof Color){
cb.setTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE);
cb.setLineWidth(strokeWidth);
Color color = (Color)realPaint;
int alpha = color.getAlpha();
if (alpha != currentStrokeGState) {
@ -445,10 +446,11 @@ public class PdfGraphics2D extends Graphics2D {
}
cb.setGState(gs);
}
paintStroke = color;
cb.setColorStroke(color);
restoreTextRenderingMode = true;
}
}
restoreTextRenderingMode = true;
}
}

268
fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/PdfPKCS7.java

@ -46,6 +46,8 @@
*/
package com.fr.third.com.lowagie.text.pdf;
import com.fr.third.org.bouncycastle.asn1.ASN1Object;
import com.fr.third.org.bouncycastle.asn1.ASN1String;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
@ -75,43 +77,41 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1OutputStream;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.ASN1Set;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.DEREnumerated;
import org.bouncycastle.asn1.DERInteger;
import org.bouncycastle.asn1.DERNull;
import org.bouncycastle.asn1.DERObject;
import org.bouncycastle.asn1.DERObjectIdentifier;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DEROutputStream;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERSet;
import org.bouncycastle.asn1.DERString;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.DERUTCTime;
import org.bouncycastle.asn1.cms.AttributeTable;
import org.bouncycastle.asn1.cms.Attribute;
import org.bouncycastle.asn1.ocsp.BasicOCSPResponse;
import org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
import org.bouncycastle.jce.provider.X509CRLParser;
import org.bouncycastle.jce.provider.X509CertParser;
import com.fr.third.org.bouncycastle.asn1.ASN1Encodable;
import com.fr.third.org.bouncycastle.asn1.ASN1EncodableVector;
import com.fr.third.org.bouncycastle.asn1.ASN1InputStream;
import com.fr.third.org.bouncycastle.asn1.ASN1OutputStream;
import com.fr.third.org.bouncycastle.asn1.ASN1Sequence;
import com.fr.third.org.bouncycastle.asn1.ASN1Set;
import com.fr.third.org.bouncycastle.asn1.ASN1TaggedObject;
import com.fr.third.org.bouncycastle.asn1.DEREnumerated;
import com.fr.third.org.bouncycastle.asn1.DERInteger;
import com.fr.third.org.bouncycastle.asn1.DERNull;
import com.fr.third.org.bouncycastle.asn1.DERObjectIdentifier;
import com.fr.third.org.bouncycastle.asn1.DEROctetString;
import com.fr.third.org.bouncycastle.asn1.DEROutputStream;
import com.fr.third.org.bouncycastle.asn1.DERSequence;
import com.fr.third.org.bouncycastle.asn1.DERSet;
import com.fr.third.org.bouncycastle.asn1.DERTaggedObject;
import com.fr.third.org.bouncycastle.asn1.DERUTCTime;
import com.fr.third.org.bouncycastle.asn1.cms.AttributeTable;
import com.fr.third.org.bouncycastle.asn1.cms.Attribute;
import com.fr.third.org.bouncycastle.asn1.ocsp.BasicOCSPResponse;
import com.fr.third.org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
import com.fr.third.org.bouncycastle.jce.provider.X509CRLParser;
import com.fr.third.org.bouncycastle.jce.provider.X509CertParser;
import com.fr.third.com.lowagie.text.ExceptionConverter;
import java.security.cert.CertificateParsingException;
import java.util.Date;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.tsp.MessageImprint;
import org.bouncycastle.asn1.x509.X509Extensions;
import org.bouncycastle.ocsp.BasicOCSPResp;
import org.bouncycastle.ocsp.CertificateID;
import org.bouncycastle.ocsp.SingleResp;
import org.bouncycastle.tsp.TimeStampToken;
import com.fr.third.org.bouncycastle.asn1.ASN1OctetString;
import com.fr.third.org.bouncycastle.asn1.cms.ContentInfo;
import com.fr.third.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import com.fr.third.org.bouncycastle.asn1.tsp.MessageImprint;
import com.fr.third.org.bouncycastle.asn1.x509.X509Extensions;
//import org.bouncycastle.ocsp.BasicOCSPResp;
//import org.bouncycastle.ocsp.CertificateID;
//import org.bouncycastle.ocsp.SingleResp;
//import org.bouncycastle.tsp.TimeStampToken;
/**
* This class does all the processing related to signing and verifying a PKCS#7
@ -167,7 +167,7 @@ public class PdfPKCS7 {
*/
private String signName;
private TimeStampToken timeStampToken;
// private TimeStampToken timeStampToken;
private static final HashMap digestNames = new HashMap();
private static final HashMap algorithmNames = new HashMap();
@ -273,23 +273,23 @@ public class PdfPKCS7 {
* @return the timestamp token or null
* @since 2.1.6
*/
public TimeStampToken getTimeStampToken() {
return timeStampToken;
}
// public TimeStampToken getTimeStampToken() {
// return timeStampToken;
// }
/**
* Gets the timestamp date
* @return a date
* @since 2.1.6
*/
public Calendar getTimeStampDate() {
if (timeStampToken == null)
return null;
Calendar cal = new GregorianCalendar();
Date date = timeStampToken.getTimeStampInfo().getGenTime();
cal.setTime(date);
return cal;
}
// public Calendar getTimeStampDate() {
// if (timeStampToken == null)
// return null;
// Calendar cal = new GregorianCalendar();
// Date date = timeStampToken.getTimeStampInfo().getGenTime();
// cal.setTime(date);
// return cal;
// }
/**
* Verifies a signature using the sub-filter adbe.x509.rsa_sha1.
@ -319,19 +319,19 @@ public class PdfPKCS7 {
}
}
private BasicOCSPResp basicResp;
// private BasicOCSPResp basicResp;
/**
* Gets the OCSP basic response if there is one.
* @return the OCSP basic response or null
* @since 2.1.6
*/
public BasicOCSPResp getOcsp() {
return basicResp;
}
// public BasicOCSPResp getOcsp() {
// return basicResp;
// }
private void findOcsp(ASN1Sequence seq) throws IOException {
basicResp = null;
// basicResp = null;
boolean ret = false;
while (true) {
if ((seq.getObjectAt(0) instanceof DERObjectIdentifier)
@ -362,7 +362,7 @@ public class PdfPKCS7 {
DEROctetString os = (DEROctetString)seq.getObjectAt(1);
ASN1InputStream inp = new ASN1InputStream(os.getOctets());
BasicOCSPResponse resp = BasicOCSPResponse.getInstance(inp.readObject());
basicResp = new BasicOCSPResp(resp);
// basicResp = new BasicOCSPResp(resp);
}
/**
@ -379,7 +379,7 @@ public class PdfPKCS7 {
//
// Basic checks to make sure it's a PKCS#7 SignedData Object
//
DERObject pkcs;
ASN1Object pkcs;
try {
pkcs = din.readObject();
@ -464,7 +464,7 @@ public class PdfPKCS7 {
if (signerInfo.getObjectAt(next) instanceof ASN1TaggedObject) {
ASN1TaggedObject tagsig = (ASN1TaggedObject)signerInfo.getObjectAt(next);
ASN1Set sseq = ASN1Set.getInstance(tagsig, false);
sigAttr = sseq.getEncoded(ASN1Encodable.DER);
sigAttr = sseq.getEncoded("DER");
for (int k = 0; k < sseq.size(); ++k) {
ASN1Sequence seq2 = (ASN1Sequence)sseq.getObjectAt(k);
@ -499,7 +499,7 @@ public class PdfPKCS7 {
ASN1Set attributeValues = ts.getAttrValues();
ASN1Sequence tokenSequence = ASN1Sequence.getInstance(attributeValues.getObjectAt(0));
ContentInfo contentInfo = new ContentInfo(tokenSequence);
this.timeStampToken = new TimeStampToken(contentInfo);
// this.timeStampToken = new TimeStampToken(contentInfo);
}
}
if (RSAdata != null || digestAttr != null) {
@ -641,15 +641,15 @@ public class PdfPKCS7 {
* @return true if it checks false otherwise
* @since 2.1.6
*/
public boolean verifyTimestampImprint() throws NoSuchAlgorithmException {
if (timeStampToken == null)
return false;
MessageImprint imprint = timeStampToken.getTimeStampInfo().toTSTInfo().getMessageImprint();
byte[] md = MessageDigest.getInstance("SHA-1").digest(digest);
byte[] imphashed = imprint.getHashedMessage();
boolean res = Arrays.equals(md, imphashed);
return res;
}
// public boolean verifyTimestampImprint() throws NoSuchAlgorithmException {
// if (timeStampToken == null)
// return false;
// MessageImprint imprint = timeStampToken.getTimeStampInfo().toTSTInfo().getMessageImprint();
// byte[] md = MessageDigest.getInstance("SHA-1").digest(digest);
// byte[] imphashed = imprint.getHashedMessage();
// boolean res = Arrays.equals(md, imphashed);
// return res;
// }
/**
* Get all the X.509 certificates associated with this PKCS#7 object in no particular order.
@ -888,27 +888,27 @@ public class PdfPKCS7 {
* @return <CODE>true</CODE> is a certificate was found
* @since 2.1.6
*/
public static boolean verifyOcspCertificates(BasicOCSPResp ocsp, KeyStore keystore, String provider) {
if (provider == null)
provider = "BC";
try {
for (Enumeration aliases = keystore.aliases(); aliases.hasMoreElements();) {
try {
String alias = (String)aliases.nextElement();
if (!keystore.isCertificateEntry(alias))
continue;
X509Certificate certStoreX509 = (X509Certificate)keystore.getCertificate(alias);
if (ocsp.verify(certStoreX509.getPublicKey(), provider))
return true;
}
catch (Exception ex) {
}
}
}
catch (Exception e) {
}
return false;
}
// public static boolean verifyOcspCertificates(BasicOCSPResp ocsp, KeyStore keystore, String provider) {
// if (provider == null)
// provider = "BC";
// try {
// for (Enumeration aliases = keystore.aliases(); aliases.hasMoreElements();) {
// try {
// String alias = (String)aliases.nextElement();
// if (!keystore.isCertificateEntry(alias))
// continue;
// X509Certificate certStoreX509 = (X509Certificate)keystore.getCertificate(alias);
// if (ocsp.verify(certStoreX509.getPublicKey(), provider))
// return true;
// }
// catch (Exception ex) {
// }
// }
// }
// catch (Exception e) {
// }
// return false;
// }
/**
* Verifies a timestamp against a KeyStore.
@ -918,27 +918,27 @@ public class PdfPKCS7 {
* @return <CODE>true</CODE> is a certificate was found
* @since 2.1.6
*/
public static boolean verifyTimestampCertificates(TimeStampToken ts, KeyStore keystore, String provider) {
if (provider == null)
provider = "BC";
try {
for (Enumeration aliases = keystore.aliases(); aliases.hasMoreElements();) {
try {
String alias = (String)aliases.nextElement();
if (!keystore.isCertificateEntry(alias))
continue;
X509Certificate certStoreX509 = (X509Certificate)keystore.getCertificate(alias);
ts.validate(certStoreX509, provider);
return true;
}
catch (Exception ex) {
}
}
}
catch (Exception e) {
}
return false;
}
// public static boolean verifyTimestampCertificates(TimeStampToken ts, KeyStore keystore, String provider) {
// if (provider == null)
// provider = "BC";
// try {
// for (Enumeration aliases = keystore.aliases(); aliases.hasMoreElements();) {
// try {
// String alias = (String)aliases.nextElement();
// if (!keystore.isCertificateEntry(alias))
// continue;
// X509Certificate certStoreX509 = (X509Certificate)keystore.getCertificate(alias);
// ts.validate(certStoreX509, provider);
// return true;
// }
// catch (Exception ex) {
// }
// }
// }
// catch (Exception e) {
// }
// return false;
// }
/**
* Retrieves the OCSP URL from the given certificate.
@ -949,7 +949,7 @@ public class PdfPKCS7 {
*/
public static String getOCSPURL(X509Certificate certificate) throws CertificateParsingException {
try {
DERObject obj = getExtensionValue(certificate, X509Extensions.AuthorityInfoAccess.getId());
ASN1Object obj = getExtensionValue(certificate, X509Extensions.AuthorityInfoAccess.getId());
if (obj == null) {
return null;
}
@ -961,7 +961,7 @@ public class PdfPKCS7 {
continue;
} else {
if ((AccessDescription.getObjectAt(0) instanceof DERObjectIdentifier) && ((DERObjectIdentifier)AccessDescription.getObjectAt(0)).getId().equals("1.3.6.1.5.5.7.48.1")) {
String AccessLocation = getStringFromGeneralName((DERObject)AccessDescription.getObjectAt(1));
String AccessLocation = getStringFromGeneralName((ASN1Object)AccessDescription.getObjectAt(1));
if ( AccessLocation == null ) {
return "" ;
} else {
@ -980,26 +980,26 @@ public class PdfPKCS7 {
* @return true if it checks false otherwise
* @since 2.1.6
*/
public boolean isRevocationValid() {
if (basicResp == null)
return false;
if (signCerts.size() < 2)
return false;
try {
X509Certificate[] cs = (X509Certificate[])getSignCertificateChain();
SingleResp sr = basicResp.getResponses()[0];
CertificateID cid = sr.getCertID();
X509Certificate sigcer = getSigningCertificate();
X509Certificate isscer = cs[1];
CertificateID tis = new CertificateID(CertificateID.HASH_SHA1, isscer, sigcer.getSerialNumber());
return tis.equals(cid);
}
catch (Exception ex) {
}
return false;
}
// public boolean isRevocationValid() {
// if (basicResp == null)
// return false;
// if (signCerts.size() < 2)
// return false;
// try {
// X509Certificate[] cs = (X509Certificate[])getSignCertificateChain();
// SingleResp sr = basicResp.getResponses()[0];
// CertificateID cid = sr.getCertID();
// X509Certificate sigcer = getSigningCertificate();
// X509Certificate isscer = cs[1];
// CertificateID tis = new CertificateID(CertificateID.HASH_SHA1, isscer, sigcer.getSerialNumber());
// return tis.equals(cid);
// }
// catch (Exception ex) {
// }
// return false;
// }
private static DERObject getExtensionValue(X509Certificate cert, String oid) throws IOException {
private static ASN1Object getExtensionValue(X509Certificate cert, String oid) throws IOException {
byte[] bytes = cert.getExtensionValue(oid);
if (bytes == null) {
return null;
@ -1010,7 +1010,7 @@ public class PdfPKCS7 {
return aIn.readObject();
}
private static String getStringFromGeneralName(DERObject names) throws IOException {
private static String getStringFromGeneralName(ASN1Object names) throws IOException {
DERTaggedObject taggedObject = (DERTaggedObject) names ;
return new String(ASN1OctetString.getInstance(taggedObject, false).getOctets(), "ISO-8859-1");
}
@ -1020,11 +1020,11 @@ public class PdfPKCS7 {
* @param enc a TBSCertificate in a byte array
* @return a DERObject
*/
private static DERObject getIssuer(byte[] enc) {
private static ASN1Object getIssuer(byte[] enc) {
try {
ASN1InputStream in = new ASN1InputStream(new ByteArrayInputStream(enc));
ASN1Sequence seq = (ASN1Sequence)in.readObject();
return (DERObject)seq.getObjectAt(seq.getObjectAt(0) instanceof DERTaggedObject ? 3 : 2);
return (ASN1Object)seq.getObjectAt(seq.getObjectAt(0) instanceof DERTaggedObject ? 3 : 2);
}
catch (IOException e) {
throw new ExceptionConverter(e);
@ -1036,11 +1036,11 @@ public class PdfPKCS7 {
* @param enc A TBSCertificate in a byte array
* @return a DERObject
*/
private static DERObject getSubject(byte[] enc) {
private static ASN1Object getSubject(byte[] enc) {
try {
ASN1InputStream in = new ASN1InputStream(new ByteArrayInputStream(enc));
ASN1Sequence seq = (ASN1Sequence)in.readObject();
return (DERObject)seq.getObjectAt(seq.getObjectAt(0) instanceof DERTaggedObject ? 5 : 4);
return (ASN1Object)seq.getObjectAt(seq.getObjectAt(0) instanceof DERTaggedObject ? 5 : 4);
}
catch (IOException e) {
throw new ExceptionConverter(e);
@ -1340,7 +1340,7 @@ public class PdfPKCS7 {
*/
public byte[] getAuthenticatedAttributeBytes(byte secondDigest[], Calendar signingTime, byte[] ocsp) {
try {
return getAuthenticatedAttributeSet(secondDigest, signingTime, ocsp).getEncoded(ASN1Encodable.DER);
return getAuthenticatedAttributeSet(secondDigest, signingTime, ocsp).getEncoded("DER");
}
catch (Exception e) {
throw new ExceptionConverter(e);
@ -1575,7 +1575,7 @@ public class PdfPKCS7 {
vs = new ArrayList();
values.put(id, vs);
}
vs.add(((DERString)s.getObjectAt(1)).getString());
vs.add(((ASN1String)s.getObjectAt(1)).getString());
}
}
}

45
fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/PdfPublicKeySecurityHandler.java

@ -89,6 +89,8 @@
package com.fr.third.com.lowagie.text.pdf;
import com.fr.third.org.bouncycastle.asn1.ASN1Object;
import com.fr.third.org.bouncycastle.asn1.ASN1Set;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@ -107,22 +109,21 @@ import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.DERObject;
import org.bouncycastle.asn1.DERObjectIdentifier;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DEROutputStream;
import org.bouncycastle.asn1.DERSet;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.asn1.cms.EncryptedContentInfo;
import org.bouncycastle.asn1.cms.EnvelopedData;
import org.bouncycastle.asn1.cms.IssuerAndSerialNumber;
import org.bouncycastle.asn1.cms.KeyTransRecipientInfo;
import org.bouncycastle.asn1.cms.RecipientIdentifier;
import org.bouncycastle.asn1.cms.RecipientInfo;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.x509.TBSCertificateStructure;
import com.fr.third.org.bouncycastle.asn1.ASN1InputStream;
import com.fr.third.org.bouncycastle.asn1.DERObjectIdentifier;
import com.fr.third.org.bouncycastle.asn1.DEROctetString;
import com.fr.third.org.bouncycastle.asn1.DEROutputStream;
import com.fr.third.org.bouncycastle.asn1.DERSet;
import com.fr.third.org.bouncycastle.asn1.cms.ContentInfo;
import com.fr.third.org.bouncycastle.asn1.cms.EncryptedContentInfo;
import com.fr.third.org.bouncycastle.asn1.cms.EnvelopedData;
import com.fr.third.org.bouncycastle.asn1.cms.IssuerAndSerialNumber;
import com.fr.third.org.bouncycastle.asn1.cms.KeyTransRecipientInfo;
import com.fr.third.org.bouncycastle.asn1.cms.RecipientIdentifier;
import com.fr.third.org.bouncycastle.asn1.cms.RecipientInfo;
import com.fr.third.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import com.fr.third.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import com.fr.third.org.bouncycastle.asn1.x509.TBSCertificateStructure;
/**
* @author Aiken Sam (aikensam@ieee.org)
@ -244,7 +245,7 @@ public class PdfPublicKeySecurityHandler {
pkcs7input[22] = two;
pkcs7input[23] = one;
DERObject obj = createDERForRecipient(pkcs7input, (X509Certificate)certificate);
ASN1Object obj = createDERForRecipient(pkcs7input, (X509Certificate)certificate);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
@ -276,7 +277,7 @@ public class PdfPublicKeySecurityHandler {
return EncodedRecipients;
}
private DERObject createDERForRecipient(byte[] in, X509Certificate cert)
private ASN1Object createDERForRecipient(byte[] in, X509Certificate cert)
throws IOException,
GeneralSecurityException
{
@ -287,7 +288,7 @@ public class PdfPublicKeySecurityHandler {
AlgorithmParameters algorithmparameters = algorithmparametergenerator.generateParameters();
ByteArrayInputStream bytearrayinputstream = new ByteArrayInputStream(algorithmparameters.getEncoded("ASN.1"));
ASN1InputStream asn1inputstream = new ASN1InputStream(bytearrayinputstream);
DERObject derobject = asn1inputstream.readObject();
ASN1Object derobject = asn1inputstream.readObject();
KeyGenerator keygenerator = KeyGenerator.getInstance(s);
keygenerator.init(128);
SecretKey secretkey = keygenerator.generateKey();
@ -300,10 +301,10 @@ public class PdfPublicKeySecurityHandler {
AlgorithmIdentifier algorithmidentifier = new AlgorithmIdentifier(new DERObjectIdentifier(s), derobject);
EncryptedContentInfo encryptedcontentinfo =
new EncryptedContentInfo(PKCSObjectIdentifiers.data, algorithmidentifier, deroctetstring);
EnvelopedData env = new EnvelopedData(null, derset, encryptedcontentinfo, null);
EnvelopedData env = new EnvelopedData(null, derset, encryptedcontentinfo,(ASN1Set) null);
ContentInfo contentinfo =
new ContentInfo(PKCSObjectIdentifiers.envelopedData, env);
return contentinfo.getDERObject();
return contentinfo.getContentType();
}
private KeyTransRecipientInfo computeRecipientInfo(X509Certificate x509certificate, byte[] abyte0)
@ -318,7 +319,7 @@ public class PdfPublicKeySecurityHandler {
new IssuerAndSerialNumber(
tbscertificatestructure.getIssuer(),
tbscertificatestructure.getSerialNumber().getValue());
Cipher cipher = Cipher.getInstance(algorithmidentifier.getObjectId().getId());
Cipher cipher = Cipher.getInstance(algorithmidentifier.getAlgorithm().getId());
cipher.init(1, x509certificate);
DEROctetString deroctetstring = new DEROctetString(cipher.doFinal(abyte0));
RecipientIdentifier recipId = new RecipientIdentifier(issuerandserialnumber);

40
fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/PdfReader.java

@ -78,8 +78,8 @@ import com.fr.third.com.lowagie.text.exceptions.UnsupportedPdfException;
import com.fr.third.com.lowagie.text.pdf.interfaces.PdfViewerPreferences;
import com.fr.third.com.lowagie.text.pdf.internal.PdfViewerPreferencesImp;
import org.bouncycastle.cms.CMSEnvelopedData;
import org.bouncycastle.cms.RecipientInformation;
//import com.fr.third.org.bouncycastle.cms.CMSEnvelopedData;
//import com.fr.third.org.bouncycastle.cms.RecipientInformation;
/** Reads a PDF document.
* @author Paulo Soares (psoares@consiste.pt)
@ -709,24 +709,24 @@ public class PdfReader implements PdfViewerPreferences {
PdfObject recipient = recipients.getPdfObject(i);
strings.remove(recipient);
CMSEnvelopedData data = null;
try {
data = new CMSEnvelopedData(recipient.getBytes());
Iterator recipientCertificatesIt = data.getRecipientInfos().getRecipients().iterator();
while (recipientCertificatesIt.hasNext()) {
RecipientInformation recipientInfo = (RecipientInformation)recipientCertificatesIt.next();
if (recipientInfo.getRID().match(certificate) && !foundRecipient) {
envelopedData = recipientInfo.getContent(certificateKey, certificateKeyProvider);
foundRecipient = true;
}
}
}
catch (Exception f) {
throw new ExceptionConverter(f);
}
// CMSEnvelopedData data = null;
// try {
// data = new CMSEnvelopedData(recipient.getBytes());
//
// Iterator recipientCertificatesIt = data.getRecipientInfos().getRecipients().iterator();
//
// while (recipientCertificatesIt.hasNext()) {
// RecipientInformation recipientInfo = (RecipientInformation)recipientCertificatesIt.next();
//
// if (recipientInfo.getRID().match(certificate) && !foundRecipient) {
// envelopedData = recipientInfo.getContent(certificateKey, certificateKeyProvider);
// foundRecipient = true;
// }
// }
// }
// catch (Exception f) {
// throw new ExceptionConverter(f);
// }
}
if(!foundRecipient || envelopedData == null) {

460
fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/TSAClientBouncyCastle.java

@ -1,230 +1,230 @@
/*
* $Id: TSAClientBouncyCastle.java 3973 2009-06-16 10:30:31Z psoares33 $
*
* Copyright 2009 Martin Brunecky, Aiken Sam
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2009 by Martin Brunecky. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
package com.fr.third.com.lowagie.text.pdf;
import java.io.*;
import java.math.*;
import java.net.*;
import org.bouncycastle.asn1.cmp.*;
import org.bouncycastle.asn1.x509.*;
import org.bouncycastle.tsp.*;
import com.fr.third.com.lowagie.text.pdf.codec.Base64;
/**
* Time Stamp Authority Client interface implementation using Bouncy Castle
* org.bouncycastle.tsp package.
* <p>
* Created by Aiken Sam, 2006-11-15, refactored by Martin Brunecky, 07/15/2007
* for ease of subclassing.
* </p>
* @since 2.1.6
*/
public class TSAClientBouncyCastle implements TSAClient {
/** URL of the Time Stamp Authority */
protected String tsaURL;
/** TSA Username */
protected String tsaUsername;
/** TSA password */
protected String tsaPassword;
/** Estimate of the received time stamp token */
protected int tokSzEstimate;
/**
* Creates an instance of a TSAClient that will use BouncyCastle.
* @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
*/
public TSAClientBouncyCastle(String url) {
this(url, null, null, 4096);
}
/**
* Creates an instance of a TSAClient that will use BouncyCastle.
* @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
* @param username String - user(account) name
* @param password String - password
*/
public TSAClientBouncyCastle(String url, String username, String password) {
this(url, username, password, 4096);
}
/**
* Constructor.
* Note the token size estimate is updated by each call, as the token
* size is not likely to change (as long as we call the same TSA using
* the same imprint length).
* @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
* @param username String - user(account) name
* @param password String - password
* @param tokSzEstimate int - estimated size of received time stamp token (DER encoded)
*/
public TSAClientBouncyCastle(String url, String username, String password, int tokSzEstimate) {
this.tsaURL = url;
this.tsaUsername = username;
this.tsaPassword = password;
this.tokSzEstimate = tokSzEstimate;
}
/**
* Get the token size estimate.
* Returned value reflects the result of the last succesfull call, padded
* @return an estimate of the token size
*/
public int getTokenSizeEstimate() {
return tokSzEstimate;
}
/**
* Get RFC 3161 timeStampToken.
* Method may return null indicating that timestamp should be skipped.
* @param caller PdfPKCS7 - calling PdfPKCS7 instance (in case caller needs it)
* @param imprint byte[] - data imprint to be time-stamped
* @return byte[] - encoded, TSA signed data of the timeStampToken
* @throws Exception - TSA request failed
* @see com.fr.third.com.lowagie.text.pdf.TSAClient#getTimeStampToken(com.fr.third.com.lowagie.text.pdf.PdfPKCS7, byte[])
*/
public byte[] getTimeStampToken(PdfPKCS7 caller, byte[] imprint) throws Exception {
return getTimeStampToken(imprint);
}
/**
* Get timestamp token - Bouncy Castle request encoding / decoding layer
*/
protected byte[] getTimeStampToken(byte[] imprint) throws Exception {
byte[] respBytes = null;
try {
// Setup the time stamp request
TimeStampRequestGenerator tsqGenerator = new TimeStampRequestGenerator();
tsqGenerator.setCertReq(true);
// tsqGenerator.setReqPolicy("1.3.6.1.4.1.601.10.3.1");
BigInteger nonce = BigInteger.valueOf(System.currentTimeMillis());
TimeStampRequest request = tsqGenerator.generate(X509ObjectIdentifiers.id_SHA1.getId() , imprint, nonce);
byte[] requestBytes = request.getEncoded();
// Call the communications layer
respBytes = getTSAResponse(requestBytes);
// Handle the TSA response
TimeStampResponse response = new TimeStampResponse(respBytes);
// validate communication level attributes (RFC 3161 PKIStatus)
response.validate(request);
PKIFailureInfo failure = response.getFailInfo();
int value = (failure == null) ? 0 : failure.intValue();
if (value != 0) {
// @todo: Translate value of 15 error codes defined by PKIFailureInfo to string
throw new Exception("Invalid TSA '" + tsaURL + "' response, code " + value);
}
// @todo: validate the time stap certificate chain (if we want
// assure we do not sign using an invalid timestamp).
// extract just the time stamp token (removes communication status info)
TimeStampToken tsToken = response.getTimeStampToken();
if (tsToken == null) {
throw new Exception("TSA '" + tsaURL + "' failed to return time stamp token: " + response.getStatusString());
}
TimeStampTokenInfo info = tsToken.getTimeStampInfo(); // to view details
byte[] encoded = tsToken.getEncoded();
long stop = System.currentTimeMillis();
// Update our token size estimate for the next call (padded to be safe)
this.tokSzEstimate = encoded.length + 32;
return encoded;
} catch (Exception e) {
throw e;
} catch (Throwable t) {
throw new Exception("Failed to get TSA response from '" + tsaURL +"'", t);
}
}
/**
* Get timestamp token - communications layer
* @return - byte[] - TSA response, raw bytes (RFC 3161 encoded)
*/
protected byte[] getTSAResponse(byte[] requestBytes) throws Exception {
// Setup the TSA connection
URL url = new URL(tsaURL);
URLConnection tsaConnection;
tsaConnection = (URLConnection) url.openConnection();
tsaConnection.setDoInput(true);
tsaConnection.setDoOutput(true);
tsaConnection.setUseCaches(false);
tsaConnection.setRequestProperty("Content-Type", "application/timestamp-query");
//tsaConnection.setRequestProperty("Content-Transfer-Encoding", "base64");
tsaConnection.setRequestProperty("Content-Transfer-Encoding", "binary");
if ((tsaUsername != null) && !tsaUsername.equals("") ) {
String userPassword = tsaUsername + ":" + tsaPassword;
tsaConnection.setRequestProperty("Authorization", "Basic " +
new String(Base64.encodeBytes(userPassword.getBytes())));
}
OutputStream out = tsaConnection.getOutputStream();
out.write(requestBytes);
out.close();
// Get TSA response as a byte array
InputStream inp = tsaConnection.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = inp.read(buffer, 0, buffer.length)) >= 0) {
baos.write(buffer, 0, bytesRead);
}
byte[] respBytes = baos.toByteArray();
String encoding = tsaConnection.getContentEncoding();
if (encoding != null && encoding.equalsIgnoreCase("base64")) {
respBytes = Base64.decode(new String(respBytes));
}
return respBytes;
}
}
///*
// * $Id: TSAClientBouncyCastle.java 3973 2009-06-16 10:30:31Z psoares33 $
// *
// * Copyright 2009 Martin Brunecky, Aiken Sam
// *
// * The contents of this file are subject to the Mozilla Public License Version 1.1
// * (the "License"); you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at http://www.mozilla.org/MPL/
// *
// * Software distributed under the License is distributed on an "AS IS" basis,
// * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// * for the specific language governing rights and limitations under the License.
// *
// * The Original Code is 'iText, a free JAVA-PDF library'.
// *
// * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
// * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
// * All Rights Reserved.
// * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
// * are Copyright (C) 2009 by Martin Brunecky. All Rights Reserved.
// *
// * Contributor(s): all the names of the contributors are added in the source code
// * where applicable.
// *
// * Alternatively, the contents of this file may be used under the terms of the
// * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
// * provisions of LGPL are applicable instead of those above. If you wish to
// * allow use of your version of this file only under the terms of the LGPL
// * License and not to allow others to use your version of this file under
// * the MPL, indicate your decision by deleting the provisions above and
// * replace them with the notice and other provisions required by the LGPL.
// * If you do not delete the provisions above, a recipient may use your version
// * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
// *
// * This library is free software; you can redistribute it and/or modify it
// * under the terms of the MPL as stated above or under the terms of the GNU
// * Library General Public License as published by the Free Software Foundation;
// * either version 2 of the License, or any later version.
// *
// * This library is distributed in the hope that it will be useful, but WITHOUT
// * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
// * details.
// *
// * If you didn't download this code from the following link, you should check if
// * you aren't using an obsolete version:
// * http://www.lowagie.com/iText/
// */
//
//package com.fr.third.com.lowagie.text.pdf;
//
//import java.io.*;
//import java.math.*;
//import java.net.*;
//
//import org.bouncycastle.asn1.cmp.*;
//import org.bouncycastle.asn1.x509.*;
//import org.bouncycastle.tsp.*;
//
//import com.fr.third.com.lowagie.text.pdf.codec.Base64;
//
///**
// * Time Stamp Authority Client interface implementation using Bouncy Castle
// * org.bouncycastle.tsp package.
// * <p>
// * Created by Aiken Sam, 2006-11-15, refactored by Martin Brunecky, 07/15/2007
// * for ease of subclassing.
// * </p>
// * @since 2.1.6
// */
//public class TSAClientBouncyCastle implements TSAClient {
// /** URL of the Time Stamp Authority */
// protected String tsaURL;
// /** TSA Username */
// protected String tsaUsername;
// /** TSA password */
// protected String tsaPassword;
// /** Estimate of the received time stamp token */
// protected int tokSzEstimate;
//
// /**
// * Creates an instance of a TSAClient that will use BouncyCastle.
// * @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
// */
// public TSAClientBouncyCastle(String url) {
// this(url, null, null, 4096);
// }
//
// /**
// * Creates an instance of a TSAClient that will use BouncyCastle.
// * @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
// * @param username String - user(account) name
// * @param password String - password
// */
// public TSAClientBouncyCastle(String url, String username, String password) {
// this(url, username, password, 4096);
// }
//
// /**
// * Constructor.
// * Note the token size estimate is updated by each call, as the token
// * size is not likely to change (as long as we call the same TSA using
// * the same imprint length).
// * @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
// * @param username String - user(account) name
// * @param password String - password
// * @param tokSzEstimate int - estimated size of received time stamp token (DER encoded)
// */
// public TSAClientBouncyCastle(String url, String username, String password, int tokSzEstimate) {
// this.tsaURL = url;
// this.tsaUsername = username;
// this.tsaPassword = password;
// this.tokSzEstimate = tokSzEstimate;
// }
//
// /**
// * Get the token size estimate.
// * Returned value reflects the result of the last succesfull call, padded
// * @return an estimate of the token size
// */
// public int getTokenSizeEstimate() {
// return tokSzEstimate;
// }
//
// /**
// * Get RFC 3161 timeStampToken.
// * Method may return null indicating that timestamp should be skipped.
// * @param caller PdfPKCS7 - calling PdfPKCS7 instance (in case caller needs it)
// * @param imprint byte[] - data imprint to be time-stamped
// * @return byte[] - encoded, TSA signed data of the timeStampToken
// * @throws Exception - TSA request failed
// * @see com.fr.third.com.lowagie.text.pdf.TSAClient#getTimeStampToken(com.fr.third.com.lowagie.text.pdf.PdfPKCS7, byte[])
// */
// public byte[] getTimeStampToken(PdfPKCS7 caller, byte[] imprint) throws Exception {
// return getTimeStampToken(imprint);
// }
//
// /**
// * Get timestamp token - Bouncy Castle request encoding / decoding layer
// */
// protected byte[] getTimeStampToken(byte[] imprint) throws Exception {
// byte[] respBytes = null;
// try {
// // Setup the time stamp request
// TimeStampRequestGenerator tsqGenerator = new TimeStampRequestGenerator();
// tsqGenerator.setCertReq(true);
// // tsqGenerator.setReqPolicy("1.3.6.1.4.1.601.10.3.1");
// BigInteger nonce = BigInteger.valueOf(System.currentTimeMillis());
// TimeStampRequest request = tsqGenerator.generate(X509ObjectIdentifiers.id_SHA1.getId() , imprint, nonce);
// byte[] requestBytes = request.getEncoded();
//
// // Call the communications layer
// respBytes = getTSAResponse(requestBytes);
//
// // Handle the TSA response
// TimeStampResponse response = new TimeStampResponse(respBytes);
//
// // validate communication level attributes (RFC 3161 PKIStatus)
// response.validate(request);
// PKIFailureInfo failure = response.getFailInfo();
// int value = (failure == null) ? 0 : failure.intValue();
// if (value != 0) {
// // @todo: Translate value of 15 error codes defined by PKIFailureInfo to string
// throw new Exception("Invalid TSA '" + tsaURL + "' response, code " + value);
// }
// // @todo: validate the time stap certificate chain (if we want
// // assure we do not sign using an invalid timestamp).
//
// // extract just the time stamp token (removes communication status info)
// TimeStampToken tsToken = response.getTimeStampToken();
// if (tsToken == null) {
// throw new Exception("TSA '" + tsaURL + "' failed to return time stamp token: " + response.getStatusString());
// }
// TimeStampTokenInfo info = tsToken.getTimeStampInfo(); // to view details
// byte[] encoded = tsToken.getEncoded();
// long stop = System.currentTimeMillis();
//
// // Update our token size estimate for the next call (padded to be safe)
// this.tokSzEstimate = encoded.length + 32;
// return encoded;
// } catch (Exception e) {
// throw e;
// } catch (Throwable t) {
// throw new Exception("Failed to get TSA response from '" + tsaURL +"'", t);
// }
// }
//
// /**
// * Get timestamp token - communications layer
// * @return - byte[] - TSA response, raw bytes (RFC 3161 encoded)
// */
// protected byte[] getTSAResponse(byte[] requestBytes) throws Exception {
// // Setup the TSA connection
// URL url = new URL(tsaURL);
// URLConnection tsaConnection;
// tsaConnection = (URLConnection) url.openConnection();
//
// tsaConnection.setDoInput(true);
// tsaConnection.setDoOutput(true);
// tsaConnection.setUseCaches(false);
// tsaConnection.setRequestProperty("Content-Type", "application/timestamp-query");
// //tsaConnection.setRequestProperty("Content-Transfer-Encoding", "base64");
// tsaConnection.setRequestProperty("Content-Transfer-Encoding", "binary");
//
// if ((tsaUsername != null) && !tsaUsername.equals("") ) {
// String userPassword = tsaUsername + ":" + tsaPassword;
// tsaConnection.setRequestProperty("Authorization", "Basic " +
// new String(Base64.encodeBytes(userPassword.getBytes())));
// }
// OutputStream out = tsaConnection.getOutputStream();
// out.write(requestBytes);
// out.close();
//
// // Get TSA response as a byte array
// InputStream inp = tsaConnection.getInputStream();
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// byte[] buffer = new byte[1024];
// int bytesRead = 0;
// while ((bytesRead = inp.read(buffer, 0, buffer.length)) >= 0) {
// baos.write(buffer, 0, bytesRead);
// }
// byte[] respBytes = baos.toByteArray();
//
// String encoding = tsaConnection.getContentEncoding();
// if (encoding != null && encoding.equalsIgnoreCase("base64")) {
// respBytes = Base64.decode(new String(respBytes));
// }
// return respBytes;
// }
//}

12
fine-itext-old/src/main/java/com/fr/third/com/lowagie/text/pdf/crypto/AESCipher.java

@ -48,12 +48,12 @@
*/
package com.fr.third.com.lowagie.text.pdf.crypto;
import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.engines.AESFastEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;
import com.fr.third.org.bouncycastle.crypto.BlockCipher;
import com.fr.third.org.bouncycastle.crypto.engines.AESFastEngine;
import com.fr.third.org.bouncycastle.crypto.modes.CBCBlockCipher;
import com.fr.third.org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import com.fr.third.org.bouncycastle.crypto.params.KeyParameter;
import com.fr.third.org.bouncycastle.crypto.params.ParametersWithIV;
/**
* Creates an AES Cipher with CBC and padding PKCS5/7.

74
fine-itext-old/test/com/fr/third/com/lowagie/text/pdf/PdfEncryptDecryptTest.java

@ -0,0 +1,74 @@
package com.fr.third.com.lowagie.text.pdf;
import com.fr.third.com.lowagie.text.Document;
import com.fr.third.com.lowagie.text.DocumentException;
import com.fr.third.com.lowagie.text.Paragraph;
import com.fr.third.com.lowagie.text.exceptions.BadPasswordException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.junit.Test;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.fail;
/**
* @author Hugh.C 不在打包范围内只是留个凭证需要自己添加junit 依赖才能跑
* @version 1.0
* Created by Hugh.C on 2020/4/28
*/
public class PdfEncryptDecryptTest {
@Test
public void testPdfEncryption() {
try {
byte[] bytes = createPdfEncryptionDocumentByteArray("123");
assertTrue(bytes.length > 0);
} catch (Exception e) {
fail();
}
}
@Test
public void testPdfDecrypt() {
try {
//沒報錯,解密成功
new PdfReader(createPdfEncryptionDocumentByteArray("123"), "123".getBytes());
} catch (Exception e) {
fail();
}
boolean result = false;
try {
//報錯,解密失敗
new PdfReader(createPdfEncryptionDocumentByteArray("123"), "234".getBytes());
} catch (Exception e) {
assertTrue(e instanceof BadPasswordException);
result = true;
}
assertTrue(result);
}
/**
* 創建加密過後的pdf document 數組
*
* @param passWord pdf密碼
* @return
* @throws DocumentException
* @throws IOException
*/
private byte[] createPdfEncryptionDocumentByteArray(String passWord) throws DocumentException, IOException {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
Document document = new Document();
PdfWriter write = PdfWriter.getInstance(document, byteOutputStream);
String userPassword = "老王";
write.setEncryption(userPassword.getBytes(), passWord.getBytes(), PdfWriter.ALLOW_ASSEMBLY, PdfWriter.ENCRYPTION_AES_128);
document.open();
document.add(new Paragraph("ABCDEFG"));
document.close();
write.close();
byteOutputStream.flush();
return byteOutputStream.toByteArray();
}
}

2
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/html/Markup.java

@ -424,7 +424,7 @@ public class Markup {
try {
return WebColors.getRGBColor(s);
}
catch(IllegalArgumentException iae) {
catch(Exception iae) {
return null;
}
}

57
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/html/WebColors.java

@ -260,22 +260,24 @@ public class WebColors extends HashMap {
}
throw new IllegalArgumentException(
"Unknown color format. Must be #RGB or #RRGGBB");
}
else if (name.startsWith("rgb(")) {
} else if (name.startsWith("rgb(")) {
StringTokenizer tok = new StringTokenizer(name, "rgb(), \t\r\n\f");
for (int k = 0; k < 3; ++k) {
String v = tok.nextToken();
if (v.endsWith("%"))
c[k] = Integer.parseInt(v.substring(0, v.length() - 1)) * 255 / 100;
else
c[k] = Integer.parseInt(v);
if (c[k] < 0)
c[k] = 0;
else if (c[k] > 255)
c[k] = 255;
c[k] = parseColorValue(tok.nextToken());
}
return new Color(c[0], c[1], c[2], c[3]);
}
} else if (name.startsWith("rgba(")) {
StringTokenizer tok = new StringTokenizer(name, "rgba(), \t\r\n\f");
for (int k = 0; k < 3; ++k) {
c[k] = parseColorValue(tok.nextToken());
}
try {
c[3] = parseAlphaValue(tok.nextToken());
} catch (Exception e) {
//alpha 值可写可不写
}
return new Color(c[0], c[1], c[2], c[3]);
}
name = name.toLowerCase();
if (!NAMES.containsKey(name))
throw new IllegalArgumentException("Color '" + name
@ -283,4 +285,35 @@ public class WebColors extends HashMap {
c = (int[]) NAMES.get(name);
return new Color(c[0], c[1], c[2], c[3]);
}
/**
* 转化 alpha
* @param v
* @return 0~ 255
*/
public static int parseAlphaValue(String v) {
if (v.endsWith("%")) {
return parseColorValue(v);
}
float r = Float.parseFloat(v) * 255;
if (r < 0)
r = 0;
else if (r > 255)
r = 255;
return (int) r;
}
/**
* 转化 rgb
* @param v
* @return 0~ 255
*/
public static int parseColorValue(String v) {
int r = v.endsWith("%") ? Integer.parseInt(v.substring(0, v.length() - 1)) * 255 / 100 : Integer.parseInt(v);
if (r < 0)
r = 0;
else if (r > 255)
r = 255;
return r;
}
}

3
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/html/simpleparser/FactoryProperties.java

@ -140,6 +140,9 @@ public class FactoryProperties {
if(props.hasProperty("line-height")){
p.setAttribute("line-height", props.getProperty("line-height"));
}
if (props.hasProperty("noexist-attrid")) {
p.setAttribute("noexist-attrid", props.getProperty("noexist-attrid"));
}
for(String margin : HtmlConstants.MARGIN){
if(props.hasPropertyInChain("div", margin)){
String ss = props.getPropertyFromChain("div", margin);

33
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/html/simpleparser/IncCell.java

@ -47,6 +47,7 @@
package com.fr.third.v2.lowagie.text.html.simpleparser;
import com.fr.third.v2.lowagie.text.html.Utils.BackgroundUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@ -117,37 +118,7 @@ public class IncCell implements TextElementArray {
cell.setStyleHeight(CSSUtils.parseFloat(value));
}
//解析background相关属性并保存到cell对象
Map<String, String> backgroundRules = new HashMap<String, String>();
value = props.getProperty("bgcolor");
if (value != null) {
backgroundRules.put("background-color", value);
}
value = props.getLastChainProperty("background-size");
if (value != null) {
backgroundRules.put("background-size", value);
}
value = props.getLastChainProperty("background");
if (value != null) {
Map<String, String> backgroundStyles = CSSUtils.processBackground(value);
backgroundRules.putAll(backgroundStyles);
}
value = props.getLastChainProperty("background-color");
if (value != null) {
backgroundRules.put("background-color", value);
}
value = props.getLastChainProperty("background-position");
if (value != null) {
backgroundRules.put("background-position", value);
}
value = props.getLastChainProperty("background-repeat");
if (value != null) {
backgroundRules.put("background-repeat", value);
}
value = props.getLastChainProperty("background-image");
if (value != null) {
backgroundRules.put("background-image", value);
}
cell.setBackground(backgroundRules);
cell.setBackground(BackgroundUtil.parse2RulesMap(props));
}
public boolean add(Object o) {

21
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/html/simpleparser/IncTable.java

@ -47,6 +47,8 @@
package com.fr.third.v2.lowagie.text.html.simpleparser;
import com.fr.third.v2.lowagie.text.html.HtmlTags;
import com.fr.third.v2.lowagie.text.html.Utils.BackgroundUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@ -174,12 +176,12 @@ public class IncTable {
}
for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) {
ArrayList cols = (ArrayList) rows.get(rowIndex);
for (int colIndex = 0; colIndex < cols.size(); colIndex++) {
int colSpan = 1;
for (int colIndex = 0; colIndex < cols.size(); colIndex+=colSpan) {
PdfPCell pCell = ((PdfPCell) cols.get(colIndex));
int cellCols = pCell.getColspan();
float avgWidth = pCell.getStyleWidth() / cellCols;
for (int i = 0; i < cellCols && colIndex + i < colCount; i++) {
colSpan = pCell.getColspan();
float avgWidth = pCell.getStyleWidth() / colSpan;
for (int i = 0; i < colSpan && colIndex + i < colCount; i++) {
if (relativeColWidths.get(colIndex + i) < avgWidth) {
relativeColWidths.set(colIndex + i, avgWidth);
}
@ -271,6 +273,11 @@ public class IncTable {
if(value != null){
borderStyle.setBorderColor(Markup.decodeColor(value));
}
value = (String) props.get("bordercolor");
if (value != null) {
borderStyle.setBorderColor(Markup.decodeColor(value));
}
value = (String)props.get("border-collapse");
if(value != null){
tableProperties.setCollapse(value.equals("collapse"));
@ -283,6 +290,10 @@ public class IncTable {
if(value != null){
tableProperties.setCellpadding(CSSUtils.parseFloat(value));
}
ChainedProperties properties = new ChainedProperties();
properties.addToChain(HtmlTags.TABLE, props);
//解析background相关属性
tableProperties.setBackground(BackgroundUtil.parse2RulesMap(properties));
return tableProperties;
}
}

370
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/OcspClientBouncyCastle.java

@ -1,185 +1,185 @@
/*
* $Id: OcspClientBouncyCastle.java 3959 2009-06-09 08:31:05Z blowagie $
*
* Copyright 2009 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2009 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
package com.fr.third.v2.lowagie.text.pdf;
import com.fr.third.v2.lowagie.text.ExceptionConverter;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.Vector;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
import org.bouncycastle.asn1.x509.X509Extension;
import org.bouncycastle.asn1.x509.X509Extensions;
import org.bouncycastle.ocsp.BasicOCSPResp;
import org.bouncycastle.ocsp.CertificateID;
import org.bouncycastle.ocsp.CertificateStatus;
import org.bouncycastle.ocsp.OCSPException;
import org.bouncycastle.ocsp.OCSPReq;
import org.bouncycastle.ocsp.OCSPReqGenerator;
import org.bouncycastle.ocsp.OCSPResp;
import org.bouncycastle.ocsp.SingleResp;
/**
* OcspClient implementation using BouncyCastle.
* @author psoares
* @since 2.1.6
*/
public class OcspClientBouncyCastle implements OcspClient {
/** root certificate */
private X509Certificate rootCert;
/** check certificate */
private X509Certificate checkCert;
/** OCSP URL */
private String url;
/**
* Creates an instance of an OcspClient that will be using BouncyCastle.
* @param checkCert the check certificate
* @param rootCert the root certificate
* @param url the OCSP URL
*/
public OcspClientBouncyCastle(X509Certificate checkCert, X509Certificate rootCert, String url) {
this.checkCert = checkCert;
this.rootCert = rootCert;
this.url = url;
}
/**
* Generates an OCSP request using BouncyCastle.
* @param issuerCert certificate of the issues
* @param serialNumber serial number
* @return an OCSP request
* @throws OCSPException
* @throws IOException
*/
private static OCSPReq generateOCSPRequest(X509Certificate issuerCert, BigInteger serialNumber) throws OCSPException, IOException {
//Add provider BC
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
// Generate the id for the certificate we are looking for
CertificateID id = new CertificateID(CertificateID.HASH_SHA1, issuerCert, serialNumber);
// basic request generation with nonce
OCSPReqGenerator gen = new OCSPReqGenerator();
gen.addRequest(id);
// create details for nonce extension
Vector oids = new Vector();
Vector values = new Vector();
oids.add(OCSPObjectIdentifiers.id_pkix_ocsp_nonce);
values.add(new X509Extension(false, new DEROctetString(new DEROctetString(PdfEncryption.createDocumentId()).getEncoded())));
gen.setRequestExtensions(new X509Extensions(oids, values));
return gen.generate();
}
/**
* @return a byte array
* @see OcspClient#getEncoded()
*/
public byte[] getEncoded() {
try {
OCSPReq request = generateOCSPRequest(rootCert, checkCert.getSerialNumber());
byte[] array = request.getEncoded();
URL urlt = new URL(url);
HttpURLConnection con = (HttpURLConnection)urlt.openConnection();
con.setRequestProperty("Content-Type", "application/ocsp-request");
con.setRequestProperty("Accept", "application/ocsp-response");
con.setDoOutput(true);
OutputStream out = con.getOutputStream();
DataOutputStream dataOut = new DataOutputStream(new BufferedOutputStream(out));
dataOut.write(array);
dataOut.flush();
dataOut.close();
if (con.getResponseCode() / 100 != 2) {
throw new IOException("Invalid HTTP response");
}
//Get Response
InputStream in = (InputStream) con.getContent();
OCSPResp ocspResponse = new OCSPResp(in);
if (ocspResponse.getStatus() != 0)
throw new IOException("Invalid status: " + ocspResponse.getStatus());
BasicOCSPResp basicResponse = (BasicOCSPResp) ocspResponse.getResponseObject();
if (basicResponse != null) {
SingleResp[] responses = basicResponse.getResponses();
if (responses.length == 1) {
SingleResp resp = responses[0];
Object status = resp.getCertStatus();
if (status == CertificateStatus.GOOD) {
return basicResponse.getEncoded();
}
else if (status instanceof org.bouncycastle.ocsp.RevokedStatus) {
throw new IOException("OCSP Status is revoked!");
}
else {
throw new IOException("OCSP Status is unknown!");
}
}
}
}
catch (Exception ex) {
throw new ExceptionConverter(ex);
}
return null;
}
}
///*
// * $Id: OcspClientBouncyCastle.java 3959 2009-06-09 08:31:05Z blowagie $
// *
// * Copyright 2009 Paulo Soares
// *
// * The contents of this file are subject to the Mozilla Public License Version 1.1
// * (the "License"); you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at http://www.mozilla.org/MPL/
// *
// * Software distributed under the License is distributed on an "AS IS" basis,
// * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// * for the specific language governing rights and limitations under the License.
// *
// * The Original Code is 'iText, a free JAVA-PDF library'.
// *
// * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
// * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
// * All Rights Reserved.
// * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
// * are Copyright (C) 2009 by Paulo Soares. All Rights Reserved.
// *
// * Contributor(s): all the names of the contributors are added in the source code
// * where applicable.
// *
// * Alternatively, the contents of this file may be used under the terms of the
// * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
// * provisions of LGPL are applicable instead of those above. If you wish to
// * allow use of your version of this file only under the terms of the LGPL
// * License and not to allow others to use your version of this file under
// * the MPL, indicate your decision by deleting the provisions above and
// * replace them with the notice and other provisions required by the LGPL.
// * If you do not delete the provisions above, a recipient may use your version
// * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
// *
// * This library is free software; you can redistribute it and/or modify it
// * under the terms of the MPL as stated above or under the terms of the GNU
// * Library General Public License as published by the Free Software Foundation;
// * either version 2 of the License, or any later version.
// *
// * This library is distributed in the hope that it will be useful, but WITHOUT
// * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
// * details.
// *
// * If you didn't download this code from the following link, you should check if
// * you aren't using an obsolete version:
// * http://www.lowagie.com/iText/
// */
//
//package com.fr.third.v2.lowagie.text.pdf;
//
//import com.fr.third.v2.lowagie.text.ExceptionConverter;
//
//import java.io.BufferedOutputStream;
//import java.io.DataOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.OutputStream;
//import java.math.BigInteger;
//import java.net.HttpURLConnection;
//import java.net.URL;
//import java.security.Security;
//import java.security.cert.X509Certificate;
//import java.util.Vector;
//import org.bouncycastle.asn1.DEROctetString;
//import org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
//import org.bouncycastle.asn1.x509.X509Extension;
//import org.bouncycastle.asn1.x509.X509Extensions;
//import org.bouncycastle.ocsp.BasicOCSPResp;
//import org.bouncycastle.ocsp.CertificateID;
//import org.bouncycastle.ocsp.CertificateStatus;
//import org.bouncycastle.ocsp.OCSPException;
//import org.bouncycastle.ocsp.OCSPReq;
//import org.bouncycastle.ocsp.OCSPReqGenerator;
//import org.bouncycastle.ocsp.OCSPResp;
//import org.bouncycastle.ocsp.SingleResp;
//
///**
// * OcspClient implementation using BouncyCastle.
// * @author psoares
// * @since 2.1.6
// */
//public class OcspClientBouncyCastle implements OcspClient {
// /** root certificate */
// private X509Certificate rootCert;
// /** check certificate */
// private X509Certificate checkCert;
// /** OCSP URL */
// private String url;
//
// /**
// * Creates an instance of an OcspClient that will be using BouncyCastle.
// * @param checkCert the check certificate
// * @param rootCert the root certificate
// * @param url the OCSP URL
// */
// public OcspClientBouncyCastle(X509Certificate checkCert, X509Certificate rootCert, String url) {
// this.checkCert = checkCert;
// this.rootCert = rootCert;
// this.url = url;
// }
//
// /**
// * Generates an OCSP request using BouncyCastle.
// * @param issuerCert certificate of the issues
// * @param serialNumber serial number
// * @return an OCSP request
// * @throws OCSPException
// * @throws IOException
// */
// private static OCSPReq generateOCSPRequest(X509Certificate issuerCert, BigInteger serialNumber) throws OCSPException, IOException {
// //Add provider BC
// Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
//
// // Generate the id for the certificate we are looking for
// CertificateID id = new CertificateID(CertificateID.HASH_SHA1, issuerCert, serialNumber);
//
// // basic request generation with nonce
// OCSPReqGenerator gen = new OCSPReqGenerator();
//
// gen.addRequest(id);
//
// // create details for nonce extension
// Vector oids = new Vector();
// Vector values = new Vector();
//
// oids.add(OCSPObjectIdentifiers.id_pkix_ocsp_nonce);
// values.add(new X509Extension(false, new DEROctetString(new DEROctetString(PdfEncryption.createDocumentId()).getEncoded())));
//
// gen.setRequestExtensions(new X509Extensions(oids, values));
//
// return gen.generate();
// }
//
// /**
// * @return a byte array
// * @see OcspClient#getEncoded()
// */
// public byte[] getEncoded() {
// try {
// OCSPReq request = generateOCSPRequest(rootCert, checkCert.getSerialNumber());
// byte[] array = request.getEncoded();
// URL urlt = new URL(url);
// HttpURLConnection con = (HttpURLConnection)urlt.openConnection();
// con.setRequestProperty("Content-Type", "application/ocsp-request");
// con.setRequestProperty("Accept", "application/ocsp-response");
// con.setDoOutput(true);
// OutputStream out = con.getOutputStream();
// DataOutputStream dataOut = new DataOutputStream(new BufferedOutputStream(out));
// dataOut.write(array);
// dataOut.flush();
// dataOut.close();
// if (con.getResponseCode() / 100 != 2) {
// throw new IOException("Invalid HTTP response");
// }
// //Get Response
// InputStream in = (InputStream) con.getContent();
// OCSPResp ocspResponse = new OCSPResp(in);
//
// if (ocspResponse.getStatus() != 0)
// throw new IOException("Invalid status: " + ocspResponse.getStatus());
// BasicOCSPResp basicResponse = (BasicOCSPResp) ocspResponse.getResponseObject();
// if (basicResponse != null) {
// SingleResp[] responses = basicResponse.getResponses();
// if (responses.length == 1) {
// SingleResp resp = responses[0];
// Object status = resp.getCertStatus();
// if (status == CertificateStatus.GOOD) {
// return basicResponse.getEncoded();
// }
// else if (status instanceof org.bouncycastle.ocsp.RevokedStatus) {
// throw new IOException("OCSP Status is revoked!");
// }
// else {
// throw new IOException("OCSP Status is unknown!");
// }
// }
// }
// }
// catch (Exception ex) {
// throw new ExceptionConverter(ex);
// }
// return null;
// }
//}

2
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/PdfLine.java

@ -177,7 +177,7 @@ public class PdfLine {
if (chunk.isBreakTag()) {
addToLine(chunk);
width = 0;
return null;
return new PdfChunk("", chunk);
}
// we split the chunk to be added

266
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/PdfPKCS7.java

@ -46,6 +46,8 @@
*/
package com.fr.third.v2.lowagie.text.pdf;
import com.fr.third.org.bouncycastle.asn1.ASN1Object;
import com.fr.third.org.bouncycastle.asn1.ASN1String;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
@ -76,42 +78,40 @@ import java.util.Iterator;
import java.util.Set;
import com.fr.third.v2.lowagie.text.ExceptionConverter;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1OutputStream;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.ASN1Set;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.DEREnumerated;
import org.bouncycastle.asn1.DERInteger;
import org.bouncycastle.asn1.DERNull;
import org.bouncycastle.asn1.DERObject;
import org.bouncycastle.asn1.DERObjectIdentifier;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERSet;
import org.bouncycastle.asn1.DERString;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.DERUTCTime;
import org.bouncycastle.asn1.cms.AttributeTable;
import org.bouncycastle.asn1.cms.Attribute;
import org.bouncycastle.asn1.ocsp.BasicOCSPResponse;
import org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
import org.bouncycastle.jce.provider.X509CRLParser;
import org.bouncycastle.jce.provider.X509CertParser;
import com.fr.third.org.bouncycastle.asn1.ASN1Encodable;
import com.fr.third.org.bouncycastle.asn1.ASN1EncodableVector;
import com.fr.third.org.bouncycastle.asn1.ASN1InputStream;
import com.fr.third.org.bouncycastle.asn1.ASN1OutputStream;
import com.fr.third.org.bouncycastle.asn1.ASN1Sequence;
import com.fr.third.org.bouncycastle.asn1.ASN1Set;
import com.fr.third.org.bouncycastle.asn1.ASN1TaggedObject;
import com.fr.third.org.bouncycastle.asn1.DEREnumerated;
import com.fr.third.org.bouncycastle.asn1.DERInteger;
import com.fr.third.org.bouncycastle.asn1.DERNull;
import com.fr.third.org.bouncycastle.asn1.DERObjectIdentifier;
import com.fr.third.org.bouncycastle.asn1.DEROctetString;
import com.fr.third.org.bouncycastle.asn1.DERSequence;
import com.fr.third.org.bouncycastle.asn1.DERSet;
import com.fr.third.org.bouncycastle.asn1.DERTaggedObject;
import com.fr.third.org.bouncycastle.asn1.DERUTCTime;
import com.fr.third.org.bouncycastle.asn1.cms.AttributeTable;
import com.fr.third.org.bouncycastle.asn1.cms.Attribute;
import com.fr.third.org.bouncycastle.asn1.ocsp.BasicOCSPResponse;
import com.fr.third.org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
import com.fr.third.org.bouncycastle.jce.provider.X509CRLParser;
import com.fr.third.org.bouncycastle.jce.provider.X509CertParser;
import java.security.cert.CertificateParsingException;
import java.util.Date;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.tsp.MessageImprint;
import org.bouncycastle.asn1.x509.X509Extensions;
import org.bouncycastle.ocsp.BasicOCSPResp;
import org.bouncycastle.ocsp.CertificateID;
import org.bouncycastle.ocsp.SingleResp;
import org.bouncycastle.tsp.TimeStampToken;
import com.fr.third.org.bouncycastle.asn1.ASN1OctetString;
import com.fr.third.org.bouncycastle.asn1.cms.ContentInfo;
import com.fr.third.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import com.fr.third.org.bouncycastle.asn1.tsp.MessageImprint;
import com.fr.third.org.bouncycastle.asn1.x509.X509Extensions;
//import org.bouncycastle.ocsp.BasicOCSPResp;
//import org.bouncycastle.ocsp.CertificateID;
//import org.bouncycastle.ocsp.SingleResp;
//import org.bouncycastle.tsp.TimeStampToken;
/**
* This class does all the processing related to signing and verifying a PKCS#7
@ -167,7 +167,7 @@ public class PdfPKCS7 {
*/
private String signName;
private TimeStampToken timeStampToken;
// private TimeStampToken timeStampToken;
private static final HashMap digestNames = new HashMap();
private static final HashMap algorithmNames = new HashMap();
@ -273,23 +273,23 @@ public class PdfPKCS7 {
* @return the timestamp token or null
* @since 2.1.6
*/
public TimeStampToken getTimeStampToken() {
return timeStampToken;
}
// public TimeStampToken getTimeStampToken() {
// return timeStampToken;
// }
/**
* Gets the timestamp date
* @return a date
* @since 2.1.6
*/
public Calendar getTimeStampDate() {
if (timeStampToken == null)
return null;
Calendar cal = new GregorianCalendar();
Date date = timeStampToken.getTimeStampInfo().getGenTime();
cal.setTime(date);
return cal;
}
// public Calendar getTimeStampDate() {
// if (timeStampToken == null)
// return null;
// Calendar cal = new GregorianCalendar();
// Date date = timeStampToken.getTimeStampInfo().getGenTime();
// cal.setTime(date);
// return cal;
// }
/**
* Verifies a signature using the sub-filter adbe.x509.rsa_sha1.
@ -319,19 +319,19 @@ public class PdfPKCS7 {
}
}
private BasicOCSPResp basicResp;
// private BasicOCSPResp basicResp;
/**
* Gets the OCSP basic response if there is one.
* @return the OCSP basic response or null
* @since 2.1.6
*/
public BasicOCSPResp getOcsp() {
return basicResp;
}
// public BasicOCSPResp getOcsp() {
// return basicResp;
// }
private void findOcsp(ASN1Sequence seq) throws IOException {
basicResp = null;
// basicResp = null;
boolean ret = false;
while (true) {
if ((seq.getObjectAt(0) instanceof DERObjectIdentifier)
@ -362,7 +362,7 @@ public class PdfPKCS7 {
DEROctetString os = (DEROctetString)seq.getObjectAt(1);
ASN1InputStream inp = new ASN1InputStream(os.getOctets());
BasicOCSPResponse resp = BasicOCSPResponse.getInstance(inp.readObject());
basicResp = new BasicOCSPResp(resp);
// basicResp = new BasicOCSPResp(resp);
}
/**
@ -379,7 +379,7 @@ public class PdfPKCS7 {
//
// Basic checks to make sure it's a PKCS#7 SignedData Object
//
DERObject pkcs;
ASN1Object pkcs;
try {
pkcs = din.readObject();
@ -464,7 +464,7 @@ public class PdfPKCS7 {
if (signerInfo.getObjectAt(next) instanceof ASN1TaggedObject) {
ASN1TaggedObject tagsig = (ASN1TaggedObject)signerInfo.getObjectAt(next);
ASN1Set sseq = ASN1Set.getInstance(tagsig, false);
sigAttr = sseq.getEncoded(ASN1Encodable.DER);
sigAttr = sseq.getEncoded("DER");
for (int k = 0; k < sseq.size(); ++k) {
ASN1Sequence seq2 = (ASN1Sequence)sseq.getObjectAt(k);
@ -499,7 +499,7 @@ public class PdfPKCS7 {
ASN1Set attributeValues = ts.getAttrValues();
ASN1Sequence tokenSequence = ASN1Sequence.getInstance(attributeValues.getObjectAt(0));
ContentInfo contentInfo = new ContentInfo(tokenSequence);
this.timeStampToken = new TimeStampToken(contentInfo);
// this.timeStampToken = new TimeStampToken(contentInfo);
}
}
if (RSAdata != null || digestAttr != null) {
@ -641,15 +641,15 @@ public class PdfPKCS7 {
* @return true if it checks false otherwise
* @since 2.1.6
*/
public boolean verifyTimestampImprint() throws NoSuchAlgorithmException {
if (timeStampToken == null)
return false;
MessageImprint imprint = timeStampToken.getTimeStampInfo().toTSTInfo().getMessageImprint();
byte[] md = MessageDigest.getInstance("SHA-1").digest(digest);
byte[] imphashed = imprint.getHashedMessage();
boolean res = Arrays.equals(md, imphashed);
return res;
}
// public boolean verifyTimestampImprint() throws NoSuchAlgorithmException {
// if (timeStampToken == null)
// return false;
// MessageImprint imprint = timeStampToken.getTimeStampInfo().toTSTInfo().getMessageImprint();
// byte[] md = MessageDigest.getInstance("SHA-1").digest(digest);
// byte[] imphashed = imprint.getHashedMessage();
// boolean res = Arrays.equals(md, imphashed);
// return res;
// }
/**
* Get all the X.509 certificates associated with this PKCS#7 object in no particular order.
@ -888,27 +888,27 @@ public class PdfPKCS7 {
* @return <CODE>true</CODE> is a certificate was found
* @since 2.1.6
*/
public static boolean verifyOcspCertificates(BasicOCSPResp ocsp, KeyStore keystore, String provider) {
if (provider == null)
provider = "BC";
try {
for (Enumeration aliases = keystore.aliases(); aliases.hasMoreElements();) {
try {
String alias = (String)aliases.nextElement();
if (!keystore.isCertificateEntry(alias))
continue;
X509Certificate certStoreX509 = (X509Certificate)keystore.getCertificate(alias);
if (ocsp.verify(certStoreX509.getPublicKey(), provider))
return true;
}
catch (Exception ex) {
}
}
}
catch (Exception e) {
}
return false;
}
// public static boolean verifyOcspCertificates(BasicOCSPResp ocsp, KeyStore keystore, String provider) {
// if (provider == null)
// provider = "BC";
// try {
// for (Enumeration aliases = keystore.aliases(); aliases.hasMoreElements();) {
// try {
// String alias = (String)aliases.nextElement();
// if (!keystore.isCertificateEntry(alias))
// continue;
// X509Certificate certStoreX509 = (X509Certificate)keystore.getCertificate(alias);
// if (ocsp.verify(certStoreX509.getPublicKey(), provider))
// return true;
// }
// catch (Exception ex) {
// }
// }
// }
// catch (Exception e) {
// }
// return false;
// }
/**
* Verifies a timestamp against a KeyStore.
@ -918,27 +918,27 @@ public class PdfPKCS7 {
* @return <CODE>true</CODE> is a certificate was found
* @since 2.1.6
*/
public static boolean verifyTimestampCertificates(TimeStampToken ts, KeyStore keystore, String provider) {
if (provider == null)
provider = "BC";
try {
for (Enumeration aliases = keystore.aliases(); aliases.hasMoreElements();) {
try {
String alias = (String)aliases.nextElement();
if (!keystore.isCertificateEntry(alias))
continue;
X509Certificate certStoreX509 = (X509Certificate)keystore.getCertificate(alias);
ts.validate(certStoreX509, provider);
return true;
}
catch (Exception ex) {
}
}
}
catch (Exception e) {
}
return false;
}
// public static boolean verifyTimestampCertificates(TimeStampToken ts, KeyStore keystore, String provider) {
// if (provider == null)
// provider = "BC";
// try {
// for (Enumeration aliases = keystore.aliases(); aliases.hasMoreElements();) {
// try {
// String alias = (String)aliases.nextElement();
// if (!keystore.isCertificateEntry(alias))
// continue;
// X509Certificate certStoreX509 = (X509Certificate)keystore.getCertificate(alias);
// ts.validate(certStoreX509, provider);
// return true;
// }
// catch (Exception ex) {
// }
// }
// }
// catch (Exception e) {
// }
// return false;
// }
/**
* Retrieves the OCSP URL from the given certificate.
@ -949,7 +949,7 @@ public class PdfPKCS7 {
*/
public static String getOCSPURL(X509Certificate certificate) throws CertificateParsingException {
try {
DERObject obj = getExtensionValue(certificate, X509Extensions.AuthorityInfoAccess.getId());
ASN1Object obj = getExtensionValue(certificate, X509Extensions.AuthorityInfoAccess.getId());
if (obj == null) {
return null;
}
@ -961,7 +961,7 @@ public class PdfPKCS7 {
continue;
} else {
if ((AccessDescription.getObjectAt(0) instanceof DERObjectIdentifier) && ((DERObjectIdentifier)AccessDescription.getObjectAt(0)).getId().equals("1.3.6.1.5.5.7.48.1")) {
String AccessLocation = getStringFromGeneralName((DERObject)AccessDescription.getObjectAt(1));
String AccessLocation = getStringFromGeneralName((ASN1Object)AccessDescription.getObjectAt(1));
if ( AccessLocation == null ) {
return "" ;
} else {
@ -980,26 +980,26 @@ public class PdfPKCS7 {
* @return true if it checks false otherwise
* @since 2.1.6
*/
public boolean isRevocationValid() {
if (basicResp == null)
return false;
if (signCerts.size() < 2)
return false;
try {
X509Certificate[] cs = (X509Certificate[])getSignCertificateChain();
SingleResp sr = basicResp.getResponses()[0];
CertificateID cid = sr.getCertID();
X509Certificate sigcer = getSigningCertificate();
X509Certificate isscer = cs[1];
CertificateID tis = new CertificateID(CertificateID.HASH_SHA1, isscer, sigcer.getSerialNumber());
return tis.equals(cid);
}
catch (Exception ex) {
}
return false;
}
// public boolean isRevocationValid() {
// if (basicResp == null)
// return false;
// if (signCerts.size() < 2)
// return false;
// try {
// X509Certificate[] cs = (X509Certificate[])getSignCertificateChain();
// SingleResp sr = basicResp.getResponses()[0];
// CertificateID cid = sr.getCertID();
// X509Certificate sigcer = getSigningCertificate();
// X509Certificate isscer = cs[1];
// CertificateID tis = new CertificateID(CertificateID.HASH_SHA1, isscer, sigcer.getSerialNumber());
// return tis.equals(cid);
// }
// catch (Exception ex) {
// }
// return false;
// }
private static DERObject getExtensionValue(X509Certificate cert, String oid) throws IOException {
private static ASN1Object getExtensionValue(X509Certificate cert, String oid) throws IOException {
byte[] bytes = cert.getExtensionValue(oid);
if (bytes == null) {
return null;
@ -1010,7 +1010,7 @@ public class PdfPKCS7 {
return aIn.readObject();
}
private static String getStringFromGeneralName(DERObject names) throws IOException {
private static String getStringFromGeneralName(ASN1Object names) throws IOException {
DERTaggedObject taggedObject = (DERTaggedObject) names ;
return new String(ASN1OctetString.getInstance(taggedObject, false).getOctets(), "ISO-8859-1");
}
@ -1020,11 +1020,11 @@ public class PdfPKCS7 {
* @param enc a TBSCertificate in a byte array
* @return a DERObject
*/
private static DERObject getIssuer(byte[] enc) {
private static ASN1Object getIssuer(byte[] enc) {
try {
ASN1InputStream in = new ASN1InputStream(new ByteArrayInputStream(enc));
ASN1Sequence seq = (ASN1Sequence)in.readObject();
return (DERObject)seq.getObjectAt(seq.getObjectAt(0) instanceof DERTaggedObject ? 3 : 2);
return (ASN1Object)seq.getObjectAt(seq.getObjectAt(0) instanceof DERTaggedObject ? 3 : 2);
}
catch (IOException e) {
throw new ExceptionConverter(e);
@ -1036,11 +1036,11 @@ public class PdfPKCS7 {
* @param enc A TBSCertificate in a byte array
* @return a DERObject
*/
private static DERObject getSubject(byte[] enc) {
private static ASN1Object getSubject(byte[] enc) {
try {
ASN1InputStream in = new ASN1InputStream(new ByteArrayInputStream(enc));
ASN1Sequence seq = (ASN1Sequence)in.readObject();
return (DERObject)seq.getObjectAt(seq.getObjectAt(0) instanceof DERTaggedObject ? 5 : 4);
return (ASN1Object)seq.getObjectAt(seq.getObjectAt(0) instanceof DERTaggedObject ? 5 : 4);
}
catch (IOException e) {
throw new ExceptionConverter(e);
@ -1340,7 +1340,7 @@ public class PdfPKCS7 {
*/
public byte[] getAuthenticatedAttributeBytes(byte secondDigest[], Calendar signingTime, byte[] ocsp) {
try {
return getAuthenticatedAttributeSet(secondDigest, signingTime, ocsp).getEncoded(ASN1Encodable.DER);
return getAuthenticatedAttributeSet(secondDigest, signingTime, ocsp).getEncoded("DER");
}
catch (Exception e) {
throw new ExceptionConverter(e);
@ -1575,7 +1575,7 @@ public class PdfPKCS7 {
vs = new ArrayList();
values.put(id, vs);
}
vs.add(((DERString)s.getObjectAt(1)).getString());
vs.add(((ASN1String)s.getObjectAt(1)).getString());
}
}
}

6
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/PdfPTable.java

@ -350,8 +350,7 @@ public class PdfPTable implements LargeElement {
return;
float total = 0;
int numCols = getNumberOfColumns();
BorderStyle borderStyle = tableProperties.getBorderStyle();
float borderWidth = tableProperties.isCollapse() ? borderStyle.getBorderWidth() / 2 : borderStyle.getBorderWidth();
float borderWidth = tableProperties.getBorderWidth();
float cellspacing = tableProperties.getCellspacing();
float cellpadding = tableProperties.getCellpadding();
for (int k = 0; k < numCols; ++k)
@ -435,8 +434,7 @@ public class PdfPTable implements LargeElement {
if (totalWidth <= 0)
return 0;
totalHeight = 0;
BorderStyle borderStyle = tableProperties.getBorderStyle();
float borderWidth = tableProperties.isCollapse() ? borderStyle.getBorderWidth() / 2 : borderStyle.getBorderWidth();
float borderWidth = tableProperties.getBorderWidth();
float cellspacing = tableProperties.getCellspacing();
float cellpadding = tableProperties.getCellpadding();
for (int k = 0; k < rows.size(); ++k) {

45
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/PdfPublicKeySecurityHandler.java

@ -89,6 +89,8 @@
package com.fr.third.v2.lowagie.text.pdf;
import com.fr.third.org.bouncycastle.asn1.ASN1Object;
import com.fr.third.org.bouncycastle.asn1.ASN1Set;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@ -107,22 +109,21 @@ import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.DERObject;
import org.bouncycastle.asn1.DERObjectIdentifier;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DEROutputStream;
import org.bouncycastle.asn1.DERSet;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.asn1.cms.EncryptedContentInfo;
import org.bouncycastle.asn1.cms.EnvelopedData;
import org.bouncycastle.asn1.cms.IssuerAndSerialNumber;
import org.bouncycastle.asn1.cms.KeyTransRecipientInfo;
import org.bouncycastle.asn1.cms.RecipientIdentifier;
import org.bouncycastle.asn1.cms.RecipientInfo;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.x509.TBSCertificateStructure;
import com.fr.third.org.bouncycastle.asn1.ASN1InputStream;
import com.fr.third.org.bouncycastle.asn1.DERObjectIdentifier;
import com.fr.third.org.bouncycastle.asn1.DEROctetString;
import com.fr.third.org.bouncycastle.asn1.DEROutputStream;
import com.fr.third.org.bouncycastle.asn1.DERSet;
import com.fr.third.org.bouncycastle.asn1.cms.ContentInfo;
import com.fr.third.org.bouncycastle.asn1.cms.EncryptedContentInfo;
import com.fr.third.org.bouncycastle.asn1.cms.EnvelopedData;
import com.fr.third.org.bouncycastle.asn1.cms.IssuerAndSerialNumber;
import com.fr.third.org.bouncycastle.asn1.cms.KeyTransRecipientInfo;
import com.fr.third.org.bouncycastle.asn1.cms.RecipientIdentifier;
import com.fr.third.org.bouncycastle.asn1.cms.RecipientInfo;
import com.fr.third.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import com.fr.third.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import com.fr.third.org.bouncycastle.asn1.x509.TBSCertificateStructure;
/**
* @author Aiken Sam (aikensam@ieee.org)
@ -244,7 +245,7 @@ public class PdfPublicKeySecurityHandler {
pkcs7input[22] = two;
pkcs7input[23] = one;
DERObject obj = createDERForRecipient(pkcs7input, (X509Certificate)certificate);
ASN1Object obj = createDERForRecipient(pkcs7input, (X509Certificate)certificate);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
@ -276,7 +277,7 @@ public class PdfPublicKeySecurityHandler {
return EncodedRecipients;
}
private DERObject createDERForRecipient(byte[] in, X509Certificate cert)
private ASN1Object createDERForRecipient(byte[] in, X509Certificate cert)
throws IOException,
GeneralSecurityException
{
@ -287,7 +288,7 @@ public class PdfPublicKeySecurityHandler {
AlgorithmParameters algorithmparameters = algorithmparametergenerator.generateParameters();
ByteArrayInputStream bytearrayinputstream = new ByteArrayInputStream(algorithmparameters.getEncoded("ASN.1"));
ASN1InputStream asn1inputstream = new ASN1InputStream(bytearrayinputstream);
DERObject derobject = asn1inputstream.readObject();
ASN1Object derobject = asn1inputstream.readObject();
KeyGenerator keygenerator = KeyGenerator.getInstance(s);
keygenerator.init(128);
SecretKey secretkey = keygenerator.generateKey();
@ -300,10 +301,10 @@ public class PdfPublicKeySecurityHandler {
AlgorithmIdentifier algorithmidentifier = new AlgorithmIdentifier(new DERObjectIdentifier(s), derobject);
EncryptedContentInfo encryptedcontentinfo =
new EncryptedContentInfo(PKCSObjectIdentifiers.data, algorithmidentifier, deroctetstring);
EnvelopedData env = new EnvelopedData(null, derset, encryptedcontentinfo, null);
EnvelopedData env = new EnvelopedData(null, derset, encryptedcontentinfo,(ASN1Set) null);
ContentInfo contentinfo =
new ContentInfo(PKCSObjectIdentifiers.envelopedData, env);
return contentinfo.getDERObject();
return contentinfo.getContentType();
}
private KeyTransRecipientInfo computeRecipientInfo(X509Certificate x509certificate, byte[] abyte0)
@ -318,7 +319,7 @@ public class PdfPublicKeySecurityHandler {
new IssuerAndSerialNumber(
tbscertificatestructure.getIssuer(),
tbscertificatestructure.getSerialNumber().getValue());
Cipher cipher = Cipher.getInstance(algorithmidentifier.getObjectId().getId());
Cipher cipher = Cipher.getInstance(algorithmidentifier.getAlgorithm().getId());
cipher.init(1, x509certificate);
DEROctetString deroctetstring = new DEROctetString(cipher.doFinal(abyte0));
RecipientIdentifier recipId = new RecipientIdentifier(issuerandserialnumber);

40
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/PdfReader.java

@ -79,8 +79,8 @@ import com.fr.third.v2.lowagie.text.pdf.interfaces.PdfViewerPreferences;
import com.fr.third.v2.lowagie.text.pdf.internal.PdfViewerPreferencesImp;
import com.fr.third.v2.lowagie.text.exceptions.BadPasswordException;
import org.bouncycastle.cms.CMSEnvelopedData;
import org.bouncycastle.cms.RecipientInformation;
//import org.bouncycastle.cms.CMSEnvelopedData;
//import org.bouncycastle.cms.RecipientInformation;
/** Reads a PDF document.
* @author Paulo Soares (psoares@consiste.pt)
@ -710,24 +710,24 @@ public class PdfReader implements PdfViewerPreferences {
PdfObject recipient = recipients.getPdfObject(i);
strings.remove(recipient);
CMSEnvelopedData data = null;
try {
data = new CMSEnvelopedData(recipient.getBytes());
Iterator recipientCertificatesIt = data.getRecipientInfos().getRecipients().iterator();
while (recipientCertificatesIt.hasNext()) {
RecipientInformation recipientInfo = (RecipientInformation)recipientCertificatesIt.next();
if (recipientInfo.getRID().match(certificate) && !foundRecipient) {
envelopedData = recipientInfo.getContent(certificateKey, certificateKeyProvider);
foundRecipient = true;
}
}
}
catch (Exception f) {
throw new ExceptionConverter(f);
}
// CMSEnvelopedData data = null;
// try {
// data = new CMSEnvelopedData(recipient.getBytes());
//
// Iterator recipientCertificatesIt = data.getRecipientInfos().getRecipients().iterator();
//
// while (recipientCertificatesIt.hasNext()) {
// RecipientInformation recipientInfo = (RecipientInformation)recipientCertificatesIt.next();
//
// if (recipientInfo.getRID().match(certificate) && !foundRecipient) {
// envelopedData = recipientInfo.getContent(certificateKey, certificateKeyProvider);
// foundRecipient = true;
// }
// }
// }
// catch (Exception f) {
// throw new ExceptionConverter(f);
// }
}
if(!foundRecipient || envelopedData == null) {

460
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/TSAClientBouncyCastle.java

@ -1,230 +1,230 @@
/*
* $Id: TSAClientBouncyCastle.java 3973 2009-06-16 10:30:31Z psoares33 $
*
* Copyright 2009 Martin Brunecky, Aiken Sam
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2009 by Martin Brunecky. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
package com.fr.third.v2.lowagie.text.pdf;
import java.io.*;
import java.math.*;
import java.net.*;
import org.bouncycastle.asn1.cmp.*;
import org.bouncycastle.asn1.x509.*;
import org.bouncycastle.tsp.*;
import com.fr.third.v2.lowagie.text.pdf.codec.Base64;
/**
* Time Stamp Authority Client interface implementation using Bouncy Castle
* org.bouncycastle.tsp package.
* <p>
* Created by Aiken Sam, 2006-11-15, refactored by Martin Brunecky, 07/15/2007
* for ease of subclassing.
* </p>
* @since 2.1.6
*/
public class TSAClientBouncyCastle implements TSAClient {
/** URL of the Time Stamp Authority */
protected String tsaURL;
/** TSA Username */
protected String tsaUsername;
/** TSA password */
protected String tsaPassword;
/** Estimate of the received time stamp token */
protected int tokSzEstimate;
/**
* Creates an instance of a TSAClient that will use BouncyCastle.
* @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
*/
public TSAClientBouncyCastle(String url) {
this(url, null, null, 4096);
}
/**
* Creates an instance of a TSAClient that will use BouncyCastle.
* @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
* @param username String - user(account) name
* @param password String - password
*/
public TSAClientBouncyCastle(String url, String username, String password) {
this(url, username, password, 4096);
}
/**
* Constructor.
* Note the token size estimate is updated by each call, as the token
* size is not likely to change (as long as we call the same TSA using
* the same imprint length).
* @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
* @param username String - user(account) name
* @param password String - password
* @param tokSzEstimate int - estimated size of received time stamp token (DER encoded)
*/
public TSAClientBouncyCastle(String url, String username, String password, int tokSzEstimate) {
this.tsaURL = url;
this.tsaUsername = username;
this.tsaPassword = password;
this.tokSzEstimate = tokSzEstimate;
}
/**
* Get the token size estimate.
* Returned value reflects the result of the last succesfull call, padded
* @return an estimate of the token size
*/
public int getTokenSizeEstimate() {
return tokSzEstimate;
}
/**
* Get RFC 3161 timeStampToken.
* Method may return null indicating that timestamp should be skipped.
* @param caller PdfPKCS7 - calling PdfPKCS7 instance (in case caller needs it)
* @param imprint byte[] - data imprint to be time-stamped
* @return byte[] - encoded, TSA signed data of the timeStampToken
* @throws Exception - TSA request failed
* @see TSAClient#getTimeStampToken(PdfPKCS7, byte[])
*/
public byte[] getTimeStampToken(PdfPKCS7 caller, byte[] imprint) throws Exception {
return getTimeStampToken(imprint);
}
/**
* Get timestamp token - Bouncy Castle request encoding / decoding layer
*/
protected byte[] getTimeStampToken(byte[] imprint) throws Exception {
byte[] respBytes = null;
try {
// Setup the time stamp request
TimeStampRequestGenerator tsqGenerator = new TimeStampRequestGenerator();
tsqGenerator.setCertReq(true);
// tsqGenerator.setReqPolicy("1.3.6.1.4.1.601.10.3.1");
BigInteger nonce = BigInteger.valueOf(System.currentTimeMillis());
TimeStampRequest request = tsqGenerator.generate(X509ObjectIdentifiers.id_SHA1.getId() , imprint, nonce);
byte[] requestBytes = request.getEncoded();
// Call the communications layer
respBytes = getTSAResponse(requestBytes);
// Handle the TSA response
TimeStampResponse response = new TimeStampResponse(respBytes);
// validate communication level attributes (RFC 3161 PKIStatus)
response.validate(request);
PKIFailureInfo failure = response.getFailInfo();
int value = (failure == null) ? 0 : failure.intValue();
if (value != 0) {
// @todo: Translate value of 15 error codes defined by PKIFailureInfo to string
throw new Exception("Invalid TSA '" + tsaURL + "' response, code " + value);
}
// @todo: validate the time stap certificate chain (if we want
// assure we do not sign using an invalid timestamp).
// extract just the time stamp token (removes communication status info)
TimeStampToken tsToken = response.getTimeStampToken();
if (tsToken == null) {
throw new Exception("TSA '" + tsaURL + "' failed to return time stamp token: " + response.getStatusString());
}
TimeStampTokenInfo info = tsToken.getTimeStampInfo(); // to view details
byte[] encoded = tsToken.getEncoded();
long stop = System.currentTimeMillis();
// Update our token size estimate for the next call (padded to be safe)
this.tokSzEstimate = encoded.length + 32;
return encoded;
} catch (Exception e) {
throw e;
} catch (Throwable t) {
throw new Exception("Failed to get TSA response from '" + tsaURL +"'", t);
}
}
/**
* Get timestamp token - communications layer
* @return - byte[] - TSA response, raw bytes (RFC 3161 encoded)
*/
protected byte[] getTSAResponse(byte[] requestBytes) throws Exception {
// Setup the TSA connection
URL url = new URL(tsaURL);
URLConnection tsaConnection;
tsaConnection = (URLConnection) url.openConnection();
tsaConnection.setDoInput(true);
tsaConnection.setDoOutput(true);
tsaConnection.setUseCaches(false);
tsaConnection.setRequestProperty("Content-Type", "application/timestamp-query");
//tsaConnection.setRequestProperty("Content-Transfer-Encoding", "base64");
tsaConnection.setRequestProperty("Content-Transfer-Encoding", "binary");
if ((tsaUsername != null) && !tsaUsername.equals("") ) {
String userPassword = tsaUsername + ":" + tsaPassword;
tsaConnection.setRequestProperty("Authorization", "Basic " +
new String(Base64.encodeBytes(userPassword.getBytes())));
}
OutputStream out = tsaConnection.getOutputStream();
out.write(requestBytes);
out.close();
// Get TSA response as a byte array
InputStream inp = tsaConnection.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = inp.read(buffer, 0, buffer.length)) >= 0) {
baos.write(buffer, 0, bytesRead);
}
byte[] respBytes = baos.toByteArray();
String encoding = tsaConnection.getContentEncoding();
if (encoding != null && encoding.equalsIgnoreCase("base64")) {
respBytes = Base64.decode(new String(respBytes));
}
return respBytes;
}
}
///*
// * $Id: TSAClientBouncyCastle.java 3973 2009-06-16 10:30:31Z psoares33 $
// *
// * Copyright 2009 Martin Brunecky, Aiken Sam
// *
// * The contents of this file are subject to the Mozilla Public License Version 1.1
// * (the "License"); you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at http://www.mozilla.org/MPL/
// *
// * Software distributed under the License is distributed on an "AS IS" basis,
// * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// * for the specific language governing rights and limitations under the License.
// *
// * The Original Code is 'iText, a free JAVA-PDF library'.
// *
// * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
// * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
// * All Rights Reserved.
// * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
// * are Copyright (C) 2009 by Martin Brunecky. All Rights Reserved.
// *
// * Contributor(s): all the names of the contributors are added in the source code
// * where applicable.
// *
// * Alternatively, the contents of this file may be used under the terms of the
// * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
// * provisions of LGPL are applicable instead of those above. If you wish to
// * allow use of your version of this file only under the terms of the LGPL
// * License and not to allow others to use your version of this file under
// * the MPL, indicate your decision by deleting the provisions above and
// * replace them with the notice and other provisions required by the LGPL.
// * If you do not delete the provisions above, a recipient may use your version
// * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
// *
// * This library is free software; you can redistribute it and/or modify it
// * under the terms of the MPL as stated above or under the terms of the GNU
// * Library General Public License as published by the Free Software Foundation;
// * either version 2 of the License, or any later version.
// *
// * This library is distributed in the hope that it will be useful, but WITHOUT
// * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
// * details.
// *
// * If you didn't download this code from the following link, you should check if
// * you aren't using an obsolete version:
// * http://www.lowagie.com/iText/
// */
//
//package com.fr.third.v2.lowagie.text.pdf;
//
//import java.io.*;
//import java.math.*;
//import java.net.*;
//
//import org.bouncycastle.asn1.cmp.*;
//import org.bouncycastle.asn1.x509.*;
//import org.bouncycastle.tsp.*;
//
//import com.fr.third.v2.lowagie.text.pdf.codec.Base64;
//
///**
// * Time Stamp Authority Client interface implementation using Bouncy Castle
// * org.bouncycastle.tsp package.
// * <p>
// * Created by Aiken Sam, 2006-11-15, refactored by Martin Brunecky, 07/15/2007
// * for ease of subclassing.
// * </p>
// * @since 2.1.6
// */
//public class TSAClientBouncyCastle implements TSAClient {
// /** URL of the Time Stamp Authority */
// protected String tsaURL;
// /** TSA Username */
// protected String tsaUsername;
// /** TSA password */
// protected String tsaPassword;
// /** Estimate of the received time stamp token */
// protected int tokSzEstimate;
//
// /**
// * Creates an instance of a TSAClient that will use BouncyCastle.
// * @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
// */
// public TSAClientBouncyCastle(String url) {
// this(url, null, null, 4096);
// }
//
// /**
// * Creates an instance of a TSAClient that will use BouncyCastle.
// * @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
// * @param username String - user(account) name
// * @param password String - password
// */
// public TSAClientBouncyCastle(String url, String username, String password) {
// this(url, username, password, 4096);
// }
//
// /**
// * Constructor.
// * Note the token size estimate is updated by each call, as the token
// * size is not likely to change (as long as we call the same TSA using
// * the same imprint length).
// * @param url String - Time Stamp Authority URL (i.e. "http://tsatest1.digistamp.com/TSA")
// * @param username String - user(account) name
// * @param password String - password
// * @param tokSzEstimate int - estimated size of received time stamp token (DER encoded)
// */
// public TSAClientBouncyCastle(String url, String username, String password, int tokSzEstimate) {
// this.tsaURL = url;
// this.tsaUsername = username;
// this.tsaPassword = password;
// this.tokSzEstimate = tokSzEstimate;
// }
//
// /**
// * Get the token size estimate.
// * Returned value reflects the result of the last succesfull call, padded
// * @return an estimate of the token size
// */
// public int getTokenSizeEstimate() {
// return tokSzEstimate;
// }
//
// /**
// * Get RFC 3161 timeStampToken.
// * Method may return null indicating that timestamp should be skipped.
// * @param caller PdfPKCS7 - calling PdfPKCS7 instance (in case caller needs it)
// * @param imprint byte[] - data imprint to be time-stamped
// * @return byte[] - encoded, TSA signed data of the timeStampToken
// * @throws Exception - TSA request failed
// * @see TSAClient#getTimeStampToken(PdfPKCS7, byte[])
// */
// public byte[] getTimeStampToken(PdfPKCS7 caller, byte[] imprint) throws Exception {
// return getTimeStampToken(imprint);
// }
//
// /**
// * Get timestamp token - Bouncy Castle request encoding / decoding layer
// */
// protected byte[] getTimeStampToken(byte[] imprint) throws Exception {
// byte[] respBytes = null;
// try {
// // Setup the time stamp request
// TimeStampRequestGenerator tsqGenerator = new TimeStampRequestGenerator();
// tsqGenerator.setCertReq(true);
// // tsqGenerator.setReqPolicy("1.3.6.1.4.1.601.10.3.1");
// BigInteger nonce = BigInteger.valueOf(System.currentTimeMillis());
// TimeStampRequest request = tsqGenerator.generate(X509ObjectIdentifiers.id_SHA1.getId() , imprint, nonce);
// byte[] requestBytes = request.getEncoded();
//
// // Call the communications layer
// respBytes = getTSAResponse(requestBytes);
//
// // Handle the TSA response
// TimeStampResponse response = new TimeStampResponse(respBytes);
//
// // validate communication level attributes (RFC 3161 PKIStatus)
// response.validate(request);
// PKIFailureInfo failure = response.getFailInfo();
// int value = (failure == null) ? 0 : failure.intValue();
// if (value != 0) {
// // @todo: Translate value of 15 error codes defined by PKIFailureInfo to string
// throw new Exception("Invalid TSA '" + tsaURL + "' response, code " + value);
// }
// // @todo: validate the time stap certificate chain (if we want
// // assure we do not sign using an invalid timestamp).
//
// // extract just the time stamp token (removes communication status info)
// TimeStampToken tsToken = response.getTimeStampToken();
// if (tsToken == null) {
// throw new Exception("TSA '" + tsaURL + "' failed to return time stamp token: " + response.getStatusString());
// }
// TimeStampTokenInfo info = tsToken.getTimeStampInfo(); // to view details
// byte[] encoded = tsToken.getEncoded();
// long stop = System.currentTimeMillis();
//
// // Update our token size estimate for the next call (padded to be safe)
// this.tokSzEstimate = encoded.length + 32;
// return encoded;
// } catch (Exception e) {
// throw e;
// } catch (Throwable t) {
// throw new Exception("Failed to get TSA response from '" + tsaURL +"'", t);
// }
// }
//
// /**
// * Get timestamp token - communications layer
// * @return - byte[] - TSA response, raw bytes (RFC 3161 encoded)
// */
// protected byte[] getTSAResponse(byte[] requestBytes) throws Exception {
// // Setup the TSA connection
// URL url = new URL(tsaURL);
// URLConnection tsaConnection;
// tsaConnection = (URLConnection) url.openConnection();
//
// tsaConnection.setDoInput(true);
// tsaConnection.setDoOutput(true);
// tsaConnection.setUseCaches(false);
// tsaConnection.setRequestProperty("Content-Type", "application/timestamp-query");
// //tsaConnection.setRequestProperty("Content-Transfer-Encoding", "base64");
// tsaConnection.setRequestProperty("Content-Transfer-Encoding", "binary");
//
// if ((tsaUsername != null) && !tsaUsername.equals("") ) {
// String userPassword = tsaUsername + ":" + tsaPassword;
// tsaConnection.setRequestProperty("Authorization", "Basic " +
// new String(Base64.encodeBytes(userPassword.getBytes())));
// }
// OutputStream out = tsaConnection.getOutputStream();
// out.write(requestBytes);
// out.close();
//
// // Get TSA response as a byte array
// InputStream inp = tsaConnection.getInputStream();
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// byte[] buffer = new byte[1024];
// int bytesRead = 0;
// while ((bytesRead = inp.read(buffer, 0, buffer.length)) >= 0) {
// baos.write(buffer, 0, bytesRead);
// }
// byte[] respBytes = baos.toByteArray();
//
// String encoding = tsaConnection.getContentEncoding();
// if (encoding != null && encoding.equalsIgnoreCase("base64")) {
// respBytes = Base64.decode(new String(respBytes));
// }
// return respBytes;
// }
//}

15
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/TableProperties.java

@ -1,5 +1,7 @@
package com.fr.third.v2.lowagie.text.pdf;
import java.util.Map;
/**
* 描述table的属性类
* 包括cellspacingcellpaddingborder等
@ -9,11 +11,16 @@ public class TableProperties {
private float cellspacing = 2.0f;
private float cellpadding = 1.0f;
private boolean collapse = false;
public Map<String, String> background;
public BorderStyle getBorderStyle() {
return borderStyle;
}
public float getBorderWidth() {
return 0 == getCellspacing() ? borderStyle.getBorderWidth() / 2 : borderStyle.getBorderWidth();
}
public void setBorderStyle(BorderStyle borderStyle) {
this.borderStyle = borderStyle;
}
@ -42,6 +49,14 @@ public class TableProperties {
this.collapse = collapse;
}
public Map<String, String> getBackground() {
return background;
}
public void setBackground(Map<String, String> background) {
this.background = background;
}
public String toHtmlString(){
StringBuffer sb = new StringBuffer();
if(!isCollapse()){

12
fine-itext/src/main/java/com/fr/third/v2/lowagie/text/pdf/crypto/AESCipher.java

@ -48,12 +48,12 @@
*/
package com.fr.third.v2.lowagie.text.pdf.crypto;
import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.engines.AESFastEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;
import com.fr.third.org.bouncycastle.crypto.BlockCipher;
import com.fr.third.org.bouncycastle.crypto.engines.AESFastEngine;
import com.fr.third.org.bouncycastle.crypto.modes.CBCBlockCipher;
import com.fr.third.org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import com.fr.third.org.bouncycastle.crypto.params.KeyParameter;
import com.fr.third.org.bouncycastle.crypto.params.ParametersWithIV;
/**
* Creates an AES Cipher with CBC and padding PKCS5/7.

1989
fine-jedis/src/main/java/com/fr/third/redis/clients/jedis/JedisCluster.java

File diff suppressed because it is too large Load Diff

187
fine-jedis/src/main/java/com/fr/third/redis/clients/jedis/JedisPubSub.java

@ -1,187 +0,0 @@
package com.fr.third.redis.clients.jedis;
import static com.fr.third.redis.clients.jedis.Protocol.Keyword.MESSAGE;
import static com.fr.third.redis.clients.jedis.Protocol.Keyword.PMESSAGE;
import static com.fr.third.redis.clients.jedis.Protocol.Keyword.PSUBSCRIBE;
import static com.fr.third.redis.clients.jedis.Protocol.Keyword.PUNSUBSCRIBE;
import static com.fr.third.redis.clients.jedis.Protocol.Keyword.SUBSCRIBE;
import static com.fr.third.redis.clients.jedis.Protocol.Keyword.UNSUBSCRIBE;
import static com.fr.third.redis.clients.jedis.Protocol.Keyword.PONG;
import java.util.Arrays;
import java.util.List;
import com.fr.third.redis.clients.jedis.exceptions.JedisConnectionException;
import com.fr.third.redis.clients.jedis.exceptions.JedisException;
import com.fr.third.redis.clients.jedis.util.SafeEncoder;
public abstract class JedisPubSub {
private static final String JEDIS_SUBSCRIPTION_MESSAGE = "JedisPubSub is not subscribed to a Jedis instance.";
private int subscribedChannels = 0;
private volatile Client client;
public JedisPubSub() {
}
public JedisPubSub(Client client) {
this.client = client;
}
public void onMessage(String channel, String message) {
}
public void onPMessage(String pattern, String channel, String message) {
}
public void onSubscribe(String channel, int subscribedChannels) {
}
public void onUnsubscribe(String channel, int subscribedChannels) {
}
public void onPUnsubscribe(String pattern, int subscribedChannels) {
}
public void onPSubscribe(String pattern, int subscribedChannels) {
}
public void onPong(String pattern) {
}
public void unsubscribe() {
if (client == null) {
throw new JedisConnectionException(JEDIS_SUBSCRIPTION_MESSAGE);
}
client.unsubscribe();
client.flush();
}
public void unsubscribe(String... channels) {
if (client == null) {
throw new JedisConnectionException(JEDIS_SUBSCRIPTION_MESSAGE);
}
client.unsubscribe(channels);
client.flush();
}
public void subscribe(String... channels) {
if (client == null) {
throw new JedisConnectionException(JEDIS_SUBSCRIPTION_MESSAGE);
}
client.subscribe(channels);
client.flush();
}
public void psubscribe(String... patterns) {
if (client == null) {
throw new JedisConnectionException(JEDIS_SUBSCRIPTION_MESSAGE);
}
client.psubscribe(patterns);
client.flush();
}
public void punsubscribe() {
if (client == null) {
throw new JedisConnectionException(JEDIS_SUBSCRIPTION_MESSAGE);
}
client.punsubscribe();
client.flush();
}
public void punsubscribe(String... patterns) {
if (client == null) {
throw new JedisConnectionException(JEDIS_SUBSCRIPTION_MESSAGE);
}
client.punsubscribe(patterns);
client.flush();
}
public void ping() {
if (client == null) {
throw new JedisConnectionException(JEDIS_SUBSCRIPTION_MESSAGE);
}
client.ping();
client.flush();
}
public boolean isSubscribed() {
return subscribedChannels > 0;
}
public void proceedWithPatterns(Client client, String... patterns) {
this.client = client;
client.psubscribe(patterns);
client.flush();
process(client);
}
public void proceed(Client client, String... channels) {
this.client = client;
client.subscribe(channels);
client.flush();
process(client);
}
private void process(Client client) {
do {
List<Object> reply = client.getRawObjectMultiBulkReply();
final Object firstObj = reply.get(0);
if (!(firstObj instanceof byte[])) {
throw new JedisException("Unknown message type: " + firstObj);
}
final byte[] resp = (byte[]) firstObj;
if (Arrays.equals(SUBSCRIBE.raw, resp)) {
subscribedChannels = ((Long) reply.get(2)).intValue();
final byte[] bchannel = (byte[]) reply.get(1);
final String strchannel = (bchannel == null) ? null : SafeEncoder.encode(bchannel);
onSubscribe(strchannel, subscribedChannels);
} else if (Arrays.equals(UNSUBSCRIBE.raw, resp)) {
subscribedChannels = ((Long) reply.get(2)).intValue();
final byte[] bchannel = (byte[]) reply.get(1);
final String strchannel = (bchannel == null) ? null : SafeEncoder.encode(bchannel);
onUnsubscribe(strchannel, subscribedChannels);
} else if (Arrays.equals(MESSAGE.raw, resp)) {
final byte[] bchannel = (byte[]) reply.get(1);
final byte[] bmesg = (byte[]) reply.get(2);
final String strchannel = (bchannel == null) ? null : SafeEncoder.encode(bchannel);
final String strmesg = (bmesg == null) ? null : SafeEncoder.encode(bmesg);
onMessage(strchannel, strmesg);
} else if (Arrays.equals(PMESSAGE.raw, resp)) {
final byte[] bpattern = (byte[]) reply.get(1);
final byte[] bchannel = (byte[]) reply.get(2);
final byte[] bmesg = (byte[]) reply.get(3);
final String strpattern = (bpattern == null) ? null : SafeEncoder.encode(bpattern);
final String strchannel = (bchannel == null) ? null : SafeEncoder.encode(bchannel);
final String strmesg = (bmesg == null) ? null : SafeEncoder.encode(bmesg);
onPMessage(strpattern, strchannel, strmesg);
} else if (Arrays.equals(PSUBSCRIBE.raw, resp)) {
subscribedChannels = ((Long) reply.get(2)).intValue();
final byte[] bpattern = (byte[]) reply.get(1);
final String strpattern = (bpattern == null) ? null : SafeEncoder.encode(bpattern);
onPSubscribe(strpattern, subscribedChannels);
} else if (Arrays.equals(PUNSUBSCRIBE.raw, resp)) {
subscribedChannels = ((Long) reply.get(2)).intValue();
final byte[] bpattern = (byte[]) reply.get(1);
final String strpattern = (bpattern == null) ? null : SafeEncoder.encode(bpattern);
onPUnsubscribe(strpattern, subscribedChannels);
} else if (Arrays.equals(PONG.raw, resp)) {
final byte[] bpattern = (byte[]) reply.get(1);
final String strpattern = (bpattern == null) ? null : SafeEncoder.encode(bpattern);
onPong(strpattern);
} else {
throw new JedisException("Unknown message type: " + firstObj);
}
} while (isSubscribed());
/* Invalidate instance since this thread is no longer listening */
this.client = null;
}
public int getSubscribedChannels() {
return subscribedChannels;
}
}

3
fine-poi/src/main/java/com/fr/third/v2/org/apache/poi/util/TempFile.java

@ -93,7 +93,8 @@ public final class TempFile {
@Override
public File createTempFile(String prefix, String suffix) throws IOException {
// Identify and create our temp dir, if needed
if (dir == null)
// 这里判断下路径是否存在,省的再排查temp目录丢失的问题
if (dir == null || !dir.exists())
{
dir = new File(System.getProperty("java.io.tmpdir"), "poifiles");
dir.mkdir();

4
fine-socketio/src/main/java/com/fr/third/socketio/protocol/JacksonJsonSupport.java

@ -26,6 +26,7 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import com.fr.third.socketio.AckCallback;
import com.fr.third.socketio.MultiTypeAckCallback;
@ -324,6 +325,9 @@ public class JacksonJsonSupport implements JsonSupport {
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN, true);
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
//时区设置,防止含有Data类型变量时序列化后,前台显示的data内时间不准确
objectMapper.setTimeZone(TimeZone.getDefault());
}
@Override

6
fine-third-default/fine-sjsxp/src/main/java/com/fr/third/javax/xml/stream/XMLEntityManager.java

@ -443,7 +443,7 @@ public class XMLEntityManager implements XMLComponent, XMLEntityResolver {
} // setEntityHandler(XMLEntityHandler)
//this function returns StaxXMLInputSource
public StaxXMLInputSource resolveEntityAsPerStax(XMLResourceIdentifier resourceIdentifier) throws java.io.IOException{
public StaxXMLInputSource resolveEntityAsPerStax(XMLResourceIdentifier resourceIdentifier) throws IOException{
if(resourceIdentifier == null ) return null;
@ -976,8 +976,8 @@ public class XMLEntityManager implements XMLComponent, XMLEntityResolver {
fEntityStack.removeAllElements();
fCurrentEntity = null;
fValidation = false;
fExternalGeneralEntities = true;
fExternalParameterEntities = true;
fExternalGeneralEntities = false;
fExternalParameterEntities = false;
fAllowJavaEncodings = true ;
//test();

Loading…
Cancel
Save