Liferay Portal 6.0 EE SP2にバージョン6.1のライセンスファイルを理解するように教えます

Liferay Portal 6.0 EEの多くの開発者は、Liferay Inc.のポリシーに不満を抱いていました。 バージョン6.1がリリースされたとき、プロジェクトの作業中に試用版ライセンスを使用する機会を失い、新しいバージョンのキーには下位互換性がありません。 どうする この製品を製造している会社が開発者に会わず、全員を強制的に新しいバージョンに移行し、開発中に使用するためにすべての開発者に本番サーバーからの実際のライセンスを提供することは最良のアイデアではありません。 最もエレガントな方法でなくても解決方法はありますが、選択肢を残さなければ、この問題を解決できます。 猫へようこそ。



この記事で説明する内容



Liferay Portal 6.0 EEは、ある程度複雑なライセンスをチェックする方法を使用しますが(このセクションについては記事では説明しません)、非常に弱点があり(これについては今すぐ説明します)、いずれかの方法の本体を1行で、LiferayにLiferay Portal 6.1 EEからのライセンスファイルを受け入れます。 しかし、これはこのアプローチの主な利点ではありません。 以下に説明する操作の結果、次の結果を取得することができます:ライセンス有効期間の範囲、および同時セッションの数とライセンスファイルに含まれる他のフィールドが確認されますが、<key />フィールドの内容は確認されないため、ライセンスを取得できます作業中に使用できる同時セッションの数に制限はありません。



ちょっとした練習



portal-impl.jarライブラリにあるライセンス検証を実行するクラスを考えてください。 危機にwhatしていることを理解している人は、それを探す場所を知っていると思います。 もちろん、Tomcatを使用している場合は、「APP_SERVER / webapps / ROOT / WEB-INF / lib」で、別のアプリケーションサーバーを使用している場合に類推してこのファイルの場所を見つけることができます。

それでは、実用的な部分に取りかかりましょう。

最初のステップとして、「JD」や「jad」、「portal-impl.jar」に「set」など、Java開発者に馴染みのあるツールを使用して、クラスコード「com.liferay.portal.ee.license.bd」を取得します。実際、それは私たちの関心事です。

以下に、読者を記事からそらさないために、前の段落で説明した操作の結果として取得されたコードを示します。

