Modify set-value function from external

    Move Special mode from bmcweb to dbus-sensors, this will be handled via dbus-sensor when the user set-value f$
    This is unlikely to break any users because the Intel special mode function is no change, only move to dbus-s$

    The set value function is to filter the external set, excluding the internal set.
    In the external set, if in INSECURE_UNRESTRICTED_SENSOR_OVERRIDE, no need to check before set value else add $

    bmcweb needs to be merged at the same time.
    bmcweb changes are pushed to Gerrit:
    https://gerrit.openbmc-project.xyz/c/openbmc/bmcweb/+/42448

    the mailing list discussion links:
    https://lists.ozlabs.org/pipermail/openbmc/2021-March/025597.html

Signed-off-by: Bruce Lee <Bruce_Lee@quantatw.com>
Change-Id: I0919e4d2343e81045010a2b0d4bf01dc272bcb07
diff --git a/include/sensor.hpp b/include/sensor.hpp
index d1fb22e..b98241b 100644
--- a/include/sensor.hpp
+++ b/include/sensor.hpp
@@ -1,4 +1,5 @@
 #pragma once
+#include "dbus-sensor_config.h"
 
 #include <SensorPaths.hpp>
 #include <Thresholds.hpp>
@@ -39,12 +40,13 @@
     Sensor(const std::string& name,
            std::vector<thresholds::Threshold>&& thresholdData,
            const std::string& configurationPath, const std::string& objectType,
-           const double max, const double min,
+           bool isSettable, const double max, const double min,
            std::shared_ptr<sdbusplus::asio::connection>& conn,
            PowerState readState = PowerState::always) :
         name(sensor_paths::escapePathForDbus(name)),
         configurationPath(configurationPath), objectType(objectType),
-        maxValue(max), minValue(min), thresholds(std::move(thresholdData)),
+        isSensorSettable(isSettable), maxValue(max), minValue(min),
+        thresholds(std::move(thresholdData)),
         hysteresisTrigger((max - min) * 0.01),
         hysteresisPublish((max - min) * 0.0001), dbusConnection(conn),
         readState(readState), errCount(0),
@@ -57,6 +59,7 @@
     std::string name;
     std::string configurationPath;
     std::string objectType;
+    bool isSensorSettable;
     double maxValue;
     double minValue;
     std::vector<thresholds::Threshold> thresholds;
@@ -173,6 +176,18 @@
     {
         if (!internalSet)
         {
+            if (insecureSensorOverride == false)
+            { // insecure sesnor override.
+                if (isSensorSettable == false)
+                { // sensor is not settable.
+                    if (getManufacturingMode() == false)
+                    { // manufacture mode is not enable.
+                        throw sdbusplus::exception::SdBusError(
+                            -EACCES, "Not allow set porperty value.");
+                    }
+                }
+            }
+
             oldValue = newValue;
             overriddenState = true;
             // check thresholds for external set