This is an automated email from the ASF dual-hosted git repository. matthiasblaesing pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/netbeans.git
commit d92aeb8b2d667c635cf90a675134a5b1754357c2 Author: Matthias Bläsing <[email protected]> AuthorDate: Sun Nov 17 14:33:21 2019 +0100 Include message digest into generate update center (SHA-512) --- .../org/netbeans/nbbuild/MakeUpdateDesc.java | 92 +++++++++++++++++++++- 1 file changed, 90 insertions(+), 2 deletions(-) diff --git a/nbbuild/antsrc/org/netbeans/nbbuild/MakeUpdateDesc.java b/nbbuild/antsrc/org/netbeans/nbbuild/MakeUpdateDesc.java index 825ffba..90a30e0 100644 --- a/nbbuild/antsrc/org/netbeans/nbbuild/MakeUpdateDesc.java +++ b/nbbuild/antsrc/org/netbeans/nbbuild/MakeUpdateDesc.java @@ -28,6 +28,7 @@ import org.apache.tools.ant.taskdefs.MatchingTask; import org.apache.tools.ant.DirectoryScanner; import java.io.File; import java.io.FileFilter; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -36,17 +37,22 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.nio.file.Files; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.text.Collator; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map.Entry; import java.util.Properties; import java.util.StringTokenizer; import java.util.TimeZone; @@ -55,8 +61,11 @@ import java.util.TreeSet; import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Path; @@ -105,6 +114,19 @@ public class MakeUpdateDesc extends MatchingTask { private List<Group> groups = new ArrayList<>(); private List<FileSet> filesets = new ArrayList<>(); + private List<String> includeMessageDigests = Arrays.asList("SHA-512"); + + public String getIncludeMessageDigests() { + return includeMessageDigests.stream().collect(Collectors.joining(" ")); + } + + public void setIncludeMessageDigests(String includeMessageDigests) { + if(includeMessageDigests == null) { + includeMessageDigests = ""; + } + this.includeMessageDigests = Arrays.asList(includeMessageDigests.split(" ")); + } + private File desc; /** Description file to create. */ @@ -301,7 +323,9 @@ public class MakeUpdateDesc extends MatchingTask { } File desc_ent = new File(ent_name); desc_ent.delete(); - if (isPreferredUpdateDefined || (contentDescription != null && ! contentDescription.isEmpty())) { + if (includeMessageDigests != null && (! includeMessageDigests.isEmpty())) { + pw.println("<!DOCTYPE module_updates PUBLIC \"-//NetBeans//DTD Autoupdate Catalog 2.8//EN\" \"http://www.netbeans.org/dtds/autoupdate-catalog-2_8.dtd\" ["); + } else if (isPreferredUpdateDefined || (contentDescription != null && ! contentDescription.isEmpty())) { pw.println("<!DOCTYPE module_updates PUBLIC \"-//NetBeans//DTD Autoupdate Catalog 2.7//EN\" \"http://www.netbeans.org/dtds/autoupdate-catalog-2_7.dtd\" ["); } else if (useLicenseUrl) { pw.println("<!DOCTYPE module_updates PUBLIC \"-//NetBeans//DTD Autoupdate Catalog 2.6//EN\" \"http://www.netbeans.org/dtds/autoupdate-catalog-2_6.dtd\" ["); @@ -339,7 +363,9 @@ public class MakeUpdateDesc extends MatchingTask { pw.println (); } else { - if (isPreferredUpdateDefined || (contentDescription != null && ! contentDescription.isEmpty())) { + if (includeMessageDigests != null && (! includeMessageDigests.isEmpty())) { + pw.println("<!DOCTYPE module_updates PUBLIC \"-//NetBeans//DTD Autoupdate Catalog 2.8//EN\" \"http://www.netbeans.org/dtds/autoupdate-catalog-2_8.dtd\">"); + } else if (isPreferredUpdateDefined || (contentDescription != null && ! contentDescription.isEmpty())) { pw.println("<!DOCTYPE module_updates PUBLIC \"-//NetBeans//DTD Autoupdate Catalog 2.7//EN\" \"http://www.netbeans.org/dtds/autoupdate-catalog-2_7.dtd\">"); } else if (useLicenseUrl) { pw.println("<!DOCTYPE module_updates PUBLIC \"-//NetBeans//DTD Autoupdate Catalog 2.6//EN\" \"http://www.netbeans.org/dtds/autoupdate-catalog-2_6.dtd\">"); @@ -642,6 +668,15 @@ public class MakeUpdateDesc extends MatchingTask { } } } + + Map<String,String> messageDigests = createMessageDigests(n_file); + for(Entry<String,String> messageDigest: messageDigests.entrySet()) { + Element messageDigestElement = m.xml.getOwnerDocument().createElement("message_digest"); + messageDigestElement.setAttribute("algorithm", messageDigest.getKey()); + messageDigestElement.setAttribute("value", messageDigest.getValue()); + m.xml.appendChild(messageDigestElement); + } + moduleCollection.add(m); } } catch (BuildException x) { @@ -882,4 +917,57 @@ public class MakeUpdateDesc extends MatchingTask { return sb; } + private Map<String,String> createMessageDigests(File targetFile) { + if(includeMessageDigests.isEmpty()) { + return Collections.<String,String>emptyMap(); + } + + Map<String,MessageDigest> digests = new HashMap<>(includeMessageDigests.size()); + + for(String messageDigest: includeMessageDigests) { + try { + digests.put(messageDigest, MessageDigest.getInstance(messageDigest)); + } catch (NoSuchAlgorithmException ex) { + throw new BuildException("Failed to load requested messageDigest: " + messageDigest, ex); + } + } + + try(FileInputStream fis = new FileInputStream(targetFile)) { + byte[] buffer = new byte[102400]; + int read; + while((read = fis.read(buffer)) >= 0) { + for(MessageDigest md: digests.values()) { + md.update(buffer, 0, read); + } + } + } catch (IOException ex) { + Logger.getLogger(MakeUpdateDesc.class.getName()).log(Level.SEVERE, null, ex); + } + + Map<String,String> result = new HashMap<>(); + for(Entry<String,MessageDigest> md: digests.entrySet()) { + result.put(md.getKey(), hexEncode(md.getValue().digest())); + } + return result; + } + + private static String hexEncode(byte[] input) { + StringBuilder sb = new StringBuilder(input.length * 2); + for(byte b: input) { + sb.append(Character.forDigit((b & 0xF0) >> 4, 16)); + sb.append(Character.forDigit((b & 0x0F), 16)); + } + return sb.toString(); + } + + private static byte[] hexDecode(String input) { + int length = input.length() / 2; + byte[] result = new byte[length]; + for(int i = 0; i < length; i++) { + int b = Character.digit(input.charAt(i * 2), 16) << 4; + b |= Character.digit(input.charAt(i * 2 + 1), 16); + result[i] = (byte) (b & 0xFF); + } + return result; + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected] For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists
