この記事で説明する内容
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に感謝します。