Updated Branches: refs/heads/0.1.5 66c804e88 -> 8b85fcfc5
Removed license from application Project: http://git-wip-us.apache.org/repos/asf/incubator-blur/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-blur/commit/cd2eb3d0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-blur/tree/cd2eb3d0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-blur/diff/cd2eb3d0 Branch: refs/heads/0.1.5 Commit: cd2eb3d056a4042acc5f370ceff7478fb3d1b820 Parents: 40ac54d Author: Chris Rohr <[email protected]> Authored: Sun May 5 11:31:33 2013 -0400 Committer: Chris Rohr <[email protected]> Committed: Sun May 5 11:31:33 2013 -0400 ---------------------------------------------------------------------- blur-admin/app/assets/stylesheets/navigation.scss | 12 - .../app/controllers/application_controller.rb | 6 +- blur-admin/app/helpers/license_helper.rb | 34 -- blur-admin/app/views/layouts/application.html.haml | 9 +- .../migrate/20130505151503_drop_licenses_table.rb | 16 + blur-admin/db/schema.rb | 11 +- .../main/java/com/nearinfinity/agent/Agent.java | 12 - .../com/nearinfinity/license/AgentLicense.java | 278 --------------- .../nearinfinity/license/utils/CryptoServices.java | 161 --------- .../license/utils/CryptoServicesException.java | 21 -- .../com/nearinfinity/license/utils/IssuingKey.java | 31 -- .../com/nearinfinity/license/AgentLicenseTest.java | 89 ----- etc/agent.config.sample | 3 - 13 files changed, 20 insertions(+), 663 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-admin/app/assets/stylesheets/navigation.scss ---------------------------------------------------------------------- diff --git a/blur-admin/app/assets/stylesheets/navigation.scss b/blur-admin/app/assets/stylesheets/navigation.scss index 6529310..ced80ef 100644 --- a/blur-admin/app/assets/stylesheets/navigation.scss +++ b/blur-admin/app/assets/stylesheets/navigation.scss @@ -73,19 +73,7 @@ $nav-height: 40px; @include box-shadow(0 1px 0 lighten($footer-color, 10%) inset); text-align: right; z-index: 99; - &.expiring_license { - background-color: $red-state-color; - color: $grey-color; - p, p a { - color: $grey-color; - } - } - #license { - float: left; - margin-top: 15px; - margin-left: 50px; - } #company-info { float: right; margin-top: 15px; http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-admin/app/controllers/application_controller.rb ---------------------------------------------------------------------- diff --git a/blur-admin/app/controllers/application_controller.rb b/blur-admin/app/controllers/application_controller.rb index d4214a1..89f0464 100644 --- a/blur-admin/app/controllers/application_controller.rb +++ b/blur-admin/app/controllers/application_controller.rb @@ -8,7 +8,7 @@ class ApplicationController < ActionController::Base require 'thrift/blur' require 'blur_thrift_client' - helper_method :license, :current_user + helper_method :current_user enable_authorization do |exception| if current_user @@ -33,10 +33,6 @@ class ApplicationController < ActionController::Base end end - def license - @license ||= License.first - end - # Populates the @current_zookeeper instance variable def current_zookeeper # Find the zookeeper with the given or the stored session id http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-admin/app/helpers/license_helper.rb ---------------------------------------------------------------------- diff --git a/blur-admin/app/helpers/license_helper.rb b/blur-admin/app/helpers/license_helper.rb deleted file mode 100644 index b6070c9..0000000 --- a/blur-admin/app/helpers/license_helper.rb +++ /dev/null @@ -1,34 +0,0 @@ -module LicenseHelper - def license_text(license) - if license - days_left_in_license = (license.expires_date - Date.today).to_i - text = "Licensed to: #{license.org} on #{license.issued_date.strftime('%d %b %Y')}." - if days_left_in_license < 0 - text << " License is expired." - elsif days_left_in_license == 0 - text << " License expires today." - elsif days_left_in_license < 30 - text << " License expires in #{pluralize(days_left_in_license, 'day')}." - end - - if license.node_overage > 0 - text << " There #{pluralize_no_count(license.node_overage, 'is')} currently #{pluralize(license.node_overage, 'node')} over the licensed amount." - if license.grace_period_days_remain < 0 - text << " Please contact Near Infinity to upgrade the license." - else - text << " #{pluralize(license.grace_period_days_remain, 'day')} left until a new license is needed." - end - end - if license.cluster_overage > 0 - text << " There #{pluralize_no_count(license.cluster_overage, 'is')} currently #{pluralize(license.cluster_overage, 'cluster')} over the licensed amount. Please contact Near Infinity to upgrade the license." - end - text - else - "No valid license found." - end - end - - def footer_class(license) - (license.nil? || (license.expires_date - Date.today).to_i < 30 || license.cluster_overage > 0) && 'expiring_license' - end -end \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-admin/app/views/layouts/application.html.haml ---------------------------------------------------------------------- diff --git a/blur-admin/app/views/layouts/application.html.haml b/blur-admin/app/views/layouts/application.html.haml index 42011c5..d78b0c8 100644 --- a/blur-admin/app/views/layouts/application.html.haml +++ b/blur-admin/app/views/layouts/application.html.haml @@ -75,15 +75,10 @@ .alert.alert-error{:class=>type}= message -else .alert.alert-info{:class=>type}= message - #ft{:class => footer_class(license)} - #license - %p - = license_text(license) + #ft #company-info %p - if !@current_user.nil? - %a#page-help{:href => ''} Help | - Developed by - %a{:href => "http://www.nearinfinity.com"} Near Infinity + %a#page-help{:href => ''} Help | Version 1.4.2 #help-menu{:style => 'display: none', "data-controller" => params[:controller], "data-action" => params[:action]} http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-admin/db/migrate/20130505151503_drop_licenses_table.rb ---------------------------------------------------------------------- diff --git a/blur-admin/db/migrate/20130505151503_drop_licenses_table.rb b/blur-admin/db/migrate/20130505151503_drop_licenses_table.rb new file mode 100644 index 0000000..7659f14 --- /dev/null +++ b/blur-admin/db/migrate/20130505151503_drop_licenses_table.rb @@ -0,0 +1,16 @@ +class DropLicensesTable < ActiveRecord::Migration + def up + drop_table :licenses + end + + def down + create_table "licenses", :id => false, :force => true do |t| + t.string "org" + t.date "issued_date" + t.date "expires_date" + t.integer "node_overage" + t.integer "grace_period_days_remain" + t.integer "cluster_overage" + end + end +end http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-admin/db/schema.rb ---------------------------------------------------------------------- diff --git a/blur-admin/db/schema.rb b/blur-admin/db/schema.rb index 41eba90..c8de443 100644 --- a/blur-admin/db/schema.rb +++ b/blur-admin/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20130106191159) do +ActiveRecord::Schema.define(:version => 20130505151503) do create_table "admin_settings", :force => true do |t| t.string "setting", :null => false @@ -129,15 +129,6 @@ ActiveRecord::Schema.define(:version => 20130106191159) do add_index "hdfs_stats", ["hdfs_id"], :name => "index_hdfs_stats_on_hdfs_id" - create_table "licenses", :id => false, :force => true do |t| - t.string "org" - t.date "issued_date" - t.date "expires_date" - t.integer "node_overage" - t.integer "grace_period_days_remain" - t.integer "cluster_overage" - end - create_table "preferences", :force => true do |t| t.string "name" t.string "pref_type" http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-agent/src/main/java/com/nearinfinity/agent/Agent.java ---------------------------------------------------------------------- diff --git a/blur-agent/src/main/java/com/nearinfinity/agent/Agent.java b/blur-agent/src/main/java/com/nearinfinity/agent/Agent.java index 1509872..2c8e253 100644 --- a/blur-agent/src/main/java/com/nearinfinity/agent/Agent.java +++ b/blur-agent/src/main/java/com/nearinfinity/agent/Agent.java @@ -28,10 +28,7 @@ import com.nearinfinity.agent.connections.cleaners.CleanerDatabaseConnection; import com.nearinfinity.agent.connections.hdfs.HdfsDatabaseConnection; import com.nearinfinity.agent.connections.zookeeper.ZookeeperDatabaseConnection; import com.nearinfinity.agent.exceptions.HdfsThreadException; -import com.nearinfinity.agent.exceptions.InvalidLicenseException; -import com.nearinfinity.agent.monitor.ThreadController; import com.nearinfinity.agent.notifications.Notifier; -import com.nearinfinity.license.AgentLicense; public class Agent { public static final long COLLECTOR_SLEEP_TIME = TimeUnit.SECONDS.toMillis(15); @@ -47,15 +44,6 @@ public class Agent { // Setup the notifier Notifier.getNotifier(props, true); - // Verify valid License - try { - AgentLicense.verifyLicense(props, jdbc); - } catch (InvalidLicenseException e) { - log.fatal(e.getMessage() + " Exiting."); - ThreadController.stopAllThreads(); - return; - } - List<String> activeCollectors = props.containsKey("active.collectors") ? new ArrayList<String>(Arrays.asList(props.getProperty( "active.collectors").split("\\|"))) : new ArrayList<String>(); http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-agent/src/main/java/com/nearinfinity/license/AgentLicense.java ---------------------------------------------------------------------- diff --git a/blur-agent/src/main/java/com/nearinfinity/license/AgentLicense.java b/blur-agent/src/main/java/com/nearinfinity/license/AgentLicense.java deleted file mode 100644 index c8521ec..0000000 --- a/blur-agent/src/main/java/com/nearinfinity/license/AgentLicense.java +++ /dev/null @@ -1,278 +0,0 @@ -package com.nearinfinity.license; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Properties; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.WordUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.jdbc.core.JdbcTemplate; - -import com.nearinfinity.agent.exceptions.InvalidLicenseException; -import com.nearinfinity.agent.monitor.ThreadController; -import com.nearinfinity.license.utils.CryptoServices; -import com.nearinfinity.license.utils.CryptoServicesException; -import com.nearinfinity.license.utils.IssuingKey; - -public class AgentLicense { - private static final Log log = LogFactory.getLog(AgentLicense.class); - private static final String PUBLIC_KEY = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAr70Zcg1WlzllR6xuxJEBuaETSbgAHY6IuZ9lqLWPEdj1I8cQdk28NONmsqMj0jHBjDmqby1YYIsj3+kxib6Ow2rxL/r2EXsdzZxXTdVCDzJMX1JqVSKLqXmbYB7gy9xLqxxDYCVZwTmhAQmhU1KN1PA6IzvyNFcPfG11qyzrfwqAJ+8rA4556KtEe9EbWBPh3PEEqcuq7lQAFXrrr32cvluSVgqgTF2eLYaRyyPxgvBTkFSg4OkdzT2gP+ggiL9SBXA9y6yLZZR2ehMxS5GhS+96n95wLF5CIbg4onefQzZ65/VGwaSeWbPM/8RBUcK/jRC99rNcF6phywJCiKMgJ+u9cj1ThuIBm5LhSs2FreCuDNtUkna4ernk0Ndy1vSpTu0+h5IiMbz2cbfDJq++w8Os7J/Pt3XfgON2cHcJyEEbkzsJ71Z8+lebMydzX/al95FyXDrobuUuUfOVNrXWKqFB+BRIHPTVJo2tP9FGjcxhmj5vHQkGEAh/0n9b93cCBN6e//ft9TP/yELT+lSFJIeJOHj8gUvSFT5JfilTjZLHvLweMR9ZVlfseq1NC8EoYWgpa6PQcUh2PzuTBgoCyRCG4/mIqw45ICuLeS/MwGERJqWpxWPKRpSbklWDrFObOrfaPb+bvKzsPvbf0Q1x+Azqr9d4OSm7DunNAtV85aUCAwEAAQ=="; - private static final String PRIVATE_KEY = "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"; - - public static void verifyLicense(Properties props, JdbcTemplate jdbc) throws InvalidLicenseException { - List<String> licenseFileLines = readLicenseFile(props); - String licenseType = licenseFileLines.get(3); - verifyLicenseIntegrity(licenseFileLines, licenseType); - verifyLicenseValidity(licenseFileLines, licenseType, jdbc, props); - if ("NODE_YEARLY".equals(licenseType)) { - monitorNodeCount(licenseFileLines, props, jdbc); - } else if ("CLUSTER_YEARLY".equals(licenseType)) { - monitorClusterCount(licenseFileLines, jdbc); - } - } - - private static List<String> readLicenseFile(Properties props) throws InvalidLicenseException { - String licenseFilePath = props.getProperty("license.file"); - - if (StringUtils.isBlank(licenseFilePath)) { - throw new InvalidLicenseException("Missing license.file configuration property."); - } - - File licenseFile = new File(licenseFilePath); - List<String> licenseFileLines = null; - try { - licenseFileLines = IOUtils.readLines(new FileInputStream(licenseFile)); - } catch (FileNotFoundException e) { - throw new InvalidLicenseException("Unable to find license file (" + licenseFile.getAbsolutePath() + ")."); - } catch (IOException e) { - throw new InvalidLicenseException("There was a problem reading the license file: " + e.getMessage() + "."); - } - return licenseFileLines; - } - - private static void verifyLicenseIntegrity(List<String> licenseFileLines, String licenseType) throws InvalidLicenseException { - String licenseData = null; - String signature = null; - if ("YEARLY".equals(licenseType)) { - licenseData = StringUtils.join(licenseFileLines.subList(1, 7), "\n"); - signature = StringUtils.join(licenseFileLines.subList(7, licenseFileLines.size() - 1), "\n"); - } else if ("NODE_YEARLY".equals(licenseType)) { - licenseData = StringUtils.join(licenseFileLines.subList(1, 8), "\n"); - signature = StringUtils.join(licenseFileLines.subList(8, licenseFileLines.size() - 1), "\n"); - } else if ("CLUSTER_YEARLY".equals(licenseType)) { - licenseData = StringUtils.join(licenseFileLines.subList(1, 8), "\n"); - signature = StringUtils.join(licenseFileLines.subList(8, licenseFileLines.size() - 1), "\n"); - } else { - throw new InvalidLicenseException("Invalid license type [" + licenseType + "]."); - } - - CryptoServices cryptoServices = CryptoServices.getCryptoServices(); - IssuingKey issuingKey = new IssuingKey(); - issuingKey.setDescription("Main"); - issuingKey.setPrivateKey(CryptoServices.getCryptoServices().decodeBase64(PRIVATE_KEY)); - issuingKey.setPublicKey(CryptoServices.getCryptoServices().decodeBase64(PUBLIC_KEY)); - - try { - if (!cryptoServices.verify(licenseData.toString().getBytes(), cryptoServices.decodeBase64(signature), - cryptoServices.getPublicKey(issuingKey.getPublicKey()))) { - throw new InvalidLicenseException("Invalid license."); - } - } catch (CryptoServicesException e) { - throw new InvalidLicenseException("There was a problem decrypting license."); - } - } - - private static void verifyLicenseValidity(List<String> licenseFileLines, String licenseType, JdbcTemplate jdbc, Properties props) - throws InvalidLicenseException { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - - Date expires = null; - try { - expires = sdf.parse(licenseFileLines.get(5)); - } catch (ParseException e) { - throw new InvalidLicenseException("Unable to parse expires date.", e); - } - - if (StringUtils.endsWith(licenseType, "YEARLY") && expires.getTime() < System.currentTimeMillis()) { - throw new InvalidLicenseException("License has expired."); - } - - jdbc.update("delete from licenses"); - try { - jdbc.update( - "insert into licenses (org, issued_date, expires_date, node_overage, grace_period_days_remain, cluster_overage) values (?,?,?,?,?,?)", - licenseFileLines.get(1), sdf.parse(licenseFileLines.get(4)), expires, 0, 60, 0); - } catch (Exception e) { - throw new InvalidLicenseException("Unable to insert license into DB.", e); - } - - if ("NODE_YEARLY".equals(licenseType)) { - updateNodeOverageInfo(jdbc, licenseFileLines, props); - } else if ("CLUSTER_YEARLY".equals(licenseType)) { - updateClusterOverageInfo(jdbc, licenseFileLines); - } - } - - private static void monitorNodeCount(final List<String> licenseFileLines, final Properties props, final JdbcTemplate jdbc) { - Thread monitorThread = new Thread(new Runnable() { - @Override - public void run() { - while (true) { - try { - Thread.sleep(TimeUnit.HOURS.toMillis(1)); - } catch (InterruptedException e) { - break; - } - try { - updateNodeOverageInfo(jdbc, licenseFileLines, props); - } catch (InvalidLicenseException e) { - log.fatal(e.getMessage() + " Stopping node count monitor."); - ThreadController.stopAllThreads(); - break; - } - } - } - }, "Node Count Monitor"); - monitorThread.start(); - ThreadController.registerThread(monitorThread); - } - - private static void monitorClusterCount(final List<String> licenseFileLines, final JdbcTemplate jdbc) { - Thread monitorThread = new Thread(new Runnable() { - @Override - public void run() { - while (true) { - try { - Thread.sleep(TimeUnit.HOURS.toMillis(1)); - } catch (InterruptedException e) { - break; - } - try { - updateClusterOverageInfo(jdbc, licenseFileLines); - } catch (InvalidLicenseException e) { - log.fatal(e.getMessage() + " Stopping cluster count monitor."); - ThreadController.stopAllThreads(); - break; - } - } - } - }, "Cluster Count Monitor"); - monitorThread.start(); - ThreadController.registerThread(monitorThread); - } - - private static void updateClusterOverageInfo(JdbcTemplate jdbc, List<String> licenseFileLines) throws InvalidLicenseException { - int totalClusters = jdbc.queryForInt("select count(1) from clusters"); - int allowedClusters = Integer.parseInt(licenseFileLines.get(7)); - - if (totalClusters > allowedClusters) { - jdbc.update("update licenses set cluster_overage=?", totalClusters - allowedClusters); - throw new InvalidLicenseException("Too many clusters for license. Request new license to continue collecting information."); - } - } - - private static void updateNodeOverageInfo(JdbcTemplate jdbc, List<String> licenseFileLines, Properties props) - throws InvalidLicenseException { - int totalNodes = jdbc - .queryForInt("select a.nodes + b.nodes from (select count(1) as nodes from controllers) a, (select count(1) as nodes from shards) b"); - int allowedNodes = Integer.parseInt(licenseFileLines.get(7)); - Set<String> dates = loadGracePeriodDates(props); - - if (totalNodes > allowedNodes) { - Set<String> newDates = new HashSet<String>(dates); - newDates.add(new SimpleDateFormat("yyyyMMdd").format(new Date())); - - int overage = totalNodes > allowedNodes ? totalNodes - allowedNodes : 0; - int graceDays = 60 - dates.size(); - jdbc.update("update licenses set node_overage=?, grace_period_days_remain=?", overage, graceDays); - - if (newDates.size() > dates.size()) { - writeGracePeriodDates(props, newDates); - } - - if (newDates.size() > 60) { - throw new InvalidLicenseException( - "Too many nodes for license and 60 day grace period is up. Request new license to continue collecting information."); - } - } - } - - private static void writeGracePeriodDates(Properties props, Set<String> dates) throws InvalidLicenseException { - String licenseFilePath = props.getProperty("license.file"); - File licenseFile = new File(licenseFilePath); - - File graceFile = new File(licenseFile.getParentFile(), licenseFile.getName().replace(".lic", ".grc")); - - CryptoServices cryptoServices = CryptoServices.getCryptoServices(); - IssuingKey issuingKey = new IssuingKey(); - issuingKey.setDescription("Main"); - issuingKey.setPrivateKey(CryptoServices.getCryptoServices().decodeBase64(PRIVATE_KEY)); - issuingKey.setPublicKey(CryptoServices.getCryptoServices().decodeBase64(PUBLIC_KEY)); - - byte[] sig = null; - try { - sig = cryptoServices.sign(StringUtils.join(dates, ',').getBytes(), cryptoServices.getPrivateKey(issuingKey.getPrivateKey())); - } catch (CryptoServicesException e) { - throw new InvalidLicenseException("Unable to sign grace file contents.", e); - } - String fileContent = StringUtils.join(dates, ',') + "\n" + WordUtils.wrap(cryptoServices.encodeBase64(sig), 50, null, true); - - try { - IOUtils.write(fileContent, new FileOutputStream(graceFile)); - } catch (Exception e) { - throw new InvalidLicenseException("Unable to write grace file.", e); - } - } - - private static Set<String> loadGracePeriodDates(Properties props) throws InvalidLicenseException { - String licenseFilePath = props.getProperty("license.file"); - File licenseFile = new File(licenseFilePath); - - File graceFile = new File(licenseFile.getParentFile(), licenseFile.getName().replace(".lic", ".grc")); - List<String> graceFileLines = null; - try { - graceFileLines = IOUtils.readLines(new FileInputStream(graceFile)); - } catch (FileNotFoundException e) { - throw new InvalidLicenseException("Unable to find grace period file (" + graceFile.getAbsolutePath() + ")."); - } catch (IOException e) { - throw new InvalidLicenseException("There was a problem reading the grace period file: " + e.getMessage() + "."); - } - - if (graceFileLines.isEmpty()) { - throw new InvalidLicenseException("Grace period file can not be empty."); - } - - CryptoServices cryptoServices = CryptoServices.getCryptoServices(); - IssuingKey issuingKey = new IssuingKey(); - issuingKey.setDescription("Main"); - issuingKey.setPrivateKey(CryptoServices.getCryptoServices().decodeBase64(PRIVATE_KEY)); - issuingKey.setPublicKey(CryptoServices.getCryptoServices().decodeBase64(PUBLIC_KEY)); - - String dates = graceFileLines.get(0); - String signature = StringUtils.join(graceFileLines.subList(1, graceFileLines.size()), "\n"); - try { - if (!cryptoServices.verify(dates.getBytes(), cryptoServices.decodeBase64(signature), - cryptoServices.getPublicKey(issuingKey.getPublicKey()))) { - throw new InvalidLicenseException("Invalid grace period file."); - } - } catch (CryptoServicesException e) { - throw new InvalidLicenseException("There was a problem decrypting grace period file."); - } - - return new HashSet<String>(Arrays.asList(StringUtils.split(dates, ","))); - } -} http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-agent/src/main/java/com/nearinfinity/license/utils/CryptoServices.java ---------------------------------------------------------------------- diff --git a/blur-agent/src/main/java/com/nearinfinity/license/utils/CryptoServices.java b/blur-agent/src/main/java/com/nearinfinity/license/utils/CryptoServices.java deleted file mode 100644 index e95065c..0000000 --- a/blur-agent/src/main/java/com/nearinfinity/license/utils/CryptoServices.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.nearinfinity.license.utils; - -import org.apache.commons.codec.binary.Base64; - -import javax.crypto.*; -import javax.crypto.spec.PBEKeySpec; -import java.security.*; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.X509EncodedKeySpec; -import java.security.spec.PKCS8EncodedKeySpec; - -public class CryptoServices { - public static final String PRIVATE_KEY = "cm_priv"; - public static final String PRIVATE_KEY_FILE = PRIVATE_KEY + ".key"; - public static final String PUBLIC_KEY = "cm_pub"; - public static final String PUBLIC_KEY_FILE = PUBLIC_KEY + ".key"; - - public static final String PBE_ALG = "PBEWithSHA1AndDESede"; - - public static final String KEY_ALG = "RSA"; - public static final String SIGN_ALG = "SHA512withRSA"; - - public static final String ALG_MODE = "ECB"; - public static final String ALG_PADDING = "PKCS1Padding"; - - public static final String CIPHER_ALG = KEY_ALG + "/" + ALG_MODE + "/" + ALG_PADDING; - - private KeyFactory keyFactory; - private Signature signature; - private Cipher cipher; - - public static CryptoServices INSTANCE = new CryptoServices(); - - public static CryptoServices getCryptoServices() { - return INSTANCE; - } - - public String encodeBase64(byte[] b) { - return new String(Base64.encodeBase64(b)); - } - - public byte[] decodeBase64(String s) { - return Base64.decodeBase64(s.getBytes()); - } - - public byte[] decrypt(byte[] data, Key key) throws CryptoServicesException { - try { - getCipher().init(Cipher.DECRYPT_MODE, key); - return cipher.doFinal(data); - } catch (InvalidKeyException e) { - throw new CryptoServicesException(e); - } catch (BadPaddingException e) { - throw new CryptoServicesException(e); - } catch (IllegalBlockSizeException e) { - throw new CryptoServicesException(e); - } catch (NoSuchAlgorithmException e) { - throw new CryptoServicesException(e); - } catch (NoSuchPaddingException e) { - throw new CryptoServicesException(e); - } - } - - public byte[] sign(byte[] data, PrivateKey key) throws CryptoServicesException { - try { - getSignature().initSign(key); - signature.update(data); - return signature.sign(); - } catch (InvalidKeyException e) { - throw new CryptoServicesException(e); - } catch (SignatureException e) { - throw new CryptoServicesException(e); - } catch (NoSuchAlgorithmException e) { - throw new CryptoServicesException(e); - } - } - - public boolean verify(byte[] data, byte[] sig, PublicKey key) throws CryptoServicesException { - try { - getSignature().initVerify(key); - signature.update(data); - return signature.verify(sig); - } catch (InvalidKeyException e) { - throw new CryptoServicesException(e); - } catch (SignatureException e) { - throw new CryptoServicesException(e); - } catch (NoSuchAlgorithmException e) { - throw new CryptoServicesException(e); - } - } - - private KeyFactory getKeyFactory() throws NoSuchAlgorithmException { - if (keyFactory == null) { - keyFactory = KeyFactory.getInstance(KEY_ALG); - } - return keyFactory; - } - - private Signature getSignature() throws NoSuchAlgorithmException { - if (signature == null) { - signature = Signature.getInstance(SIGN_ALG); - } - return signature; - } - - public SecretKey generatePBESecretKey(char[] password, byte[] salt) throws CryptoServicesException { - - PBEKeySpec pbeKeySpec = new PBEKeySpec(password); - SecretKeyFactory secretKeyFactory = null; - try { - secretKeyFactory = SecretKeyFactory.getInstance(PBE_ALG); - return secretKeyFactory.generateSecret(pbeKeySpec); - } catch (NoSuchAlgorithmException e) { - throw new CryptoServicesException(e); - } catch (InvalidKeySpecException e) { - throw new CryptoServicesException(e); - } - } - - private Cipher getCipher() throws NoSuchAlgorithmException, NoSuchPaddingException { - cipher = Cipher.getInstance(CIPHER_ALG); - return cipher; - } - - public final PublicKey getPublicKey(byte[] keyBytes) throws CryptoServicesException { - X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(keyBytes); - PublicKey publicKey = null; - try { - publicKey = getKeyFactory().generatePublic(publicKeySpec); - } catch (InvalidKeySpecException e) { - throw new CryptoServicesException(e); - } catch (NoSuchAlgorithmException e) { - throw new CryptoServicesException(e); - } - return publicKey; - - } - - public final PrivateKey getPrivateKey(byte[] keyBytes) throws CryptoServicesException { - PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(keyBytes); - PrivateKey privateKey = null; - try { - privateKey = getKeyFactory().generatePrivate(privateKeySpec); - } catch (InvalidKeySpecException e) { - throw new CryptoServicesException(e); - } catch (NoSuchAlgorithmException e) { - throw new CryptoServicesException(e); - } - return privateKey; - - } - - public KeyPair generateKeyPair() throws NoSuchAlgorithmException { - SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); - KeyPairGenerator kpg = KeyPairGenerator.getInstance(KEY_ALG); - kpg.initialize(4096, secureRandom); - - KeyPair keyPair = kpg.generateKeyPair(); - - return keyPair; - } -} http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-agent/src/main/java/com/nearinfinity/license/utils/CryptoServicesException.java ---------------------------------------------------------------------- diff --git a/blur-agent/src/main/java/com/nearinfinity/license/utils/CryptoServicesException.java b/blur-agent/src/main/java/com/nearinfinity/license/utils/CryptoServicesException.java deleted file mode 100644 index aab6ae7..0000000 --- a/blur-agent/src/main/java/com/nearinfinity/license/utils/CryptoServicesException.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.nearinfinity.license.utils; - -public class CryptoServicesException extends Exception { - private static final long serialVersionUID = 5526634448227766102L; - - public CryptoServicesException() { - super(); - } - - public CryptoServicesException(String message) { - super(message); - } - - public CryptoServicesException(String message, Throwable cause) { - super(message, cause); - } - - public CryptoServicesException(Throwable cause) { - super(cause); - } -} http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-agent/src/main/java/com/nearinfinity/license/utils/IssuingKey.java ---------------------------------------------------------------------- diff --git a/blur-agent/src/main/java/com/nearinfinity/license/utils/IssuingKey.java b/blur-agent/src/main/java/com/nearinfinity/license/utils/IssuingKey.java deleted file mode 100644 index 00da92d..0000000 --- a/blur-agent/src/main/java/com/nearinfinity/license/utils/IssuingKey.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.nearinfinity.license.utils; - -public class IssuingKey { - private byte[] privateKey; - private byte[] publicKey; - private String description; - - public byte[] getPrivateKey() { - return privateKey; - } - - public void setPrivateKey(byte[] privateKey) { - this.privateKey = privateKey; - } - - public byte[] getPublicKey() { - return publicKey; - } - - public void setPublicKey(byte[] publicKey) { - this.publicKey = publicKey; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } -} http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/blur-agent/src/test/java/com/nearinfinity/license/AgentLicenseTest.java ---------------------------------------------------------------------- diff --git a/blur-agent/src/test/java/com/nearinfinity/license/AgentLicenseTest.java b/blur-agent/src/test/java/com/nearinfinity/license/AgentLicenseTest.java deleted file mode 100644 index d681e12..0000000 --- a/blur-agent/src/test/java/com/nearinfinity/license/AgentLicenseTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.nearinfinity.license; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - -import java.io.File; -import java.io.IOException; -import java.util.Properties; - -import org.junit.Before; -import org.junit.Test; -import org.springframework.core.io.ClassPathResource; - -import com.nearinfinity.AgentBaseTestClass; -import com.nearinfinity.agent.exceptions.InvalidLicenseException; -import com.nearinfinity.agent.monitor.ThreadController; - -public class AgentLicenseTest extends AgentBaseTestClass { - @Before - public void setup() { - ThreadController.exitOnStop = false; - } - - @Test - public void testMissingLicenseLocation() { - try { - AgentLicense.verifyLicense(new Properties(), jdbc); - fail("Missing file, this should have failed"); - } catch (InvalidLicenseException e) { - assertEquals("Missing license.file configuration property.", e.getMessage()); - } - } - - @Test - public void testMissingLicenseFile() { - try { - Properties props = new Properties(); - props.setProperty("license.file", new File("bad.lic").getAbsolutePath()); - AgentLicense.verifyLicense(props, jdbc); - fail("Missing file, this should have failed"); - } catch (InvalidLicenseException e) { - assertEquals("Unable to find license file (" + new File("bad.lic").getAbsolutePath() + ").", e.getMessage()); - } - } - - @Test - public void testBadLicenseType() { - try { - Properties props = new Properties(); - props.setProperty("license.file", getLicensePath("./invalid_type.lic")); - AgentLicense.verifyLicense(props, jdbc); - fail("Missing file, this should have failed"); - } catch (InvalidLicenseException e) { - assertEquals("Invalid license type [UNKNOWN].", e.getMessage()); - } - } - - @Test - public void testInvalidLicense() { - try { - Properties props = new Properties(); - props.setProperty("license.file", getLicensePath("./invalid_matching.lic")); - AgentLicense.verifyLicense(props, jdbc); - fail("Missing file, this should have failed"); - } catch (InvalidLicenseException e) { - assertEquals("Invalid license.", e.getMessage()); - } - } - -// @Test -// public void testInvalidLicenseType() throws InvalidLicenseException { -// Properties props = new Properties(); -// props.setProperty("license.file", "/Users/crohr/Projects/nic/blur-tools/license-maker/licenses/NIC-Testing/blur_tools_2011-12-31.lic"); -// -// AgentLicense.verifyLicense(props, jdbc); -// // AgentLicense.verifyLicense(null, null); -// } - - - private String getLicensePath(String license) { - String file = null; - try { - file = new ClassPathResource(license).getFile().getAbsolutePath(); - } catch (IOException e) { - fail(e.getMessage()); - } - return file; - } -} http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/cd2eb3d0/etc/agent.config.sample ---------------------------------------------------------------------- diff --git a/etc/agent.config.sample b/etc/agent.config.sample index 45acb9d..ca9983d 100644 --- a/etc/agent.config.sample +++ b/etc/agent.config.sample @@ -1,6 +1,3 @@ -# License Key -#license.file= - # Mysql connection information #store.url= #store.user=
