]> source.dussan.org Git - poi.git/commitdiff
Add some additional rules for the forbidden-apis-check borrowed from Elasticsearch...
authorDominik Stadler <centic@apache.org>
Wed, 2 Dec 2015 21:47:52 +0000 (21:47 +0000)
committerDominik Stadler <centic@apache.org>
Wed, 2 Dec 2015 21:47:52 +0000 (21:47 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1717689 13f79535-47bb-0310-9956-ffa450edef68

build.xml
src/ooxml/java/org/apache/poi/poifs/crypt/dsig/SignatureInfo.java
src/ooxml/java/org/apache/poi/poifs/crypt/dsig/services/TSPTimeStampService.java
src/resources/devtools/forbidden-signatures-prod.txt [new file with mode: 0644]
src/resources/devtools/forbidden-signatures.txt

index 54a10b60fdf335cb65f8569e544d9720b3e066f0..a031db96f25cc91211cb9547fd58804ea18a151f 100644 (file)
--- a/build.xml
+++ b/build.xml
@@ -1811,6 +1811,8 @@ under the License.
         <taskdef name="forbiddenapis" 
                  classname="de.thetaphi.forbiddenapis.ant.AntTask" 
                  classpath="${forbidden.jar}"/>
+
+        <!-- first check rules that apply to all the source code -->
         <forbiddenapis 
                  internalRuntimeForbidden="true" 
                  classpathref="forbiddenapis.classpath"
@@ -1838,6 +1840,20 @@ under the License.
             <fileset dir="${excelant.output.test.dir}"/>
             -->
         </forbiddenapis>
+
+        <!-- then check some advanced rules which we only apply to the core code and not tests or examples -->
+        <forbiddenapis 
+                 internalRuntimeForbidden="true" 
+                 classpathref="forbiddenapis.classpath"
+                 suppressAnnotation="org.apache.poi.util.SuppressForbidden"
+            >
+            <signaturesFileset file="src/resources/devtools/forbidden-signatures-prod.txt"/>
+            <!-- sources -->
+            <fileset dir="${main.output.dir}"/>
+            <fileset dir="${ooxml.output.dir}"/>
+            <fileset dir="${scratchpad.output.dir}"/>
+            <fileset dir="${excelant.output.dir}"/>
+        </forbiddenapis>
     </target>
 
     <target name="findbugs">
index 9646ba07ad613b75b25df82740f64cfe6c3e4174..10174d54d8c5d955823bebf65fd441a35aef741e 100644 (file)
@@ -659,9 +659,9 @@ public class SignatureInfo implements SignatureConfigurable {
      * @param other the reference to wrap, if null\r
      * @return if other is null, an empty lists is returned, otherwise other is returned\r
      */\r
-    @SuppressWarnings("unchecked")\r
     private static <T> List<T> safe(List<T> other) {\r
-        return other == null ? Collections.EMPTY_LIST : other;\r
+        List<T> emptyList = Collections.emptyList();\r
+        return other == null ? emptyList : other;\r
     }\r
 \r
     private void brokenJvmWorkaround(XMLSignContext context) {\r
index 06054c0576857b4172c3f8b4e675af19b56a6588..05ebd4975e364ef4ad772fe8f7c3e1888ed0bd56 100644 (file)
@@ -29,6 +29,7 @@ import java.io.IOException;
 import java.io.OutputStream;\r
 import java.math.BigInteger;\r
 import java.net.HttpURLConnection;\r
+import java.net.InetAddress;\r
 import java.net.InetSocketAddress;\r
 import java.net.Proxy;\r
 import java.net.URL;\r
@@ -121,7 +122,7 @@ public class TSPTimeStampService implements TimeStampService {
             URL proxyUrl = new URL(signatureConfig.getProxyUrl());\r
             String host = proxyUrl.getHost();\r
             int port = proxyUrl.getPort();\r
-            proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, (port == -1 ? 80 : port)));\r
+            proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(InetAddress.getByName(host), (port == -1 ? 80 : port)));\r
         }\r
         \r
         HttpURLConnection huc = (HttpURLConnection)new URL(signatureConfig.getTspUrl()).openConnection(proxy);\r
diff --git a/src/resources/devtools/forbidden-signatures-prod.txt b/src/resources/devtools/forbidden-signatures-prod.txt
new file mode 100644 (file)
index 0000000..3dd98b2
--- /dev/null
@@ -0,0 +1,29 @@
+# (C) Copyright Uwe Schindler (Generics Policeman) and others.
+# Parts of this work are licensed to the Apache Software Foundation (ASF)
+# under one or more contributor license agreements.
+#
+# Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This file contains API signatures which are specific to POI.
+# The goal is to minimize implicit defaults
+
+@defaultMessage POI forbidden APIs which are tolerated in non-production code, e.g. in tests and examples
+
+# We have applications which use this to return error codes on invalid commandline parameters...
+#@defaultMessage Please do not terminate the application
+#java.lang.System#exit(int)
+#java.lang.Runtime#exit(int)
+#java.lang.Runtime#halt(int)
+
+@defaultMessage Please do not try to stop the world
+java.lang.System#gc()
index 1a506f3ffd8503744bf5098613113ee0c46b9f1f..481c9b83f92ba5213c540d9a1b6abb71f2a52b9a 100644 (file)
@@ -32,3 +32,84 @@ java.lang.reflect.AccessibleObject#setAccessible(boolean) @ Reflection usage fai
 \r
 java.text.DecimalFormatSymbols#DecimalFormatSymbols() @ use DecimalFormatSymbols.getInstance()\r
 java.text.DecimalFormatSymbols#DecimalFormatSymbols(Locale) @ use DecimalFormatSymbols.getInstance()\r