package com.liferay.portal.ee.license.b; import com.liferay.portal.ee.license.a; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.StringUtil; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class d { private static final String[] a = { "MD5", "SHA-1", "SHA-256", "SHA-512" }; private static final String b = "4a4beb2b97c151cff83cbca7096325086817360a7b8c912b66e1d1dea172033a8c5934cbbacbf7b443496cc119a6a482fc6225d28bcbcb2384f52862e6fd35e49a2625f1458d24a1f62e71235dc16b9de5a971e638af32a9784e566f33dd90234d89e1dde83e8a4a100a70d999b2bb7fa77eeb34fd1be9cdf3645f9478b14c2cd6b8f955"; private static final char[] c = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; private static Log d = LogFactoryUtil.getLog(d.class); private static de = new d(); public static Map a(a parama) { Date localDate1 = parama.p(); Date localDate2 = parama.c(); return a(parama.i(), parama.p(), parama.a(), parama.f(), parama.g(), parama.m(), parama.n(), parama.l(), parama.k(), parama.j(), parama.b(), localDate2.getTime() - localDate1.getTime(), parama.o()); } public static ab(a parama) { String str = parama.g(); if (!str.equals("trial")) return parama; if (!c(parama)) return parama; parama.e("developer"); Map localMap = a(parama); parama.c(ea(localMap)); return parama; } public static boolean c(a a1) { String s = a1.i(); if (s.equals("1")) return true; Map map = a(a1); String s1 = ea(map); if (s1.equals("4a4beb2b97c151cff83cbca7096325086817360a7b8c912b66e1d1dea172033a8c5934cbbacbf7b443496cc119a6a482fc6225d28bcbcb2384f52862e6fd35e49a2625f1458d24a1f62e71235dc16b9de5a971e638af32a9784e566f33dd90234d89e1dde83e8a4a100a70d999b2bb7fa77eeb34fd1be9cdf3645f9478b14c2cd6b8f955")) return false; return s1.equals(a1.d()); } private String a(Map paramMap) { int i = GetterUtil.getInteger((String) paramMap.get("version")); try { if (i == 1) throw new IllegalArgumentException("Invalid version " + i); if (i == 2) return b(paramMap); } catch (Exception localException) { d.error(localException, localException); } return ""; } private String b(Map paramMap) { ArrayList localArrayList = new ArrayList(paramMap.keySet()); Collections.sort(localArrayList); Object localObject = new ArrayList(paramMap.size()); String str1; String str2; for (int i = 0; i < localArrayList.size(); i++) { str1 = (String) paramMap.get(localArrayList.get(i)); str2 = a[(i % a.length)]; String str3 = a(str1, str2); ((List) localObject).add(str3); } localObject = b((List) localObject); for (int i = 0; i < ((List) localObject).size(); i++) { str1 = (String) ((List) localObject).get(i); str2 = a[(i % a.length)]; str1 = a(str1, str2); ((List) localObject).set(i, str1); } return (String) a((List) localObject); } private String a(String paramString1, String paramString2) { MessageDigest localMessageDigest = null; byte[] arrayOfByte = null; try { localMessageDigest = MessageDigest.getInstance(paramString2); localMessageDigest.update(paramString1.getBytes()); arrayOfByte = localMessageDigest.digest(); } catch (NoSuchAlgorithmException e) { } StringBuilder localStringBuilder = new StringBuilder( arrayOfByte.length << 1); for (int i = 0; i < arrayOfByte.length; i++) { int j = arrayOfByte[i] & 0xFF; localStringBuilder.append(c[(j >> 4)]); localStringBuilder.append(c[(j & 0xF)]); } return localStringBuilder.toString(); } private static Map a(String paramString1, Date paramDate, String paramString2, String paramString3, String paramString4, String paramString5, String paramString6, String paramString7, int paramInt1, int paramInt2, String paramString8, long paramLong, String[] paramArrayOfString) { HashMap localHashMap = new HashMap(); localHashMap.put("version", paramString1); if (!paramString4.equals("trial")) localHashMap.put("startDate", String.valueOf(paramDate.getTime())); localHashMap.put("type", paramString4); localHashMap.put("productVersion", paramString6); localHashMap.put("owner", paramString7); localHashMap.put("description", paramString8); if (paramString4.equals("trial")) localHashMap.put("lifetime", String.valueOf(paramLong)); else localHashMap.put("expirationDate", String.valueOf(paramDate.getTime() + paramLong)); String str1; if (paramString1.equals("1")) { if ((paramString4.equals("cluster")) || (paramString4.equals("developer-cluster"))) { for (int i = 0; i < paramArrayOfString.length; i++) { String str2 = StringUtil.replace(paramArrayOfString[i], "-", ":"); str2 = str2.trim().toLowerCase(); localHashMap.put("macAddress." + i, str2); } } else if (paramString4.equals("production")) { str1 = paramArrayOfString[0].trim(); localHashMap.put("serverId", str1); } } else { localHashMap.put("accountEntryName", paramString2); localHashMap.put("licenseEntryName", paramString3); localHashMap.put("productEntryName", paramString5); if ((paramString4.equals("cluster")) || (paramString4.equals("developer-cluster"))) localHashMap.put("maxServers", String.valueOf(paramInt1)); if ((paramString4.equals("developer")) || (paramString4.equals("developer-cluster")) || (paramString4.equals("trial"))) localHashMap.put("maxHttpSessions", String.valueOf(paramInt2)); if (paramString4.equals("production")) { str1 = StringUtil.merge(paramArrayOfString); str1 = str1.toLowerCase(); str1 = StringUtil.replace(str1, "-", ":"); localHashMap.put("serverIds", str1); } } return localHashMap; } private String a(List paramList) { int i = paramList.size(); int j = 0; int k = 2147483647; Iterator localIterator1 = paramList.iterator(); int n; while (localIterator1.hasNext()) { Object localObject = (String) localIterator1.next(); n = ((String) localObject).length(); j += n; if (n >= k) continue; k = n; } Object localObject = new StringBuilder(j); for (int m = 0; m < k; m++) for (n = 0; n < i; n++) { String str2 = (String) paramList.get(n); ((StringBuilder) localObject).append(str2.charAt(m)); } Iterator localIterator2 = paramList.iterator(); while (localIterator2.hasNext()) { String str1 = (String) localIterator2.next(); if (str1.length() <= k) continue; ((StringBuilder) localObject).append(str1.substring(k)); } return (String) ((StringBuilder) localObject).toString(); } private List b(List paramList) { int i = paramList.size(); int j = i / 4; if (j * 4 < i) j++; ArrayList localArrayList = new ArrayList(4); StringBuilder localStringBuilder = new StringBuilder(); for (int k = 0; k < i; k++) { String str = (String) paramList.get(k); if ((k != 0) && (k % j == 0)) { localArrayList.add(localStringBuilder.toString()); localStringBuilder.setLength(0); } localStringBuilder.append(str); } if (localArrayList.size() < 4) localArrayList.add(localStringBuilder.toString()); return localArrayList; } }
      
      





