Fixed a defect that allowed ancillary device providers to overwrite primary provider's data.
Showing
2 changed files
with
10 additions
and
5 deletions
| ... | @@ -290,12 +290,17 @@ public class GossipDeviceStore | ... | @@ -290,12 +290,17 @@ public class GossipDeviceStore |
| 290 | private DeviceEvent updateDevice(ProviderId providerId, | 290 | private DeviceEvent updateDevice(ProviderId providerId, |
| 291 | Device oldDevice, | 291 | Device oldDevice, |
| 292 | Device newDevice, Timestamp newTimestamp) { | 292 | Device newDevice, Timestamp newTimestamp) { |
| 293 | - | ||
| 294 | // We allow only certain attributes to trigger update | 293 | // We allow only certain attributes to trigger update |
| 295 | - if (!Objects.equals(oldDevice.hwVersion(), newDevice.hwVersion()) || | 294 | + boolean propertiesChanged = |
| 296 | - !Objects.equals(oldDevice.swVersion(), newDevice.swVersion()) || | 295 | + !Objects.equals(oldDevice.hwVersion(), newDevice.hwVersion()) || |
| 297 | - !AnnotationsUtil.isEqual(oldDevice.annotations(), newDevice.annotations())) { | 296 | + !Objects.equals(oldDevice.swVersion(), newDevice.swVersion()); |
| 298 | - | 297 | + boolean annotationsChanged = |
| 298 | + !AnnotationsUtil.isEqual(oldDevice.annotations(), newDevice.annotations()); | ||
| 299 | + | ||
| 300 | + // Primary providers can respond to all changes, but ancillary ones | ||
| 301 | + // should respond only to annotation changes. | ||
| 302 | + if ((providerId.isAncillary() && annotationsChanged) || | ||
| 303 | + (!providerId.isAncillary() && (propertiesChanged || annotationsChanged))) { | ||
| 299 | boolean replaced = devices.replace(newDevice.id(), oldDevice, newDevice); | 304 | boolean replaced = devices.replace(newDevice.id(), oldDevice, newDevice); |
| 300 | if (!replaced) { | 305 | if (!replaced) { |
| 301 | verify(replaced, | 306 | verify(replaced, | ... | ... |
This diff is collapsed. Click to expand it.
-
Please register or login to post a comment