+\r
+# the following are taken from the Elasticsearch source at https://github.com/elastic/elasticsearch/tree/master/buildSrc/src/main/resources/forbidden\r
+\r
+@defaultMessage Convert to URI\r
+java.net.URL#getPath()\r
+java.net.URL#getFile()\r
+\r
+@defaultMessage Usage of getLocalHost is discouraged\r
+java.net.InetAddress#getLocalHost()\r
+\r
+@defaultMessage Specify a location for the temp file/directory instead.\r
+java.nio.file.Files#createTempDirectory(java.lang.String,java.nio.file.attribute.FileAttribute[])\r
+java.nio.file.Files#createTempFile(java.lang.String,java.lang.String,java.nio.file.attribute.FileAttribute[])\r
+\r
+@defaultMessage Specify a location for the temp file/directory instead.\r
+java.nio.file.Files#createTempDirectory(java.lang.String,java.nio.file.attribute.FileAttribute[])\r
+java.nio.file.Files#createTempFile(java.lang.String,java.lang.String,java.nio.file.attribute.FileAttribute[])\r
+\r
+@defaultMessage Don't use java serialization - this can break BWC without noticing it\r
+java.io.ObjectOutputStream\r
+java.io.ObjectOutput\r
+java.io.ObjectInputStream\r
+java.io.ObjectInput\r
+\r
+@defaultMessage Resolve hosts explicitly to the address(es) you want with InetAddress.\r
+java.net.InetSocketAddress#<init>(java.lang.String,int)\r
+java.net.Socket#<init>(java.lang.String,int)\r
+java.net.Socket#<init>(java.lang.String,int,java.net.InetAddress,int)\r
+\r
+@defaultMessage Don't bind to wildcard addresses. Be specific.\r
+java.net.DatagramSocket#<init>()\r
+java.net.DatagramSocket#<init>(int)\r
+java.net.InetSocketAddress#<init>(int)\r
+java.net.MulticastSocket#<init>()\r
+java.net.MulticastSocket#<init>(int)\r
+java.net.ServerSocket#<init>(int)\r
+java.net.ServerSocket#<init>(int,int)\r
+\r
+@defaultMessage use NetworkAddress format/formatAddress to print IP or IP+ports\r
+java.net.InetAddress#toString()\r
+java.net.InetAddress#getHostAddress()\r
+java.net.Inet4Address#getHostAddress()\r
+java.net.Inet6Address#getHostAddress()\r
+java.net.InetSocketAddress#toString()\r
+\r
+@defaultMessage avoid DNS lookups by accident: if you have a valid reason, then @SuppressWarnings with that reason so its completely clear\r
+java.net.InetAddress#getHostName()\r
+java.net.InetAddress#getCanonicalHostName()\r
+\r
+java.net.InetSocketAddress#getHostName() @ Use getHostString() instead, which avoids a DNS lookup\r
+\r
+@defaultMessage this method needs special permission\r
+java.lang.Thread#getAllStackTraces()\r
+\r
+@defaultMessage Avoid unchecked warnings by using Collections#empty(List|Map|Set) methods\r
+java.util.Collections#EMPTY_LIST\r
+java.util.Collections#EMPTY_MAP\r
+java.util.Collections#EMPTY_SET\r
+\r
+\r
+@defaultMessage spawns threads with vague names; use a custom thread factory and name threads so that you can tell (by its name) which executor it is associated with\r
+java.util.concurrent.Executors#newFixedThreadPool(int)\r
+java.util.concurrent.Executors#newSingleThreadExecutor()\r
+java.util.concurrent.Executors#newCachedThreadPool()\r
+java.util.concurrent.Executors#newSingleThreadScheduledExecutor()\r
+java.util.concurrent.Executors#newScheduledThreadPool(int)\r
+java.util.concurrent.Executors#defaultThreadFactory()\r
+java.util.concurrent.Executors#privilegedThreadFactory()\r
+\r
+java.lang.Character#codePointBefore(char[],int) @ Implicit start offset is error-prone when the char[] is a buffer and the first chars are random chars\r
+java.lang.Character#codePointAt(char[],int) @ Implicit end offset is error-prone when the char[] is a buffer and the last chars are random chars\r
+\r
+@defaultMessage Only use wait / notify when really needed try to use concurrency primitives, latches or callbacks instead.\r
+java.lang.Object#wait()\r
+java.lang.Object#wait(long)\r
+java.lang.Object#wait(long,int)\r
+java.lang.Object#notify()\r
+java.lang.Object#notifyAll()\r
+\r
+@defaultMessage Don't interrupt threads use FutureUtils#cancel(Future<T>) instead\r
+java.util.concurrent.Future#cancel(boolean)\r