ライセンスキーチェックの結果を返す唯一の方法に興味があります。

 public static boolean c(a a1) { ... }
      
      





ライセンスファイルが検証に合格するには、このメソッドの本体を、値「true」を返す単純な構造に置き換える必要があります。

 public static boolean c(a a1) { return true; }
      
      







編集


次に、変更したクラスをコンパイルし、適切な場所に戻す必要があります。 コンパイルを開始するには、まず基本的なディレクトリ構造を作成します。



 liferay_license_fix/ src/ classes/ lib/ 
      





liferay_license_fix/ src/ classes/ lib/





「src /」にパッケージに対応するディレクトリを作成して、受け取ったクラスのソースコードを保存します。 ターゲットクラスをコンパイルするには、追加のクラス「com.liferay.portal.ee.license.a」が必要です。これは、同じ「portal-impl.jar」に含まれています。 このライブラリが「クラスパス」に含まれている場合、ターゲットクラスはコンパイルされません。 すでにportal-impl.jarに含まれています。 したがって、クラスファイル「com.liferay.portal.ee.license.a」を以前に作成したディレクトリ「classes」に解凍し、Tomcatの場合は「APP_SERVER / lib / ext」から「portal-service.jar」をコピーする必要があります。構成に応じて別の場所から「lib」ディレクトリに移動します(コンパイラの「classpath」オプションで場所を指定することで「portal-service.jar」のコピーを回避できますが、コピーの場合については記事で説明します)。 次の図が判明します。



 liferay_license_fix/ src/ com/ liferay/ portal/ ee/ license/ b/ d.java classes/ com/ liferay/ portal/ ee/ license/ a.class lib/ portal-service.jar 
      





liferay_license_fix/ src/ com/ liferay/ portal/ ee/ license/ b/ d.java classes/ com/ liferay/ portal/ ee/ license/ a.class lib/ portal-service.jar





「liferay_license_fix」ディレクトリに移動し、次のコマンドでターゲットクラスをコンパイルします。



 javac -cp "lib\portal-service.jar;classes" -d classes src\com\liferay\portal\ee\license\b\d.java 
      





javac -cp "lib\portal-service.jar;classes" -d classes src\com\liferay\portal\ee\license\b\d.java





コンパイルしたクラスは次の場所にあります。



 liferay_license_fix/classes/com/liferay/portal/ee/license/b/d.class 
      





liferay_license_fix/classes/com/liferay/portal/ee/license/b/d.class







パッチの準備


ここで、「portal-impl.jar」に含まれるソースクラスを上記のアクションの過程で取得したものに置き換える必要があります。 これは、手動で、「portal-impl.jar」内のファイルを置き換えるか、Liferayポータルに含まれるパッチと「patching-tool」を使用して行うことができますが、LR EE 6.0よりも新しいバージョンのツールが必要です。つまり Liferay Poral 6.1 EEのバージョンに含まれています。これは公式Webサイトからダウンロードでき、単に「パッチツール」の現在のバージョンを置き換えるだけです。 上記のアクションが完了したら、パッチを準備します。 このアプローチの利点は、単純なコマンドを使用してパッチのインストールと削除が実行され、これらの操作が非常に簡単になることです。また、パッチの適用時に影響を受けるファイルのバックアップコピーを作成する必要がなく、必要に応じて変更を簡単にロールバックできます。

パッチのディレクトリ構造を準備します。



 liferay-license-fix-6012/ backup/ WAR_PATH/ WEB-INF/ lib/ portal-impl.jar/ com/ liferay/ portal/ ee/ license/ b/ jdk5/ WAR_PATH/ WEB-INF/ lib/ portal-impl.jar/ com/ liferay/ portal/ ee/ license/ b/ jdk6/ WAR_PATH/ WEB-INF/ lib/ portal-impl.jar/ com/ liferay/ portal/ ee/ license/ b/ 
      





