From aace9b8a95b7e2ace6e6806e699a3fa4eba04489 Mon Sep 17 00:00:00 2001 From: caihongwen <785427346@qq.com> Date: Wed, 25 May 2022 23:05:56 +0800 Subject: [PATCH] fix(#7039): Temporary fix encryptedContent bug. --- .../nacos/client/config/impl/CacheData.java | 79 ++++++++++++------- .../client/config/impl/ClientWorker.java | 3 +- .../config/impl/ConfigChangeHandler.java | 3 +- 3 files changed, 56 insertions(+), 29 deletions(-) diff --git a/client/src/main/java/com/alibaba/nacos/client/config/impl/CacheData.java b/client/src/main/java/com/alibaba/nacos/client/config/impl/CacheData.java index 1bc230a190d..fdfb6b79a5f 100644 --- a/client/src/main/java/com/alibaba/nacos/client/config/impl/CacheData.java +++ b/client/src/main/java/com/alibaba/nacos/client/config/impl/CacheData.java @@ -18,6 +18,7 @@ import com.alibaba.nacos.api.common.Constants; import com.alibaba.nacos.api.config.ConfigChangeEvent; +import com.alibaba.nacos.api.config.ConfigChangeItem; import com.alibaba.nacos.api.config.listener.AbstractSharedListener; import com.alibaba.nacos.api.config.listener.Listener; import com.alibaba.nacos.api.exception.NacosException; @@ -134,7 +135,7 @@ public String getContent() { public void setContent(String content) { this.content = content; - this.md5 = getMd5String(this.content); + this.md5 = getMd5String(); } /** @@ -173,8 +174,8 @@ public void addListener(Listener listener) { throw new IllegalArgumentException("listener is null"); } ManagerListenerWrap wrap = - (listener instanceof AbstractConfigChangeListener) ? new ManagerListenerWrap(listener, md5, content) - : new ManagerListenerWrap(listener, md5); + (listener instanceof AbstractConfigChangeListener) ? new ManagerListenerWrap(listener, md5, content, + encryptedDataKey) : new ManagerListenerWrap(listener, md5); if (listeners.addIfAbsent(wrap)) { LOGGER.info("[{}] [add-listener] ok, tenant={}, dataId={}, group={}, cnt={}", name, tenant, dataId, group, @@ -317,11 +318,22 @@ private void safeNotifyListener(final String dataId, final String group, final S listener.receiveConfigInfo(contentTmp); // compare lastContent and content if (listener instanceof AbstractConfigChangeListener) { - Map data = ConfigChangeHandler.getInstance() - .parseChangeData(listenerWrap.lastContent, content, type); + // FIXME temporary fix https://github.com/alibaba/nacos/issues/7039 + ConfigResponse crLast = new ConfigResponse(); + crLast.setDataId(dataId); + crLast.setGroup(group); + crLast.setTenant(tenant); + crLast.setContent(listenerWrap.lastContent); + crLast.setEncryptedDataKey(listenerWrap.lastEncryptedDataKey); + configFilterChainManager.doFilter(null, crLast); + String lastContentTmp = crLast.getContent(); + Map data = ConfigChangeHandler.getInstance() + .parseChangeData(lastContentTmp, contentTmp, type); ConfigChangeEvent event = new ConfigChangeEvent(data); ((AbstractConfigChangeListener) listener).receiveConfigChange(event); + // temporary fix https://github.com/alibaba/nacos/issues/7039, cache original content(which get from nacos server) listenerWrap.lastContent = content; + listenerWrap.lastEncryptedDataKey = encryptedDataKey; } listenerWrap.lastCallMd5 = md5; @@ -367,8 +379,31 @@ private void safeNotifyListener(final String dataId, final String group, final S name, (finishNotify - startNotify), dataId, group, md5, listener); } - public static String getMd5String(String config) { - return (null == config) ? Constants.NULL : MD5Utils.md5Hex(config, Constants.ENCODE); + /** + * FIXME temporary fix https://github.com/alibaba/nacos/issues/7039 + */ + public String getMd5String() { + if (null == this.content) { + return Constants.NULL; + } + if (this.encryptedDataKey == null || this.encryptedDataKey.isEmpty()) { + return MD5Utils.md5Hex(this.content, Constants.ENCODE); + } + + try { + ConfigResponse cr = new ConfigResponse(); + cr.setDataId(this.dataId); + cr.setGroup(this.group); + cr.setTenant(this.tenant); + cr.setEncryptedDataKey(this.encryptedDataKey); + cr.setContent(this.content); + configFilterChainManager.doFilter(null, cr); + return MD5Utils.md5Hex(cr.getContent(), Constants.ENCODE); + } catch (NacosException e) { + LOGGER.error("[CacheData-getMd5String] error by encryptedDataKey={},config={}", this.encryptedDataKey, + this.content, e); + return Constants.NULL; + } } private String loadCacheContentFromDiskLocal(String name, String dataId, String group, String tenant) { @@ -392,21 +427,7 @@ public void setSyncWithServer(boolean syncWithServer) { } public CacheData(ConfigFilterChainManager configFilterChainManager, String name, String dataId, String group) { - if (null == dataId || null == group) { - throw new IllegalArgumentException("dataId=" + dataId + ", group=" + group); - } - this.name = name; - this.configFilterChainManager = configFilterChainManager; - this.dataId = dataId; - this.group = group; - this.tenant = TenantUtil.getUserTenantForAcm(); - listeners = new CopyOnWriteArrayList<>(); - this.isInitializing = true; - if (initSnapshot) { - this.content = loadCacheContentFromDiskLocal(name, dataId, group, tenant); - this.md5 = getMd5String(content); - } - this.encryptedDataKey = loadEncryptedDataKeyFromDiskLocal(name, dataId, group, tenant); + this(configFilterChainManager, name, dataId, group, TenantUtil.getUserTenantForAcm()); } public CacheData(ConfigFilterChainManager configFilterChainManager, String name, String dataId, String group, @@ -414,16 +435,17 @@ public CacheData(ConfigFilterChainManager configFilterChainManager, String name, if (null == dataId || null == group) { throw new IllegalArgumentException("dataId=" + dataId + ", group=" + group); } - this.name = name; this.configFilterChainManager = configFilterChainManager; + this.name = name; this.dataId = dataId; this.group = group; this.tenant = tenant; - listeners = new CopyOnWriteArrayList<>(); + this.listeners = new CopyOnWriteArrayList<>(); this.isInitializing = true; if (initSnapshot) { this.content = loadCacheContentFromDiskLocal(name, dataId, group, tenant); - this.md5 = getMd5String(content); + this.encryptedDataKey = loadEncryptedDataKeyFromDiskLocal(name, dataId, group, tenant); + this.md5 = getMd5String(); } } @@ -453,10 +475,12 @@ private static class ManagerListenerWrap { final Listener listener; - String lastCallMd5 = CacheData.getMd5String(null); + String lastCallMd5 = Constants.NULL; String lastContent = null; + String lastEncryptedDataKey = null; + ManagerListenerWrap(Listener listener) { this.listener = listener; } @@ -466,10 +490,11 @@ private static class ManagerListenerWrap { this.lastCallMd5 = md5; } - ManagerListenerWrap(Listener listener, String md5, String lastContent) { + ManagerListenerWrap(Listener listener, String md5, String lastContent, String encryptedDataKey) { this.listener = listener; this.lastCallMd5 = md5; this.lastContent = lastContent; + this.lastEncryptedDataKey = encryptedDataKey; } @Override diff --git a/client/src/main/java/com/alibaba/nacos/client/config/impl/ClientWorker.java b/client/src/main/java/com/alibaba/nacos/client/config/impl/ClientWorker.java index c5efb089563..d4a0e64f948 100644 --- a/client/src/main/java/com/alibaba/nacos/client/config/impl/ClientWorker.java +++ b/client/src/main/java/com/alibaba/nacos/client/config/impl/ClientWorker.java @@ -362,6 +362,7 @@ public CacheData addCacheDataIfAbsent(String dataId, String group, String tenant // fix issue # 1317 if (enableRemoteSyncConfig) { ConfigResponse response = getServerConfig(dataId, group, tenant, 3000L, false); + cache.setEncryptedDataKey(response.getEncryptedDataKey()); cache.setContent(response.getContent()); } } @@ -432,8 +433,8 @@ private void refreshContentAndCheck(CacheData cacheData, boolean notify) { try { ConfigResponse response = getServerConfig(cacheData.dataId, cacheData.group, cacheData.tenant, 3000L, notify); - cacheData.setContent(response.getContent()); cacheData.setEncryptedDataKey(response.getEncryptedDataKey()); + cacheData.setContent(response.getContent()); if (null != response.getConfigType()) { cacheData.setType(response.getConfigType()); } diff --git a/client/src/main/java/com/alibaba/nacos/client/config/impl/ConfigChangeHandler.java b/client/src/main/java/com/alibaba/nacos/client/config/impl/ConfigChangeHandler.java index ef6f9488dba..c7880ed8f7b 100644 --- a/client/src/main/java/com/alibaba/nacos/client/config/impl/ConfigChangeHandler.java +++ b/client/src/main/java/com/alibaba/nacos/client/config/impl/ConfigChangeHandler.java @@ -16,6 +16,7 @@ package com.alibaba.nacos.client.config.impl; +import com.alibaba.nacos.api.config.ConfigChangeItem; import com.alibaba.nacos.api.config.listener.ConfigChangeParser; import com.alibaba.nacos.common.spi.NacosServiceLoader; @@ -65,7 +66,7 @@ public static ConfigChangeHandler getInstance() { * @return change data map * @throws IOException io exception */ - public Map parseChangeData(String oldContent, String newContent, String type) throws IOException { + public Map parseChangeData(String oldContent, String newContent, String type) throws IOException { for (ConfigChangeParser changeParser : this.parserList) { if (changeParser.isResponsibleFor(type)) { return changeParser.doParse(oldContent, newContent, type);