diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..395dde9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.iml +.idea/ +target/ \ No newline at end of file diff --git a/jetbra-agent/pom.xml b/jetbra-agent/pom.xml index 4b09e1c..1e35d70 100644 --- a/jetbra-agent/pom.xml +++ b/jetbra-agent/pom.xml @@ -47,6 +47,7 @@ true + jetbra-agent diff --git a/jetbra-agent/src/main/java/win/novice/li/AgentMain.java b/jetbra-agent/src/main/java/win/novice/li/AgentMain.java index c55076b..ce29191 100644 --- a/jetbra-agent/src/main/java/win/novice/li/AgentMain.java +++ b/jetbra-agent/src/main/java/win/novice/li/AgentMain.java @@ -13,7 +13,7 @@ public class AgentMain { AgentBuilder agentBuilder = newAgentBuilder(); agentBuilder.type(ElementMatchers.named("java.security.cert.PKIXBuilderParameters")) .transform((builder, typeDescription, classLoader, module, protectionDomain) -> builder - .visit(Advice.to(PKIXBuilderParameters.class) + .visit(Advice.to(PKIXBuilderParametersAdvice.class) .on(ElementMatchers.isConstructor().and(ElementMatchers.takesArgument(0, Set.class))))) .asTerminalTransformation() .type(ElementMatchers.named("sun.net.www.http.HttpClient")) diff --git a/jetbra-agent/src/main/java/win/novice/li/PKIXBuilderParameters.java b/jetbra-agent/src/main/java/win/novice/li/PKIXBuilderParametersAdvice.java similarity index 92% rename from jetbra-agent/src/main/java/win/novice/li/PKIXBuilderParameters.java rename to jetbra-agent/src/main/java/win/novice/li/PKIXBuilderParametersAdvice.java index 8848feb..9123702 100644 --- a/jetbra-agent/src/main/java/win/novice/li/PKIXBuilderParameters.java +++ b/jetbra-agent/src/main/java/win/novice/li/PKIXBuilderParametersAdvice.java @@ -2,13 +2,12 @@ package win.novice.li; import net.bytebuddy.asm.Advice; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.security.cert.TrustAnchor; import java.util.HashSet; import java.util.Set; -public class PKIXBuilderParameters { +public class PKIXBuilderParametersAdvice { @Advice.OnMethodEnter diff --git a/script/install-all-users.vbs b/script/install-all-users.vbs new file mode 100644 index 0000000..cc5512d --- /dev/null +++ b/script/install-all-users.vbs @@ -0,0 +1,73 @@ +If Not WScript.Arguments.Named.Exists("elevate") Then + CreateObject("Shell.Application").ShellExecute WScript.FullName, """" & WScript.ScriptFullName & """ /elevate", "", "runas", 10 + WScript.Quit +End If + +Set oShell = CreateObject("WScript.Shell") +Set oEnvSystem = oShell.Environment("SYSTEM") +Set oFS = CreateObject("Scripting.FileSystemObject") + +Dim sBasePath, sJarFile +sBasePath = oFS.GetParentFolderName(oFS.GetParentFolderName(WScript.ScriptFullName)) +sJarFile = sBasePath & "\jetbra-agent.jar" + +If Not oFS.FileExists(sJarFile) Then + MsgBox "jetbra-agent.jar not found", vbOKOnly Or vbCritical + WScript.Quit -1 +End If + +MsgBox "It may take a few seconds to execute this script." & vbCrLf & vbCrLf & "Click 'OK' button and wait for the prompt of 'Done.' to pop up!" + +Dim sEnvKey, sEnvVal, aJBProducts +aJBProducts = Array("idea", "clion", "phpstorm", "goland", "pycharm", "webstorm", "webide", "rider", "datagrip", "rubymine", "appcode", "dataspell", "gateway", "jetbrains_client", "jetbrainsclient", "studio", "devecostudio") + +Set re = New RegExp +re.Global = True +re.IgnoreCase = True +re.Pattern = "^\-javaagent:.*[\/\\]jetbra\-agent\.jar.*" + +Sub RemoveEnv(env) + On Error Resume Next + + For Each sPrd in aJBProducts + sEnvKey = UCase(sPrd) & "_VM_OPTIONS" + sEnvVal = oShell.ExpandEnvironmentStrings("%" & sEnvKey & "%") + If sEnvVal <> ("%" & sEnvKey & "%") Then + env.Remove(sEnvKey) + End If + Next +End Sub + +RemoveEnv oShell.Environment("USER") + +Dim sVmOptionsFile +For Each sPrd in aJBProducts + sEnvKey = UCase(sPrd) & "_VM_OPTIONS" + sVmOptionsFile = sBasePath & "\vmoptions\" & sPrd & ".vmoptions" + If oFS.FileExists(sVmOptionsFile) Then + ProcessVmOptions sVmOptionsFile + oEnvSystem(sEnvKey) = sVmOptionsFile + End If +Next + +Sub ProcessVmOptions(ByVal file) + Dim sLine, sNewContent, bMatch + Set oFile = oFS.OpenTextFile(file, 1, 0) + + sNewContent = "" + Do Until oFile.AtEndOfStream + sLine = oFile.ReadLine + bMatch = re.Test(sLine) + If Not bMatch Then + sNewContent = sNewContent & sLine & vbLf + End If + Loop + oFile.Close + + sNewContent = sNewContent & "-javaagent:" & sJarFile & "=jetbrains" + Set oFile = oFS.OpenTextFile(file, 2, 0) + oFile.Write sNewContent + oFile.Close +End Sub + +MsgBox "Done." diff --git a/script/install-current-user.vbs b/script/install-current-user.vbs new file mode 100644 index 0000000..c991525 --- /dev/null +++ b/script/install-current-user.vbs @@ -0,0 +1,54 @@ +Set oShell = CreateObject("WScript.Shell") +Set oEnv = oShell.Environment("USER") +Set oFS = CreateObject("Scripting.FileSystemObject") + +Dim sEnvKey, sEnvVal, aJBProducts +aJBProducts = Array("idea", "clion", "phpstorm", "goland", "pycharm", "webstorm", "webide", "rider", "datagrip", "rubymine", "appcode", "dataspell", "gateway", "jetbrains_client", "jetbrainsclient", "studio", "devecostudio") + +Set re = New RegExp +re.Global = True +re.IgnoreCase = True +re.Pattern = "^\-javaagent:.*[\/\\]jetbra\-agent\.jar.*" + +Dim sBasePath, sJarFile +sBasePath = oFS.GetParentFolderName(oShell.CurrentDirectory) +sJarFile = sBasePath & "\jetbra-agent.jar" + +If Not oFS.FileExists(sJarFile) Then + MsgBox "jetbra-agent.jar not found", vbOKOnly Or vbCritical + WScript.Quit -1 +End If + +MsgBox "It may take a few seconds to execute this script." & vbCrLf & vbCrLf & "Click 'OK' button and wait for the prompt of 'Done.' to pop up!" + +Dim sVmOptionsFile +For Each sPrd in aJBProducts + sEnvKey = UCase(sPrd) & "_VM_OPTIONS" + sVmOptionsFile = sBasePath & "\vmoptions\" & sPrd & ".vmoptions" + If oFS.FileExists(sVmOptionsFile) Then + ProcessVmOptions sVmOptionsFile + oEnv(sEnvKey) = sVmOptionsFile + End If +Next + +Sub ProcessVmOptions(ByVal file) + Dim sLine, sNewContent, bMatch + Set oFile = oFS.OpenTextFile(file, 1, 0) + + sNewContent = "" + Do Until oFile.AtEndOfStream + sLine = oFile.ReadLine + bMatch = re.Test(sLine) + If Not bMatch Then + sNewContent = sNewContent & sLine & vbLf + End If + Loop + oFile.Close + + sNewContent = sNewContent & "-javaagent:" & sJarFile & "=jetbrains" + Set oFile = oFS.OpenTextFile(file, 2, 0) + oFile.Write sNewContent + oFile.Close +End Sub + +MsgBox "Done." diff --git a/script/install.sh b/script/install.sh new file mode 100755 index 0000000..b158c60 --- /dev/null +++ b/script/install.sh @@ -0,0 +1,91 @@ +#!/bin/sh + +set -e + +OS_NAME=$(uname -s) +JB_PRODUCTS="idea clion phpstorm goland pycharm webstorm webide rider datagrip rubymine appcode dataspell gateway jetbrains_client jetbrainsclient studio devecostudio" + +BASE_PATH=$(dirname $( + cd $(dirname "$0") + pwd +)) + +JAR_FILE_PATH="${BASE_PATH}/jetbra-agent.jar" + +if [ ! -f "${JAR_FILE_PATH}" ]; then + echo 'jetbra-agent.jar not found' + exit -1 +fi + +KDE_ENV_DIR="${HOME}/.config/plasma-workspace/env" +LAUNCH_AGENTS_DIR="${HOME}/Library/LaunchAgents" + +PROFILE_PATH="${HOME}/.profile" +ZSH_PROFILE_PATH="${HOME}/.zshrc" +PLIST_PATH="${LAUNCH_AGENTS_DIR}/jetbrains.vmoptions.plist" + +if [ $OS_NAME = "Darwin" ]; then + BASH_PROFILE_PATH="${HOME}/.bash_profile" + + mkdir -p "${LAUNCH_AGENTS_DIR}" + echo 'Labeljetbrains.vmoptionsProgramArgumentssh-c' >"${PLIST_PATH}" +else + BASH_PROFILE_PATH="${HOME}/.bashrc" + mkdir -p "${KDE_ENV_DIR}" +fi + +touch "${PROFILE_PATH}" +touch "${BASH_PROFILE_PATH}" +touch "${ZSH_PROFILE_PATH}" + +MY_VMOPTIONS_SHELL_NAME="jetbrains.vmoptions.sh" +MY_VMOPTIONS_SHELL_FILE="${HOME}/.${MY_VMOPTIONS_SHELL_NAME}" +echo '#!/bin/sh' >"${MY_VMOPTIONS_SHELL_FILE}" + +EXEC_LINE='___MY_VMOPTIONS_SHELL_FILE="${HOME}/.jetbrains.vmoptions.sh"; if [ -f "${___MY_VMOPTIONS_SHELL_FILE}" ]; then . "${___MY_VMOPTIONS_SHELL_FILE}"; fi' + +for PRD in $JB_PRODUCTS; do + VM_FILE_PATH="${BASE_PATH}/vmoptions/${PRD}.vmoptions" + if [ ! -f "${VM_FILE_PATH}" ]; then + continue + fi + + if [ $OS_NAME = "Darwin" ]; then + sed -i '' '/^\-javaagent:.*[\/\\]jetbra\-agent\.jar.*/d' "${VM_FILE_PATH}" + else + sed -i '/^\-javaagent:.*[\/\\]jetbra\-agent\.jar.*/d' "${VM_FILE_PATH}" + fi + + echo "-javaagent:${JAR_FILE_PATH}=jetbrains" >>"${VM_FILE_PATH}" + + ENV_NAME=$(echo $PRD | tr '[a-z]' '[A-Z]')"_VM_OPTIONS" + echo "export ${ENV_NAME}=\"${VM_FILE_PATH}\"" >>"${MY_VMOPTIONS_SHELL_FILE}" + + if [ $OS_NAME = "Darwin" ]; then + launchctl setenv "${ENV_NAME}" "${VM_FILE_PATH}" + echo "launchctl setenv \"${ENV_NAME}\" \"${VM_FILE_PATH}\"" >>"${PLIST_PATH}" + fi +done + +if [ $OS_NAME = "Darwin" ]; then + sed -i '' '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${PROFILE_PATH}" >/dev/null 2>&1 + sed -i '' '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${BASH_PROFILE_PATH}" >/dev/null 2>&1 + sed -i '' '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${ZSH_PROFILE_PATH}" >/dev/null 2>&1 + + echo 'RunAtLoad' >>"${PLIST_PATH}" +else + sed -i '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${PROFILE_PATH}" >/dev/null 2>&1 + sed -i '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${BASH_PROFILE_PATH}" >/dev/null 2>&1 + sed -i '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${ZSH_PROFILE_PATH}" >/dev/null 2>&1 +fi + +echo "${EXEC_LINE}" >>"${PROFILE_PATH}" +echo "${EXEC_LINE}" >>"${BASH_PROFILE_PATH}" +echo "${EXEC_LINE}" >>"${ZSH_PROFILE_PATH}" + +if [ $OS_NAME = "Darwin" ]; then + echo 'done. the "kill Dock" command can fix the crash issue.' +else + ln -sf "${MY_VMOPTIONS_SHELL_FILE}" "${KDE_ENV_DIR}/${MY_VMOPTIONS_SHELL_NAME}" + echo "done. you'd better log off first!" +fi diff --git a/script/uninstall-all-users.vbs b/script/uninstall-all-users.vbs new file mode 100644 index 0000000..e1be5e0 --- /dev/null +++ b/script/uninstall-all-users.vbs @@ -0,0 +1,28 @@ +If Not WScript.Arguments.Named.Exists("elevate") Then + CreateObject("Shell.Application").ShellExecute WScript.FullName, """" & WScript.ScriptFullName & """ /elevate", "", "runas", 10 + WScript.Quit +End If + +MsgBox "It may take a few seconds to execute this script." & vbCrLf & vbCrLf & "Click 'OK' button and wait for the prompt of 'Done.' to pop up!" + +Sub RemoveEnv(env) + On Error Resume Next + + Dim sEnvKey, sEnvVal, aJBProducts + aJBProducts = Array("idea", "clion", "phpstorm", "goland", "pycharm", "webstorm", "webide", "rider", "datagrip", "rubymine", "appcode", "dataspell", "gateway", "jetbrains_client", "jetbrainsclient", "studio", "devecostudio") + + For Each sPrd in aJBProducts + sEnvKey = UCase(sPrd) & "_VM_OPTIONS" + sEnvVal = oShell.ExpandEnvironmentStrings("%" & sEnvKey & "%") + If sEnvVal <> ("%" & sEnvKey & "%") Then + env.Remove(sEnvKey) + End If + Next +End Sub + +Set oShell = CreateObject("WScript.Shell") + +RemoveEnv oShell.Environment("USER") +RemoveEnv oShell.Environment("SYSTEM") + +MsgBox "Done." diff --git a/script/uninstall-current-user.vbs b/script/uninstall-current-user.vbs new file mode 100644 index 0000000..34be3f1 --- /dev/null +++ b/script/uninstall-current-user.vbs @@ -0,0 +1,17 @@ +Set oShell = CreateObject("WScript.Shell") +Set oEnv = oShell.Environment("USER") + +Dim sEnvKey, sEnvVal, aJBProducts +aJBProducts = Array("idea", "clion", "phpstorm", "goland", "pycharm", "webstorm", "webide", "rider", "datagrip", "rubymine", "appcode", "dataspell", "gateway", "jetbrains_client", "jetbrainsclient", "studio", "devecostudio") + +MsgBox "It may take a few seconds to execute this script." & vbCrLf & vbCrLf & "Click 'OK' button and wait for the prompt of 'Done.' to pop up!" + +For Each sPrd in aJBProducts + sEnvKey = UCase(sPrd) & "_VM_OPTIONS" + sEnvVal = oShell.ExpandEnvironmentStrings("%" & sEnvKey & "%") + If sEnvVal <> ("%" & sEnvKey & "%") Then + oEnv.Remove(sEnvKey) + End If +Next + +MsgBox "Done." diff --git a/script/uninstall.sh b/script/uninstall.sh new file mode 100755 index 0000000..4de2fce --- /dev/null +++ b/script/uninstall.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +set -e + +OS_NAME=$(uname -s) +JB_PRODUCTS="idea clion phpstorm goland pycharm webstorm webide rider datagrip rubymine appcode dataspell gateway jetbrains_client jetbrainsclient studio devecostudio" + +KDE_ENV_DIR="${HOME}/.config/plasma-workspace/env" + +PROFILE_PATH="${HOME}/.profile" +ZSH_PROFILE_PATH="${HOME}/.zshrc" +PLIST_PATH="${HOME}/Library/LaunchAgents/jetbrains.vmoptions.plist" + +if [ $OS_NAME = "Darwin" ]; then + BASH_PROFILE_PATH="${HOME}/.bash_profile" +else + BASH_PROFILE_PATH="${HOME}/.bashrc" +fi + +touch "${PROFILE_PATH}" +touch "${BASH_PROFILE_PATH}" +touch "${ZSH_PROFILE_PATH}" + +MY_VMOPTIONS_SHELL_NAME="jetbrains.vmoptions.sh" +MY_VMOPTIONS_SHELL_FILE="${HOME}/.${MY_VMOPTIONS_SHELL_NAME}" + +rm -rf "${MY_VMOPTIONS_SHELL_FILE}" + +if [ $OS_NAME = "Darwin" ]; then + for PRD in $JB_PRODUCTS; do + ENV_NAME=$(echo $PRD | tr '[a-z]' '[A-Z]')"_VM_OPTIONS" + + launchctl unsetenv "${ENV_NAME}" + done + + rm -rf "${PLIST_PATH}" + + sed -i '' '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${PROFILE_PATH}" >/dev/null 2>&1 + sed -i '' '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${BASH_PROFILE_PATH}" >/dev/null 2>&1 + sed -i '' '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${ZSH_PROFILE_PATH}" >/dev/null 2>&1 + + echo 'done.' +else + sed -i '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${PROFILE_PATH}" >/dev/null 2>&1 + sed -i '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${BASH_PROFILE_PATH}" >/dev/null 2>&1 + sed -i '/___MY_VMOPTIONS_SHELL_FILE="${HOME}\/\.jetbrains\.vmoptions\.sh"; if /d' "${ZSH_PROFILE_PATH}" >/dev/null 2>&1 + + rm -rf "${KDE_ENV_DIR}/${MY_VMOPTIONS_SHELL_NAME}" + echo "done. you'd better log off first!" +fi