liferay-license-fix-6012/ backup/ WAR_PATH/ WEB-INF/ lib/ portal-impl.jar/ com/ liferay/ portal/ ee/ license/ b/ jdk5/ WAR_PATH/ WEB-INF/ lib/ portal-impl.jar/ com/ liferay/ portal/ ee/ license/ b/ jdk6/ WAR_PATH/ WEB-INF/ lib/ portal-impl.jar/ com/ liferay/ portal/ ee/ license/ b/





考えられるディレクトリ構造を考慮して、まず「liferay-license-fix-6012 / backup」に次のディレクトリ「WAR_PATH \ WEB-INF / lib / portal-impl.jar /」を作成し、それらを「liferay-license-fix- 6012 / jdk5 "、およびin" liferay-license-fix-6012 / jdk6 "。 次に、パッケージ「com / liferay / portal / ee / license / b / d.class」のディレクトリ構造とともに、上記でコンパイルしたクラスを「liferay-license-fix-6012 / jdk5」および「liferay-license-fix-6012 / jdk6 "。 ここで、元の「com.liferay.portal.ee.license.bd」クラスを「portal-impl.jar」から「liferay-license-fix-6012 / backup / WAR_PATH / WEB-INF / lib / portal-impl」ディレクトリに解凍する必要があります。 .jar / com / liferay / portal / ee / license / b。」

次に、次の内容のファイル「liferay-license-fix-6012 / fixpack_documentation.xml」を作成します。



 <?xml version="1.0"?> <patch> <id>liferay-license-fix-6012</id> <name>liferay-license-fix</name> <patching-tool-version>2</patching-tool-version> <incremental>false</incremental> <version>1</version> <rank>1</rank> <requirements></requirements> <component>security-hotfix</component> <product>6012</product> <fixed-issues></fixed-issues> <module-name></module-name> <module-id></module-id> </patch>
      
      





パッチを準備する最後の手順は、ディレクトリ自体を含まない「liferay-license-fix-6012」ディレクトリのすべての内容を含むzipアーカイブ「liferay-license-fix-6012.zip」を作成することです。



パッチ管理


パッチをインストールするには、次のコマンドを使用する前に、パッチを「/ patching-tool / patch」にコピーし、「patching-tool」を初期化する必要があります。



 patching-tool auto-discovery 
      





patching-tool auto-discovery





初期初期化が完了すると、ファイル「default.properties」が表示され、必要に応じて、パッチが適用されるLiferay Portal 6.0 EE SP2を使用してサーバーインスタンスのロケーションパスを調整できます。

次に、次のコマンドを使用します。



 patching-tool info 
      





patching-tool info





現在の状態に関する情報(パッチのリストとそのステータス)を取得できます。 出力に次の行が含まれる場合:



 Available patches: [ I] liferay-license-fix-6012 :: Currently not installed; Will be installed. 
      





Available patches: [ I] liferay-license-fix-6012 :: Currently not installed; Will be installed.





これは、パッチをインストールできることを意味します。

パッチをインストールするコマンドは次のとおりです。



 patching-tool install 
      





patching-tool install





コマンドの結果が次の場合:



 The installation was successful. One patch is installed on the system. 
      





The installation was successful. One patch is installed on the system.





これは、パッチが正常にインストールされたことを示します。

パッチのインストールの結果として受け取った変更をキャンセルする必要がある場合は、次のコマンドを実行する必要があります。



 patching-tool revert 
      





patching-tool revert





成功すると、次のメッセージが表示されます。



 Revert has been executed successfully. There is no patch installed on the system. 
      





Revert has been executed successfully. There is no patch installed on the system.





操作後、Liferay Portal 6.1 EEのライセンスファイルを安全に使用するか、次の内容のライセンスファイルを作成できます。



 <?xml version="1.0"?> <license> <account-name>Liferay Developer</account-name> <owner>Developer</owner> <description>Trial license</description> <product-name>Portal Enterprise</product-name> <product-version>6.0 SP 2</product-version> <license-name>Portal Enterprise</license-name> <license-type>enterprise</license-type> <license-version>2</license-version> <start-date>Sunday, January 1, 2012 00:00:00 AM GMT</start-date> <expiration-date>Thursday, January 1, 2099 00:00:00 AM GMT</expiration-date> <max-http-sessions>1000</max-http-sessions> <key></key> </license>
      
      





記事に記載されているすべてのファイル、および必要なバージョンの準備されたパッチと「パッチツール」を含むアーカイブをダウンロードします。



UPD。 コメントは、LR EE 6.0 SP1 / SP2のライセンスを更新する非常に簡単な方法を示唆しています。 ユーザーSauronに感謝します。



All Articles