requiring policy re-acceptance only if major version differs (IDEA-153084)

This commit is contained in:
Eugene Zhuravlev
2016-03-16 13:35:53 +01:00
parent e93a112729
commit 6704dceec7
3 changed files with 41 additions and 64 deletions
@@ -17,6 +17,7 @@ package com.intellij.ide;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.annotations.NotNull;
@@ -35,10 +36,7 @@ public final class PrivacyPolicy {
private static final String VERSION_COMMENT_START = "<!--";
private static final String VERSION_COMMENT_END = "-->";
private static final String ACCEPTED_VERSION_KEY = "JetBrains.privacy_policy.accepted_version";
private static final Version EMBEDDED_VERSION = new Version(1, 0);
private static final Version MAGIC_VERSION = new Version(999, 999);
@Nullable
private static volatile Version ourLatestVersion;
private static final File ourCachedPolicyFile;
static {
@@ -75,9 +73,12 @@ public final class PrivacyPolicy {
ourCachedPolicyFile = new File(dataDir, CACHED_RESOURCE_NAME);
}
public static boolean isLatestVersionAccepted() {
final Version latest = getLatestVersion();
return getAcceptedVersion().equals(latest) || MAGIC_VERSION.equals(latest);
public static boolean isVersionAccepted(final Version ver) {
if (ver.isUnknown() || MAGIC_VERSION.equals(ver)) {
return true;
}
final Version currentAccepted = getAcceptedVersion();
return !currentAccepted.isUnknown() && currentAccepted.getMajor() == ver.getMajor() ;
}
public static void setVersionAccepted(@NotNull Version version) {
@@ -89,50 +90,22 @@ public final class PrivacyPolicy {
}
}
@NotNull
public static Version getLatestVersion() {
final Version cached = ourLatestVersion;
if (cached != null) {
return cached;
}
Version latest = EMBEDDED_VERSION;
if (ourCachedPolicyFile.exists()) {
try {
final Version version = loadVersion(new FileInputStream(ourCachedPolicyFile));
if (!version.isUnknown() && version.compareTo(latest) > 0) {
latest = version;
}
}
catch (FileNotFoundException ignored) {
}
}
ourLatestVersion = latest;
return latest;
}
@NotNull
public static Version getAcceptedVersion() {
return Version.fromString(Prefs.get(ACCEPTED_VERSION_KEY, null));
}
public static String getText() {
return getText(getLatestVersion());
}
@NotNull
public static String getText(@NotNull Version version) {
String text = null;
public static Pair<Version, String> getContent() {
try {
if (EMBEDDED_VERSION.equals(version)) {
text = loadText(PrivacyPolicy.class.getResourceAsStream("/PrivacyPolicy-" + EMBEDDED_VERSION + ".html"));
}
else {
text = loadText(new FileInputStream(ourCachedPolicyFile));
final Pair<Version, String> fromFile = loadContent(new FileInputStream(ourCachedPolicyFile));
if (!fromFile.getFirst().isUnknown()) {
return fromFile;
}
}
catch (Exception ignored) {
catch (IOException ignored) {
}
return text == null? "" : text;
return loadContent(PrivacyPolicy.class.getResourceAsStream("/PrivacyPolicy.html"));
}
public static void updateText(String text) {
@@ -142,18 +115,16 @@ public final class PrivacyPolicy {
catch (IOException e) {
LOG.info(e);
}
finally {
ourLatestVersion = null; // clear cache
}
}
@Nullable
private static String loadText(InputStream stream) {
@NotNull
private static Pair<Version, String> loadContent(InputStream stream) {
try {
if (stream != null) {
final Reader reader = new InputStreamReader(stream, "utf-8");
try {
return new String(FileUtil.adaptiveLoadText(reader));
final String text = new String(FileUtil.adaptiveLoadText(reader));
return Pair.create(parseVersion(text), text);
}
finally {
reader.close();
@@ -163,13 +134,13 @@ public final class PrivacyPolicy {
catch (IOException e) {
LOG.info(e);
}
return null;
return Pair.create(Version.UNKNOWN, "");
}
@NotNull
private static Version loadVersion(final InputStream is) {
private static Version parseVersion(String text) {
try {
final BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
final BufferedReader reader = new BufferedReader(new StringReader(text));
try {
final String line = reader.readLine();
if (line != null) {
@@ -220,6 +191,14 @@ public final class PrivacyPolicy {
return myMajor < 0 || myMinor < 0;
}
public int getMajor() {
return myMajor;
}
public int getMinor() {
return myMinor;
}
@Override
public int compareTo(Version other) {
if (isUnknown()) {
@@ -32,6 +32,7 @@ import com.intellij.openapi.application.impl.ApplicationImpl;
import com.intellij.openapi.application.impl.ApplicationInfoImpl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.ShutDownTracker;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.SystemInfoRt;
@@ -153,21 +154,18 @@ public class StartupUtil {
if (!Main.isHeadless()) {
AppUIUtil.updateWindowIcon(JOptionPane.getRootFrame());
AppUIUtil.registerBundledFonts();
if (!PrivacyPolicy.isLatestVersionAccepted()) {
final PrivacyPolicy.Version latestVersion = PrivacyPolicy.getLatestVersion();
final String text = PrivacyPolicy.getText(latestVersion);
if (!text.isEmpty()) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
showPrivacyPolicyAgreement(text);
}
});
PrivacyPolicy.setVersionAccepted(latestVersion);
}
catch (Exception ignored) {
}
final Pair<PrivacyPolicy.Version, String> policy = PrivacyPolicy.getContent();
if (!PrivacyPolicy.isVersionAccepted(policy.getFirst())) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
showPrivacyPolicyAgreement(policy.getSecond());
}
});
PrivacyPolicy.setVersionAccepted(policy.getFirst());
}
catch (Exception ignored) {
}
}
}