このトピックでは、サードパーティの承認プロセスを Dataphin BPMS と統合する方法の概要を説明し、オープンインターフェース機能、統合手順、および使用例の詳細について説明します。
前提条件
Dataphin システム内で [承認設定] が構成されていることを確認します。構成の詳細については、「承認設定」をご参照ください。テナント操作については、[承認システムの選択] の下の [承認設定] と [その他] の設定項目を参照してください。
承認インターフェース
{url}: サードパーティ承認フローの統合アドレス。承認リクエストを送信するための URL は http(s)://{url} です。
-
接続テスト
リクエストメソッド: POST を使用します。
リクエスト URL: http(s)://{url}/dataphin/bpms/check/connect.
リクエスト時系列チャート
クエリパラメータ
パラメータ名
パラメータタイプ
説明
accessToken
String
サーバーサイド API を呼び出すために使用される資格情報。
Dataphin ページで自動的に生成されるか、ユーザーが手動で生成して Dataphin に入力します。例: 6d1b2n1c.
timestamp
String
情報が送信された時刻 (ミリ秒単位)。例: 1654156836531.
リクエストボディパラメータ
checkEvent (String): このパラメータは、接続性のチェックなどの接続テストを表します。
戻り値パラメータ
checkResult (String): チェックの結果を示します。「success」の戻り値は、接続テストの成功を示します。その他の値は、接続テストの失敗を示します。例: 'success'.
-
承認の送信
リクエストメソッド: POST
リクエストアドレス: http(s)://{url}/dataphin/bpms/processinstance/create
承認送信時系列チャート
クエリパラメータ
パラメータ名
パラメータタイプ
説明
accessToken
String
サーバーサイド API を呼び出すために使用される資格情報。
Dataphin ページで自動的に生成されるか、ユーザーが手動で生成して Dataphin に入力します。例: 6d1b2n1c.
timestamp
String
情報が送信された時刻 (ミリ秒単位)。例: 1654156836531.
ボディパラメータ
パラメータ名
パラメータタイプ
説明
applyId
String
Dataphin 承認オーダー ID。例: 1223.
title
String
Dataphin 承認オーダーのタイトル。例: dataphin bpms.
content
String
Dataphin 承認オーダーの内容。例: bpms content。「承認メッセージコンテンツメタデータの説明」をご参照ください。
type
String
承認オーダータイプ: APPROVAL_DOC_TYPE.
コードレビュー: CODE_REVIEW.
公開制御: PUBLISH.
ビジネスプランニング: BIZ_PLANNING.
承認の承認: AUTH.
デフォルト: DEFAULT.
templateCode
String
承認テンプレートのコード。空のままにすることができ、ページ構成に関連しています。
承認メッセージコンテンツメタデータの説明
パラメータ名
パラメータタイプ
説明
resourceType
String
承認タスクのタイプ。列挙値であり、次のタイプが含まれます。
PhysicalTable: 物理テーブル。
LogicTable: 論理テーブル。
MetaTable: リアルタイムメタテーブル。
MirrorTable: ミラーテーブル。
Fun: 関数。
DataSource: データソース。
FeatureConfig: 機能権限構成。
OSAPP: データサービス APP。
OSAPI: データサービス API。
OSLogicUnit: データサービスユニット。
OSDS: データサービスデータソース。
SECRET_KEY:_KEY: キー。
GLOBAL_PARAM: グローバル変数。
grantToUsers
List<GrantToUser>
承認済みユーザーのリスト。「GrantToUser」をご参照ください。
bpmsEnvironment
BpmsEnvironment
承認システム環境に関する情報。「BpmsEnvironment」をご参照ください。
operates
List<String>
リクエストされた権限のタイプ。次のものが含まれます。
SYNC_READ: データソースのリードスルー。
SYNC_WRITE: データソースのライトスルー。
SQL_QUERY: 物理テーブルおよび論理テーブルの SQL クエリ。
SQL_WRITE: 物理テーブルの SQL 書き込み。
SQL_ALTER: 物理テーブルの SQL 変更。
SQL_DROP: 物理テーブルおよび論理テーブルの SQL 削除。
SELECT: データサービス API のクエリ。
WRITE: 書き込み権限。
DEV: 開発権限。
USE: 使用権限。
UPDATE: テーブルデータの変更。
PIPELINE_ENCRY: 統合暗号化。
PIPELINE_DECRY: 統合復号。
levels
List<String>
権限レベル。HIGH、MIDDLE、LOW など。
operations
List<String>
権限タイプ。次のものが含まれます。
SELECT - クエリ。
DESCRIBE - テーブル構造の説明。
UPDATE - テーブルデータの変更。
ALTER - テーブル構造の変更。
DELETE - テーブルの削除。
COPY_TASK - コピー。
resources
List<BpmsResource>
リソースコンテンツ。「BpmsResource」をご参照ください。
applyObject
ApplyObject
アプリケーション オブジェクト情報。「ApplyObject」をご参照ください。
reason
String
申請理由。
GrantToUser
パラメータ名
パラメータタイプ
説明
account
Account
承認済みアカウントのリスト。「Account」をご参照ください。
period
Period
有効期間。「Period」をご参照ください。
Account
パラメータ名
パラメータタイプ
説明
accountType
String
承認タイプには、個人アカウント、テナントアカウント、およびアプリケーションアカウントが含まれます。
PERSONAL: 個人アカウント。
TENANT: テナントアカウント。
APPLICATION: アプリケーションアカウント。
userName
String
アカウントに関連付けられているユーザー名。形式は yyyy-mm-dd です。例: 2022-09-11.
Period
パラメータ名
パラメータタイプ
説明
periodType
String
有効期間タイプには、長期 (LONG_TERM) オプションのサポートが含まれます。
periodEnd
String
権限の有効期限。形式は yyyy-mm-dd です。例: 2022-09-11.
BpmsEnvironment
パラメータ名
パラメータタイプ
説明
projectName
String
プロジェクトの名前。
bizUnitName
String
ビジネスユニットの名前。
resourceEnv
String
環境。本番環境と開発環境に分類されます。
PROD: 本番。
DEV: 開発。
BpmsResource
パラメータ名
パラメータタイプ
説明
resourceType
String
「承認メッセージコンテンツメタデータの説明」をご参照ください。
resourceName
String
リソースの名前。
children
List<Children>
フィールドのリスト。「Children」をご参照ください。
operations
List<String>
「承認メッセージコンテンツメタデータの説明」の operates を参照してください。
authTypes
String
申請権限のタイプ。
Children
パラメータ名
パラメータタイプ
説明
resourceName
String
フィールドの名前。
resourceProperties
String
フィールドのプロパティ。
ResourceProperties
パラメータ名
パラメータタイプ
説明
columnType
String
フィールドのデータ型。
columnIsPartition
String
フィールドがパーティションフィールドかどうかを示します。
columnIsPk
String
フィールドがプライマリキーかどうかを指定します。
ApplyObject
パラメータ名
パラメータタイプ
説明
objectName
String
アプリケーションに関連するオブジェクトの名前。
codeContent
String
アプリケーションに関連付けられているコードの内容。
name
String
ビジネスアクティビティの英語名。
bizObjectType
String
ビジネスオブジェクトのタイプ。
bizObjectChangeType
String
ビジネスオブジェクトの変更タイプ。
bizObjectPkField
String
ビジネスオブジェクトのプライマリキーフィールド。
bizObjectParent
String
ビジネスオブジェクトが属する親オブジェクト。
bizObjectChildren
String
ビジネスオブジェクトに関連する下流の子オブジェクト。
bizProcessCn
String
ビジネスアクティビティの中国語名。
bizProcessType
String
ビジネスアクティビティのタイプ。
bizProcessChangeType
String
ビジネスプロセスの変更タイプ。
bizProcessNodes
String
ビジネスプロセスフロー内のノード。
atomicIndexCn
String
インデックスの中国語名。
dataType
String
インデックスのデータ型。
unit
String
インデックスの測定単位。
bizProcess
String
ビジネスプロセスの名前。
des
String
ビジネスプロセスの説明または口径。
derivedLogic
String
ビジネスプロセスから派生したロジック。
protoLogics
String
ビジネスプロセスの基礎となるロジック。
戻り値パラメータ
processInstanceId (String): サードパーティ承認インスタンスの ID。例: 6d1b2n1c.
承認の取り消し
説明送信後に申請内容が期待どおりでない場合は、承認を取り消すことができます。
リクエストメソッド: POST
リクエストアドレス: http(s)://{url}/dataphin/bpms/processinstance/revoke
クエリパラメータ
パラメータ名
パラメータタイプ
説明
accessToken
String
サーバーサイド API を呼び出すために使用される資格情報。
Dataphin ページで自動的に生成されるか、ユーザーが手動で生成して Dataphin に入力します。例: 6d1b2n1c.
timestamp
String
情報が送信された時刻 (ミリ秒単位)。例: 1654156836531.
ボディパラメータ
パラメータ名
パラメータタイプ
説明
applyId
String
Dataphin 承認オーダー ID。例: 1223.
processInstanceId
String
サードパーティ承認インスタンスの ID。例: 6d1b2a3c.
operatingUserId
String
オペレーター ID。例: 6d1bx1d2.
戻り値パラメータ
result (String): 取り消しの結果を示す情報。戻り値が「success」の場合、操作は成功したとみなされます。
-
承認インスタンス URL のクエリ
リクエストメソッド: GET
リクエスト URL: http(s)://{url}/dataphin/bpms/processinstance/apply.
クエリパラメータ
パラメータ名
パラメータタイプ
説明
accessToken
String
サーバーサイド API を呼び出すために使用される資格情報。
Dataphin ページで自動的に生成されるか、ユーザーが手動で生成して Dataphin に入力します。例: 6d1b2n1c.
timestamp
String
情報が送信された時刻 (ミリ秒単位)。例: 1654156836531.
コールバックインターフェース
-
コールバック URL (https://{callbackUrl}) は、[その他] セクション内の 承認設定 で構成されます。
-
accessToken: サーバーサイド API を呼び出すための資格情報。Dataphin ページによって自動的に生成されるか、ユーザーが生成して Dataphin に入力します。
-
callBackAesKey: コールバック認証資格情報。Dataphin ページによって自動的に生成されるか、ユーザーが生成して Dataphin に入力します。
-
コールバックメソッド
リクエストメソッド: POST を使用します。
リクエスト URL: http://{callbackUrl}.
クエリパラメータ
パラメータ名
パラメータタイプ
説明
signature
String
署名はメッセージ認証コードです。暗号化および復号化の方法については、関連ドキュメントを参照してください。
timestamp
String
タイムスタンプは、情報が送信された時刻 (ミリ秒単位) を表します。例: 1654156836531.
nonce
String
nonce は、一度だけ使用される乱数です。暗号化および復号化の方法については、対応するドキュメントを参照してください。
リクエストボディパラメータ
encrypt (String): 暗号化された情報。例: ajls384k.
戻り値パラメータ
encrypt (String): コールバックステータスを表す暗号化された情報。例: ajls384k.
-
コールバック暗号化コンテンツ
コールバック接続検証
-
暗号化パラメータを入力します。
applyStatus (String): このパラメータは、接続を確認するために使用されます。たとえば、「CHECK」を使用して接続パラメータを確認します。
-
暗号化パラメータを返します。
success: コールバックの戻り値が成功しました。
コールバック戻り値 bpms インスタンス承認結果
-
入力暗号化パラメータ:
パラメータ名
パラメータタイプ
説明
applyId
String
Dataphin 承認オーダー ID。例: 1223.
processInstanceId
String
サードパーティ承認インスタンスの ID。例: 6d1b2a3c.
comment
String
承認インスタンスのコメントに関する情報。
applyStatus
String
accept: 承認する。
reject: 申請の却下。
revoke: 申請の取り消し。
-
暗号化パラメータを返します。
success: コールバックの戻り値が成功しました。
-
-
暗号化および復号化の方法
暗号化の例:
Map<String, String> callBackJson = Maps.newHashMap(); callBackJson.put("applyId", "1"); callBackJson.put("applyStatus", "accept"); callBackJson.put("processInstanceId", "2"); callBackJson.put("comment", "test"); String callBackResult = JSON.toJSONString(callBackJson); ThirdPartyCrypto callbackCrypto = new ThirdPartyCrypto(token, aesKey); String timestamp = String.valueOf(System.currentTimeMillis()); String nonce = ThirdPartyCrypto.Utils.getRandomStr(16); String encrypt = callbackCrypto.encrypt(nonce, callBackResult); String signature = callbackCrypto.getSignature(token, timestamp,nonce, encrypt);
復号の例:
String encryptMsg = JSONObject.parseObject(encrypt); String decryptMsg = callbackCrypto.getDecryptMsg(signature, timestamp, nonce, encryptMsg); if ("success".equalsIgnoreCase(decryptMsg)) { log.error("call back success"); }
暗号化および復号化ツール
import com.alibaba.fastjson.JSON; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.ByteArrayOutputStream; import java.lang.reflect.Field; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.Permission; import java.security.PermissionCollection; import java.security.Security; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * Dataphin オープン プラットフォームの暗号化および復号化の方法 */ public class ThirdPartyCrypto { private static final Charset CHARSET = StandardCharsets.UTF_8; private static final Base64 BASE_64 = new Base64(); private final byte[] AES_KEY; private final String TOKEN; /** * ask getPaddingBytes key 固定長 **/ private static final Integer AES_ENCODE_KEY_LENGTH = 43; /** * 暗号化ランダム文字列バイト長 **/ private static final Integer RANDOM_LENGTH = 16; /** * コンストラクタ * * @param token 開発者が設定したトークン * @param encodingAesKey 開発者が設定した EncodingAESKey * * @throws ThirdPartyEncryptException 実行に失敗しました。この例外のエラーコードと具体的なエラーメッセージを確認してください */ public ThirdPartyCrypto(String token, String encodingAesKey) throws ThirdPartyEncryptException { if (null == encodingAesKey || encodingAesKey.length() != AES_ENCODE_KEY_LENGTH) { throw new ThirdPartyEncryptException(ThirdPartyEncryptException.AES_KEY_ILLEGAL); } this.TOKEN = token; AES_KEY = Base64.decodeBase64(encodingAesKey + "="); } public Map<String, String> getEncryptedMap(String plaintext) throws ThirdPartyEncryptException { return getEncryptedMap(plaintext, System.currentTimeMillis(), Utils.getRandomStr(16)); } /** * Dataphin と同期されるメッセージ本文を暗号化し、暗号化された Map を返します * * @param plaintext 送信されるメッセージ本文のプレーンテキスト * @param timeStamp タイムスタンプ * @param nonce ランダム文字列 * @return * @throws ThirdPartyEncryptException */ public Map<String, String> getEncryptedMap(String plaintext, Long timeStamp, String nonce) throws ThirdPartyEncryptException { if (null == plaintext) { throw new ThirdPartyEncryptException(ThirdPartyEncryptException.ENCRYPTION_PLAINTEXT_ILLEGAL); } if (null == timeStamp) { throw new ThirdPartyEncryptException(ThirdPartyEncryptException.ENCRYPTION_TIMESTAMP_ILLEGAL); } if (null == nonce) { throw new ThirdPartyEncryptException(ThirdPartyEncryptException.ENCRYPTION_NONCE_ILLEGAL); } // 暗号化 String encrypt = encrypt(Utils.getRandomStr(RANDOM_LENGTH), plaintext); String signature = getSignature(TOKEN, String.valueOf(timeStamp), nonce, encrypt); Map<String, String> resultMap = new HashMap<String, String>(); resultMap.put("msg_signature", signature); resultMap.put("encrypt", encrypt); resultMap.put("timeStamp", String.valueOf(timeStamp)); resultMap.put("nonce", nonce); return resultMap; } /** * 暗号文を復号化します * * @param msgSignature 署名文字列 * @param timeStamp タイムスタンプ * @param nonce ランダム文字列 * @param encryptMsg 暗号文 * @return 復号化された元のテキスト * @throws ThirdPartyEncryptException */ public String getDecryptMsg(String msgSignature, String timeStamp, String nonce, String encryptMsg) throws ThirdPartyEncryptException { // 署名を検証します String signature = getSignature(TOKEN, timeStamp, nonce, encryptMsg); if (!signature.equals(msgSignature)) { throw new ThirdPartyEncryptException(ThirdPartyEncryptException.COMPUTE_SIGNATURE_ERROR); } // 復号化 return decrypt(encryptMsg); } /** * プレーンテキストを暗号化します * @param plaintext 暗号化するプレーンテキスト * @return 暗号化された base64 エンコード文字列 */ public String encrypt(String random, String plaintext) throws ThirdPartyEncryptException { try { byte[] randomBytes = random.getBytes(CHARSET); byte[] plainTextBytes = plaintext.getBytes(CHARSET); byte[] lengthByte = Utils.int2Bytes(plainTextBytes.length); ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); byteStream.write(randomBytes); byteStream.write(lengthByte); byteStream.write(plainTextBytes); byte[] padBytes = PKCS7Padding.getPaddingBytes(byteStream.size()); byteStream.write(padBytes); byte[] unencrypted = byteStream.toByteArray(); byteStream.close(); Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKeySpec keySpec = new SecretKeySpec(AES_KEY, "AES"); IvParameterSpec iv = new IvParameterSpec(AES_KEY, 0, 16); cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv); byte[] encrypted = cipher.doFinal(unencrypted); String result = BASE_64.encodeToString(encrypted); return result; } catch (Exception e) { throw new ThirdPartyEncryptException(ThirdPartyEncryptException.COMPUTE_ENCRYPT_TEXT_ERROR); } } /** * 暗号文を復号化します * @param text 復号化する暗号文 * @return 復号化されたプレーンテキスト */ private String decrypt(String text) throws ThirdPartyEncryptException { byte[] originalArr; try { // 復号化モードを AES CBC モードに設定します Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKeySpec keySpec = new SecretKeySpec(AES_KEY, "AES"); IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(AES_KEY, 0, 16)); cipher.init(Cipher.DECRYPT_MODE, keySpec, iv); // BASE64 を使用して暗号文をデコードします byte[] encrypted = Base64.decodeBase64(text); // 復号化 originalArr = cipher.doFinal(encrypted); } catch (Exception e) { throw new ThirdPartyEncryptException(ThirdPartyEncryptException.COMPUTE_DECRYPT_TEXT_ERROR); } String plainText; try { // パディング文字を削除します byte[] bytes = PKCS7Padding.removePaddingBytes(originalArr); // 16 ビットのランダム文字列、ネットワークバイトオーダー、および corpId を分離します byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20); int plainTextLegth = Utils.bytes2int(networkOrder); plainText = new String(Arrays.copyOfRange(bytes, 20, 20 + plainTextLegth), CHARSET); } catch (Exception e) { throw new ThirdPartyEncryptException(ThirdPartyEncryptException.COMPUTE_DECRYPT_TEXT_LENGTH_ERROR); } return plainText; } /** * デジタル署名 * * @param token isv トークン * @param timestamp タイムスタンプ * @param nonce ランダム文字列 * @param encrypt 暗号化されたテキスト * @return * @throws ThirdPartyEncryptException */ public String getSignature(String token, String timestamp, String nonce, String encrypt) throws ThirdPartyEncryptException { try { String[] array = new String[] {token, timestamp, nonce, encrypt}; Arrays.sort(array); System.out.println(JSON.toJSONString(array)); StringBuffer sb = new StringBuffer(); for (int i = 0; i < 4; i++) { sb.append(array[i]); } String str = sb.toString(); System.out.println(str); MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(str.getBytes()); byte[] digest = md.digest(); StringBuffer hexstr = new StringBuffer(); String shaHex = ""; for (int i = 0; i < digest.length; i++) { shaHex = Integer.toHexString(digest[i] & 0xFF); if (shaHex.length() < 2) { hexstr.append(0); } hexstr.append(shaHex); } return hexstr.toString(); } catch (Exception e) { throw new ThirdPartyEncryptException(ThirdPartyEncryptException.COMPUTE_SIGNATURE_ERROR); } } public static class Utils { public Utils() { } public static String getRandomStr(int count) { String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; Random random = new Random(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < count; ++i) { int number = random.nextInt(base.length()); sb.append(base.charAt(number)); } return sb.toString(); } public static byte[] int2Bytes(int count) { byte[] byteArr = new byte[] {(byte)(count >> 24 & 255), (byte)(count >> 16 & 255), (byte)(count >> 8 & 255), (byte)(count & 255)}; return byteArr; } public static int bytes2int(byte[] byteArr) { int count = 0; for (int i = 0; i < 4; ++i) { count <<= 8; count |= byteArr[i] & 255; } return count; } } public static class PKCS7Padding { private static final Charset CHARSET = StandardCharsets.UTF_8; private static final int BLOCK_SIZE = 32; public PKCS7Padding() { } public static byte[] getPaddingBytes(int count) { int amountToPad = 32 - count % 32; if (amountToPad == 0) { amountToPad = 32; } char padChr = chr(amountToPad); String tmp = new String(); for (int index = 0; index < amountToPad; ++index) { tmp = tmp + padChr; } return tmp.getBytes(CHARSET); } public static byte[] removePaddingBytes(byte[] decrypted) { int pad = decrypted[decrypted.length - 1]; if (pad < 1 || pad > 32) { pad = 0; } return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); } private static char chr(int a) { byte target = (byte)(a & 255); return (char)target; } } public static class ThirdPartyEncryptException extends Exception { public static final int SUCCESS = 0; public static final int ENCRYPTION_PLAINTEXT_ILLEGAL = 900001; public static final int ENCRYPTION_TIMESTAMP_ILLEGAL = 900002; public static final int ENCRYPTION_NONCE_ILLEGAL = 900003; public static final int AES_KEY_ILLEGAL = 900004; public static final int SIGNATURE_NOT_MATCH = 900005; public static final int COMPUTE_SIGNATURE_ERROR = 900006; public static final int COMPUTE_ENCRYPT_TEXT_ERROR = 900007; public static final int COMPUTE_DECRYPT_TEXT_ERROR = 900008; public static final int COMPUTE_DECRYPT_TEXT_LENGTH_ERROR = 900009; public static final int COMPUTE_DECRYPT_TEXT_CORPID_ERROR = 900010; private static Map<Integer, String> msgMap = new HashMap(); private Integer code; static { msgMap.put(0, "成功"); msgMap.put(900001, "暗号化プレーンテキストが不正です"); msgMap.put(900002, "暗号化タイムスタンプパラメータが不正です"); msgMap.put(900003, "暗号化ランダム文字列パラメータが不正です"); msgMap.put(900005, "署名が一致しません"); msgMap.put(900006, "署名の計算に失敗しました"); msgMap.put(900004, "不正な AES キー"); msgMap.put(900007, "暗号化テキストの計算エラー"); msgMap.put(900008, "復号化テキストの計算エラー"); msgMap.put(900009, "復号化テキストの長さが一致しません"); msgMap.put(900010, "復号化テキストの corpId が一致しません"); } public Integer getCode() { return this.code; } public ThirdPartyEncryptException(Integer exceptionCode) { super((String)msgMap.get(exceptionCode)); this.code = exceptionCode; } } static { try { Security.setProperty("crypto.policy", "limited"); RemoveCryptographyRestrictions(); } catch (Exception var1) { } } private static void RemoveCryptographyRestrictions() throws Exception { Class<?> jceSecurity = getClazz("javax.crypto.JceSecurity"); Class<?> cryptoPermissions = getClazz("javax.crypto.CryptoPermissions"); Class<?> cryptoAllPermission = getClazz("javax.crypto.CryptoAllPermission"); if (jceSecurity != null) { setFinalStaticValue(jceSecurity, "isRestricted", false); PermissionCollection defaultPolicy = (PermissionCollection)getFieldValue(jceSecurity, "defaultPolicy", (Object)null, PermissionCollection.class); if (cryptoPermissions != null) { Map<?, ?> map = (Map)getFieldValue(cryptoPermissions, "perms", defaultPolicy, Map.class); map.clear(); } if (cryptoAllPermission != null) { Permission permission = (Permission)getFieldValue(cryptoAllPermission, "INSTANCE", (Object)null, Permission.class); defaultPolicy.add(permission); } } } private static Class<?> getClazz(String className) { Class clazz = null; try { clazz = Class.forName(className); } catch (Exception var3) { } return clazz; } private static void setFinalStaticValue(Class<?> srcClazz, String fieldName, Object newValue) throws Exception { Field field = srcClazz.getDeclaredField(fieldName); field.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(field, field.getModifiers() & -17); field.set((Object)null, newValue); } private static <T> T getFieldValue(Class<?> srcClazz, String fieldName, Object owner, Class<T> dstClazz) throws Exception { Field field = srcClazz.getDeclaredField(fieldName); field.setAccessible(true); return dstClazz.cast(field.get(owner)); } }