Added Intel AMT ME real time notification infra to LMS. Notification support now actively captures all the INTEL AMT ME events by plugging in to APF infra. These events message are in the WsMan XML format. WsMan XML is parsed to get the AlertID and Message arguments. A map is initialized initially by reading AMTAlerts.xml which provides alertid,messageArguements and verbose description. From AlertID, verbose description is obtained and then using d-bus infra verbose description is notified to the user. src/tools/utils.cpp Utils class provides static methods for string manipulation and desktop notification. src/tools/miniXmlParser.cpp MiniXmlParser class provide methods for parsing the xmlBuffer, validation and retreving tag/value. src/tools/httpParser.cpp HttpParser class provides method to parse http response buffer and populate header,body,headerfields properties. src/alertDescription.cpp AlertDescription class parses AMTAlerts.xml like xml to populate map of alertId-Arguments and verbose desctiption. src/alertIndication.cpp AlertIndication class provides binding to some xmlTags. It uses MiniXmlParse to parse xmlBuffer and provides access methods to some of the fields. src/defaultAlerts.cpp provides default AlertID-Description paris. This is used in absence of AMTAlerts.xml. src/notifyDesktop.sh is script which uses d-bus infra to pop up desktop notification. The following script can be modified based on device environment and libraries installed. src/LMEConnection.cpp has modified the buffer 4x times because of the size of AMT ME Xml data. src/Protocol.cpp [ _UNSHandler(char *data, int dataLength) ] has changes to recieve AMT ME event data, gracefully process the data and close the channel. src/tools/miniXmlParser.cpp has derived work from http://info.meshcentral.com/downloads/MeshAgentFullSource.rar microstack. Author: Bryan Y Roe /Intel Corporation. Upstream-Status: Pending Signed-off-by: AnandVastrad --- Makefile.in | 2 + src/AMTAlerts.xml | 464 ++++++++++++++++++++++++++++++++++++++++++++ src/LMEConnection.cpp | 2 +- src/Makefile.am | 3 + src/Makefile.in | 172 ++++++++++++++-- src/Makefile.inc | 20 +- src/Protocol.cpp | 191 +++++++++++++++--- src/Protocol.h | 8 +- src/alertDescription.cpp | 144 ++++++++++++++ src/alertDescription.h | 45 +++++ src/alertIndication.cpp | 90 +++++++++ src/alertIndication.h | 54 ++++++ src/defaultAlerts.h | 43 ++++ src/notifyDesktop.sh | 10 + src/tools/httpParser.cpp | 101 ++++++++++ src/tools/httpParser.h | 49 +++++ src/tools/miniXmlParser.cpp | 375 +++++++++++++++++++++++++++++++++++ src/tools/miniXmlParser.h | 51 +++++ src/tools/utils.cpp | 185 ++++++++++++++++++ src/tools/utils.h | 57 ++++++ src/tools/xmlNode.cpp | 45 +++++ src/tools/xmlNode.h | 49 +++++ 22 files changed, 2105 insertions(+), 55 deletions(-) mode change 100755 => 100644 Makefile.in create mode 100755 src/AMTAlerts.xml mode change 100755 => 100644 src/Makefile.in create mode 100644 src/alertDescription.cpp create mode 100644 src/alertDescription.h create mode 100644 src/alertIndication.cpp create mode 100644 src/alertIndication.h create mode 100644 src/defaultAlerts.h create mode 100644 src/notifyDesktop.sh create mode 100644 src/tools/httpParser.cpp create mode 100644 src/tools/httpParser.h create mode 100644 src/tools/miniXmlParser.cpp create mode 100644 src/tools/miniXmlParser.h create mode 100644 src/tools/utils.cpp create mode 100644 src/tools/utils.h create mode 100644 src/tools/xmlNode.cpp create mode 100644 src/tools/xmlNode.h diff --git a/Makefile.in b/Makefile.in old mode 100755 new mode 100644 index f90be60..e1a248b --- a/Makefile.in +++ b/Makefile.in @@ -133,6 +133,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -185,6 +186,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/src/AMTAlerts.xml b/src/AMTAlerts.xml new file mode 100755 index 0000000..ddb3383 --- /dev/null +++ b/src/AMTAlerts.xml @@ -0,0 +1,464 @@ + + + + +iAMT0001 + +System Defense Policy triggered. + + +iAMT0002 + +Agent Presence Agent not started. + + +iAMT0003 + +Agent Presence Agent stopped. + + +iAMT0004 + +Agent Presence: running. + + +iAMT0005 + +Agent Presence: expired. + + +iAMT0006 + +Agent Presence: suspended. + + +iAMT0007 + +Host software attempt to disable AMT Network link detected. + + +iAMT0008 + +Host software attempt to disable AMT Network link detected -- Host Network link blocked. + + +iAMT0009 + +AMT clock or FLASH wear-out protection disabled. + + +iAMT0010 + +Intel(R) AMT Network Interface: Heuristics defense slow threshold trespassed. + + +iAMT0011 + +Intel(R) AMT Network Interface: Heuristics defense fast threshold trespassed. + + +iAMT0012 + +Intel(R) AMT Network Interface: Heuristics defense factory defined threshold trespassed. + + +iAMT0013 + +Intel(R) AMT Network Interface: Heuristics defense Encounter timeout expired. + + +iAMT0014 + +General certificate error. + + +iAMT0015 + +Certificate expired. + + +iAMT0016 + +No trusted root certificate. + + +iAMT0017 + +Not configured to work with server certificate. + + +iAMT0018 + +Certificate revoked. + + +iAMT0019 + +RSA exponent too large. + + +iAMT0020 + +RSA modulus too large. + + +iAMT0021 + +Unsupported digest. + + +iAMT0022 + +Distinguished name too long. + + +iAMT0023 + +Key usage missing. + + +iAMT0024 + +General SSL handshake error. + + +iAMT0025 + +General 802.1x error. + + +iAMT0026 + +AMT Diagnostic AlertEAC error - General NAC error. + + +iAMT0027 + +AMT Diagnostic AlertEAC error - attempt to get a NAC posture while AMT NAC is disabled. + + +iAMT0028 + +AMT Diagnostic AlertEAC error - attempt to get a posture of an unsupported type. + + +iAMT0029 + +Audit log storage is 50% full. + + +iAMT0030 + +Audit log storage is 75% full. + + +iAMT0031 + +Audit log storage is 85% full. + + +iAMT0032 + +Audit log storage is 95% full. + + +iAMT0033 + +Audit log storage is full. + + +iAMT0034 + +Firmware Update Event - Partial. + + +iAMT0035 + +Firmware Update Event - Failure. + + +iAMT0036 + +Remote connectivity initiated. + + +iAMT0037 + +ME Presence event. + + +iAMT0038 +0 +AMT is being unprovisioned using BIOS command. + + +iAMT0038 +1 +AMT is being unprovisioned using Local MEI command. + + +iAMT0038 +2 +AMT is being unprovisioned using Local WS-MAN/SOAP command. + + +iAMT0038 +3 +AMT is being unprovisioned using Remote WS-MAN/SOAP command. + + +iAMT0050 + +User Notification Alert - General Notification. + + +iAMT0050 +16 +User Notification Alert - Circuit Breaker notification (CB Drop TX filter hit.). + + +iAMT0050 +17 +User Notification Alert - Circuit Breaker notification (CB Rate Limit TX filter hit.). + + +iAMT0050 +18 +User Notification Alert - Circuit Breaker notification (CB Drop RX filter hit.). + + +iAMT0050 +19 +User Notification Alert - Circuit Breaker notification (CB Rate Limit RX filter hit.). + + +iAMT0050 +32 +User Notification Alert - EAC notification. + + +iAMT0050 +48 +User Notification Alert - Remote diagnostics - (Remote Redirection session started - SOL). + + +iAMT0050 +49 +User Notification Alert - Remote diagnostics - (Remote Redirection session stopped - SOL). + + +iAMT0050 +50 +User Notification Alert - Remote diagnostics. (Remote Redirection session started - IDE-R). + + +iAMT0050 +51 +User Notification Alert - Remote diagnostics. (Remote Redirection session stopped - IDE-R). + + +iAMT0050 +66 +User Notification Alert - WLAN notification (Host profile mismatch - Management Interface ignored). + + +iAMT0050 +67 +User Notification Alert - WLAN notification (Management device overrides host radio). + + +iAMT0050 +68 +User Notification Alert - WLAN notification (Host profile security mismatch). + + +iAMT0050 +69 +User Notification Alert - WLAN notification (Management device relinquishes control over host Radio). + + +iAMT0051 + +User Notification Alert - SecIo event. + + +iAMT0051 +0 +User Notification Alert - SecIo event semaphore at host. + + +iAMT0051 +1 +User Notification Alert - semaphore at ME. + + +iAMT0051 +2 +User Notification Alert - SecIo event - semaphore timeout. + + +iAMT0052 + +User Notification Alert - KVM session event. + + +iAMT0052 +0 +User Notification Alert - KVM session requested. + + +iAMT0052 +1 +User Notification Alert - KVM session started. + + +iAMT0052 +2 +User Notification Alert - KVM session stopped. + + +iAMT0053 + +User Notification Alert - RCS notification. + + +iAMT0053 +50 +User Notification Alert - RCS notification (HW button pressed. Connection initiated automatically). + + +iAMT0053 +52 +User Notification Alert - RCS notification (HW button pressed. Connection wasn't initiated automatically). + + +iAMT0053 +53 +User Notification Alert - RCS notification (Contracts updated). + + +iAMT0054 + +User Notification Alert - WLAN notification. Wireless Profile sync enablement state changed. + + +iAMT0055 + +User Notification Alert - Provisioning state change notification. + + +iAMT0055 +0 +User Notification Alert - Provisioning state change notification - Pre-configuration. + + +iAMT0055 +1 +User Notification Alert - Provisioning state change notification - In configuration. + + +iAMT0055 +2 +User Notification Alert - Provisioning state change notification - Post-configuration. + + +iAMT0055 +3 +User Notification Alert - Provisioning state change notification - unprovision process has started. + + +iAMT0056 + +User Notification Alert - System Defense change notification. + + +iAMT0057 + +User Notification Alert - Network State change notification. + + +iAMT0058 + +User Notification Alert - Remote Access change notification. + + +iAMT0058 +1 +User Notification Alert - Remote Access change notification - tunnel is closed. + + +iAMT0058 +1 +User Notification Alert - Remote Access change notification - tunnel is open. + + +iAMT0059 + +User Notification Alert - KVM enabled event. + + +iAMT0059 +0 +User Notification Alert - KVM enabled event - KVM disabled. + + +iAMT0059 +1 +User Notification Alert - KVM enabled event - KVM enabled (both from MEBx and PTNI). + + +iAMT0060 + +User Notification Alert - SecIO configuration event. + + +iAMT0061 + +ME FW reset occurred. + + +iAMT0062 + +User Notification Alert - IpSyncEnabled event. + + +iAMT0062 +0 +User Notification Alert - IpSyncEnabled event - IpSync disabled. + + +iAMT0062 +1 +User Notification Alert - IpSyncEnabled event - IpSync enabled. + + +iAMT0063 + +User Notification Alert - HTTP Proxy sync enabled event. + + +iAMT0063 +0 +User Notification Alert - HTTP Proxy sync enabled event - HTTP Proxy Sync disabled. + + +iAMT0063 +1 +User Notification Alert - HTTP Proxy sync enabled event - HTTP Proxy Sync enabled. + + +iAMT0064 + +User Notification Alert - User Consent event. + + +iAMT0064 +1 +User Notification Alert - User Consent event - User Consent granted. + + +iAMT0064 +2 +User Notification Alert - User Consent event - User Consent ended. + + diff --git a/src/LMEConnection.cpp b/src/LMEConnection.cpp index f3e7a2b..d192626 100755 --- a/src/LMEConnection.cpp +++ b/src/LMEConnection.cpp @@ -48,7 +48,7 @@ extern glue plugin; const GUID LMEConnection::_guid = {0x6733a4db, 0x0476, 0x4e7b, {0xb3, 0xaf, 0xbc, 0xfc, 0x29, 0xbe, 0xe7, 0xa7}}; -const UINT32 LMEConnection::RX_WINDOW_SIZE = 1024; +const UINT32 LMEConnection::RX_WINDOW_SIZE = 4096; LMEConnection::LMEConnection(bool verbose) : _reqID(0), diff --git a/src/Makefile.am b/src/Makefile.am index 42d9f47..364427b 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,7 @@ sbin_PROGRAMS=lms +dist_bin_SCRIPTS=notifyDesktop.sh +xml_dir=$(datadir)/xml +xml__DATA=AMTAlerts.xml SYNCLIB_SRCDIR=SyncLib/src SYNCLIB_HDRDIR=SyncLib/Include diff --git a/src/Makefile.in b/src/Makefile.in old mode 100755 new mode 100644 index c6fe1ba..7b6cafd --- a/src/Makefile.in +++ b/src/Makefile.in @@ -14,6 +14,8 @@ @SET_MAKE@ + + srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ @@ -37,9 +39,9 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ sbin_PROGRAMS = lms$(EXEEXT) -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/Makefile.inc $(srcdir)/iatshareddata.h.in \ - $(srcdir)/plugin.h.in +DIST_COMMON = $(dist_bin_SCRIPTS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.inc \ + $(srcdir)/iatshareddata.h.in $(srcdir)/plugin.h.in subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac @@ -48,14 +50,17 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = plugin.h iatshareddata.h -am__installdirs = "$(DESTDIR)$(sbindir)" +am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(xml_dir)" sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(sbin_PROGRAMS) am__objects_1 = main.$(OBJEXT) LMEConnection.$(OBJEXT) \ ConfigConnection.$(OBJEXT) Protocol.$(OBJEXT) glue.$(OBJEXT) \ - ChannelGenerator.$(OBJEXT) + ChannelGenerator.$(OBJEXT) alertIndication.$(OBJEXT) \ + alertDescription.$(OBJEXT) am__objects_2 = ATVersion.$(OBJEXT) ATNetworkTool.$(OBJEXT) \ - daemonize.$(OBJEXT) + daemonize.$(OBJEXT) utils.$(OBJEXT) miniXmlParser.$(OBJEXT) \ + xmlNode.$(OBJEXT) httpParser.$(OBJEXT) am__objects_3 = MEILinux.$(OBJEXT) MNGCommand.$(OBJEXT) \ FWULCommand.$(OBJEXT) PTHICommand.$(OBJEXT) am__objects_4 = EventLinux.$(OBJEXT) SemaphoreLinux.$(OBJEXT) \ @@ -68,6 +73,8 @@ am__objects_7 = $(am__objects_6) $(am__objects_6) $(am__objects_6) \ am_lms_OBJECTS = $(am__objects_5) $(am__objects_7) lms_OBJECTS = $(am_lms_OBJECTS) lms_LDADD = $(LDADD) +dist_binSCRIPT_INSTALL = $(INSTALL_SCRIPT) +SCRIPTS = $(dist_bin_SCRIPTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -89,6 +96,14 @@ LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(lms_SOURCES) DIST_SOURCES = $(lms_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +xml_DATA_INSTALL = $(INSTALL_DATA) +DATA = $(xml__DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -150,6 +165,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -202,10 +218,14 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +dist_bin_SCRIPTS = notifyDesktop.sh +xml_dir = $(datadir)/xml +xml__DATA = AMTAlerts.xml SYNCLIB_SRCDIR = SyncLib/src SYNCLIB_HDRDIR = SyncLib/Include MEI_DIR = mei @@ -238,11 +258,19 @@ $(MEI_DIR)/PTHICommand.cpp TOOLS_HDRS = $(TOOLS_DIR)/ATVersion.h \ $(TOOLS_DIR)/ATNetworkTool.h \ -$(TOOLS_DIR)/daemonize.h +$(TOOLS_DIR)/daemonize.h \ +$(TOOLS_DIR)/utils.h \ +$(TOOLS_DIR)/miniXmlParser.h \ +$(TOOLS_DIR)/xmlNode.h \ +$(TOOLS_DIR)/httpParser.h TOOLS_SRCS = $(TOOLS_DIR)/ATVersion.cpp \ $(TOOLS_DIR)/ATNetworkTool.cpp \ -$(TOOLS_DIR)/daemonize.cpp +$(TOOLS_DIR)/daemonize.cpp \ +$(TOOLS_DIR)/utils.cpp \ +$(TOOLS_DIR)/miniXmlParser.cpp \ +$(TOOLS_DIR)/xmlNode.cpp \ +$(TOOLS_DIR)/httpParser.cpp MAIN_HDRS = types.h \ Channel.h \ @@ -254,14 +282,18 @@ ConfigConnection.h \ Protocol.h \ glue.h \ version.h \ -ChannelGenerator.h +ChannelGenerator.h \ +alertIndication.h \ +alertDescription.h MAIN_SRCS = main.cpp \ LMEConnection.cpp \ ConfigConnection.cpp \ Protocol.cpp \ glue.cpp \ -ChannelGenerator.cpp +ChannelGenerator.cpp \ +alertIndication.cpp \ +alertDescription.cpp SRCS = $(MAIN_SRCS) \ $(TOOLS_SRCS) \ @@ -342,6 +374,25 @@ clean-sbinPROGRAMS: lms$(EXEEXT): $(lms_OBJECTS) $(lms_DEPENDENCIES) @rm -f lms$(EXEEXT) $(CXXLINK) $(lms_LDFLAGS) $(lms_OBJECTS) $(lms_LDADD) $(LIBS) +install-dist_binSCRIPTS: $(dist_bin_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + @list='$(dist_bin_SCRIPTS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f $$d$$p; then \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " $(dist_binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(dist_binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ + else :; fi; \ + done + +uninstall-dist_binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(dist_bin_SCRIPTS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -355,17 +406,23 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConfigConnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EventLinux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FWULCommand.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MEILinux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LMEConnection.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MEILinux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MNGCommand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PTHICommand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Protocol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RWLock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SemaphoreLinux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ThreadLinux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alertDescription.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alertIndication.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/daemonize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glue.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpParser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/miniXmlParser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlNode.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @@ -430,6 +487,62 @@ daemonize.obj: $(TOOLS_DIR)/daemonize.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o daemonize.obj `if test -f '$(TOOLS_DIR)/daemonize.cpp'; then $(CYGPATH_W) '$(TOOLS_DIR)/daemonize.cpp'; else $(CYGPATH_W) '$(srcdir)/$(TOOLS_DIR)/daemonize.cpp'; fi` +utils.o: $(TOOLS_DIR)/utils.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT utils.o -MD -MP -MF "$(DEPDIR)/utils.Tpo" -c -o utils.o `test -f '$(TOOLS_DIR)/utils.cpp' || echo '$(srcdir)/'`$(TOOLS_DIR)/utils.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/utils.Tpo" "$(DEPDIR)/utils.Po"; else rm -f "$(DEPDIR)/utils.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(TOOLS_DIR)/utils.cpp' object='utils.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o utils.o `test -f '$(TOOLS_DIR)/utils.cpp' || echo '$(srcdir)/'`$(TOOLS_DIR)/utils.cpp + +utils.obj: $(TOOLS_DIR)/utils.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT utils.obj -MD -MP -MF "$(DEPDIR)/utils.Tpo" -c -o utils.obj `if test -f '$(TOOLS_DIR)/utils.cpp'; then $(CYGPATH_W) '$(TOOLS_DIR)/utils.cpp'; else $(CYGPATH_W) '$(srcdir)/$(TOOLS_DIR)/utils.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/utils.Tpo" "$(DEPDIR)/utils.Po"; else rm -f "$(DEPDIR)/utils.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(TOOLS_DIR)/utils.cpp' object='utils.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o utils.obj `if test -f '$(TOOLS_DIR)/utils.cpp'; then $(CYGPATH_W) '$(TOOLS_DIR)/utils.cpp'; else $(CYGPATH_W) '$(srcdir)/$(TOOLS_DIR)/utils.cpp'; fi` + +miniXmlParser.o: $(TOOLS_DIR)/miniXmlParser.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT miniXmlParser.o -MD -MP -MF "$(DEPDIR)/miniXmlParser.Tpo" -c -o miniXmlParser.o `test -f '$(TOOLS_DIR)/miniXmlParser.cpp' || echo '$(srcdir)/'`$(TOOLS_DIR)/miniXmlParser.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/miniXmlParser.Tpo" "$(DEPDIR)/miniXmlParser.Po"; else rm -f "$(DEPDIR)/miniXmlParser.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(TOOLS_DIR)/miniXmlParser.cpp' object='miniXmlParser.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o miniXmlParser.o `test -f '$(TOOLS_DIR)/miniXmlParser.cpp' || echo '$(srcdir)/'`$(TOOLS_DIR)/miniXmlParser.cpp + +miniXmlParser.obj: $(TOOLS_DIR)/miniXmlParser.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT miniXmlParser.obj -MD -MP -MF "$(DEPDIR)/miniXmlParser.Tpo" -c -o miniXmlParser.obj `if test -f '$(TOOLS_DIR)/miniXmlParser.cpp'; then $(CYGPATH_W) '$(TOOLS_DIR)/miniXmlParser.cpp'; else $(CYGPATH_W) '$(srcdir)/$(TOOLS_DIR)/miniXmlParser.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/miniXmlParser.Tpo" "$(DEPDIR)/miniXmlParser.Po"; else rm -f "$(DEPDIR)/miniXmlParser.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(TOOLS_DIR)/miniXmlParser.cpp' object='miniXmlParser.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o miniXmlParser.obj `if test -f '$(TOOLS_DIR)/miniXmlParser.cpp'; then $(CYGPATH_W) '$(TOOLS_DIR)/miniXmlParser.cpp'; else $(CYGPATH_W) '$(srcdir)/$(TOOLS_DIR)/miniXmlParser.cpp'; fi` + +xmlNode.o: $(TOOLS_DIR)/xmlNode.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xmlNode.o -MD -MP -MF "$(DEPDIR)/xmlNode.Tpo" -c -o xmlNode.o `test -f '$(TOOLS_DIR)/xmlNode.cpp' || echo '$(srcdir)/'`$(TOOLS_DIR)/xmlNode.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/xmlNode.Tpo" "$(DEPDIR)/xmlNode.Po"; else rm -f "$(DEPDIR)/xmlNode.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(TOOLS_DIR)/xmlNode.cpp' object='xmlNode.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xmlNode.o `test -f '$(TOOLS_DIR)/xmlNode.cpp' || echo '$(srcdir)/'`$(TOOLS_DIR)/xmlNode.cpp + +xmlNode.obj: $(TOOLS_DIR)/xmlNode.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xmlNode.obj -MD -MP -MF "$(DEPDIR)/xmlNode.Tpo" -c -o xmlNode.obj `if test -f '$(TOOLS_DIR)/xmlNode.cpp'; then $(CYGPATH_W) '$(TOOLS_DIR)/xmlNode.cpp'; else $(CYGPATH_W) '$(srcdir)/$(TOOLS_DIR)/xmlNode.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/xmlNode.Tpo" "$(DEPDIR)/xmlNode.Po"; else rm -f "$(DEPDIR)/xmlNode.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(TOOLS_DIR)/xmlNode.cpp' object='xmlNode.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xmlNode.obj `if test -f '$(TOOLS_DIR)/xmlNode.cpp'; then $(CYGPATH_W) '$(TOOLS_DIR)/xmlNode.cpp'; else $(CYGPATH_W) '$(srcdir)/$(TOOLS_DIR)/xmlNode.cpp'; fi` + +httpParser.o: $(TOOLS_DIR)/httpParser.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT httpParser.o -MD -MP -MF "$(DEPDIR)/httpParser.Tpo" -c -o httpParser.o `test -f '$(TOOLS_DIR)/httpParser.cpp' || echo '$(srcdir)/'`$(TOOLS_DIR)/httpParser.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/httpParser.Tpo" "$(DEPDIR)/httpParser.Po"; else rm -f "$(DEPDIR)/httpParser.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(TOOLS_DIR)/httpParser.cpp' object='httpParser.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o httpParser.o `test -f '$(TOOLS_DIR)/httpParser.cpp' || echo '$(srcdir)/'`$(TOOLS_DIR)/httpParser.cpp + +httpParser.obj: $(TOOLS_DIR)/httpParser.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT httpParser.obj -MD -MP -MF "$(DEPDIR)/httpParser.Tpo" -c -o httpParser.obj `if test -f '$(TOOLS_DIR)/httpParser.cpp'; then $(CYGPATH_W) '$(TOOLS_DIR)/httpParser.cpp'; else $(CYGPATH_W) '$(srcdir)/$(TOOLS_DIR)/httpParser.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/httpParser.Tpo" "$(DEPDIR)/httpParser.Po"; else rm -f "$(DEPDIR)/httpParser.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(TOOLS_DIR)/httpParser.cpp' object='httpParser.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o httpParser.obj `if test -f '$(TOOLS_DIR)/httpParser.cpp'; then $(CYGPATH_W) '$(TOOLS_DIR)/httpParser.cpp'; else $(CYGPATH_W) '$(srcdir)/$(TOOLS_DIR)/httpParser.cpp'; fi` + MEILinux.o: $(MEI_DIR)/MEILinux.cpp @am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MEILinux.o -MD -MP -MF "$(DEPDIR)/MEILinux.Tpo" -c -o MEILinux.o `test -f '$(MEI_DIR)/MEILinux.cpp' || echo '$(srcdir)/'`$(MEI_DIR)/MEILinux.cpp; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/MEILinux.Tpo" "$(DEPDIR)/MEILinux.Po"; else rm -f "$(DEPDIR)/MEILinux.Tpo"; exit 1; fi @@ -551,6 +664,23 @@ clean-libtool: distclean-libtool: -rm -f libtool uninstall-info-am: +install-xml_DATA: $(xml__DATA) + @$(NORMAL_INSTALL) + test -z "$(xml_dir)" || $(mkdir_p) "$(DESTDIR)$(xml_dir)" + @list='$(xml__DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(xml_DATA_INSTALL) '$$d$$p' '$(DESTDIR)$(xml_dir)/$$f'"; \ + $(xml_DATA_INSTALL) "$$d$$p" "$(DESTDIR)$(xml_dir)/$$f"; \ + done + +uninstall-xml_DATA: + @$(NORMAL_UNINSTALL) + @list='$(xml__DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(xml_dir)/$$f'"; \ + rm -f "$(DESTDIR)$(xml_dir)/$$f"; \ + done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ @@ -629,9 +759,9 @@ distdir: $(DISTFILES) done check-am: all-am check: check-am -all-am: Makefile $(PROGRAMS) +all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(DATA) installdirs: - for dir in "$(DESTDIR)$(sbindir)"; do \ + for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(xml_dir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am @@ -679,11 +809,11 @@ info: info-am info-am: -install-data-am: +install-data-am: install-xml_DATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-exec-am: install-sbinPROGRAMS +install-exec-am: install-dist_binSCRIPTS install-sbinPROGRAMS install-info: install-info-am @@ -709,20 +839,22 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am uninstall-sbinPROGRAMS +uninstall-am: uninstall-dist_binSCRIPTS uninstall-info-am \ + uninstall-sbinPROGRAMS uninstall-xml_DATA .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-sbinPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ - install-data-hook install-exec install-exec-am install-info \ - install-info-am install-man install-sbinPROGRAMS install-strip \ + install-data-hook install-dist_binSCRIPTS install-exec \ + install-exec-am install-info install-info-am install-man \ + install-sbinPROGRAMS install-strip install-xml_DATA \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-info-am \ - uninstall-sbinPROGRAMS + tags uninstall uninstall-am uninstall-dist_binSCRIPTS \ + uninstall-info-am uninstall-sbinPROGRAMS uninstall-xml_DATA install-data-hook: diff --git a/src/Makefile.inc b/src/Makefile.inc index 079503c..8d7e7ab 100755 --- a/src/Makefile.inc +++ b/src/Makefile.inc @@ -26,11 +26,19 @@ $(MEI_DIR)/PTHICommand.cpp TOOLS_HDRS=$(TOOLS_DIR)/ATVersion.h \ $(TOOLS_DIR)/ATNetworkTool.h \ -$(TOOLS_DIR)/daemonize.h +$(TOOLS_DIR)/daemonize.h \ +$(TOOLS_DIR)/utils.h \ +$(TOOLS_DIR)/miniXmlParser.h \ +$(TOOLS_DIR)/xmlNode.h \ +$(TOOLS_DIR)/httpParser.h TOOLS_SRCS=$(TOOLS_DIR)/ATVersion.cpp \ $(TOOLS_DIR)/ATNetworkTool.cpp \ -$(TOOLS_DIR)/daemonize.cpp +$(TOOLS_DIR)/daemonize.cpp \ +$(TOOLS_DIR)/utils.cpp \ +$(TOOLS_DIR)/miniXmlParser.cpp \ +$(TOOLS_DIR)/xmlNode.cpp \ +$(TOOLS_DIR)/httpParser.cpp MAIN_HDRS=types.h \ Channel.h \ @@ -42,14 +50,18 @@ ConfigConnection.h \ Protocol.h \ glue.h \ version.h \ -ChannelGenerator.h +ChannelGenerator.h \ +alertIndication.h \ +alertDescription.h MAIN_SRCS=main.cpp \ LMEConnection.cpp \ ConfigConnection.cpp \ Protocol.cpp \ glue.cpp \ -ChannelGenerator.cpp +ChannelGenerator.cpp \ +alertIndication.cpp \ +alertDescription.cpp SRCS=$(MAIN_SRCS) \ $(TOOLS_SRCS) \ diff --git a/src/Protocol.cpp b/src/Protocol.cpp index 3a4a9bb..c3de5cc 100755 --- a/src/Protocol.cpp +++ b/src/Protocol.cpp @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -42,7 +43,8 @@ #include #include #include -#include "strings.h" +#include +#include #define _stprintf_s snprintf #define strnicmp strncasecmp @@ -53,6 +55,11 @@ #include "LMS_if.h" #include "Lock.h" #include "ATNetworkTool.h" +#include "utils.h" +#include "httpParser.h" +#include "miniXmlParser.h" +#include "alertIndication.h" +#include "alertDescription.h" const LMEProtocolVersionMessage Protocol::MIN_PROT_VERSION(1, 0); @@ -99,9 +106,9 @@ bool Protocol::Init(EventLogCallback cb, void *param) PRINT("Protocol::Init started\n"); _eventLog = cb; _eventLogParam = param; + _UNSSenderChannel = INVALID_CHANNEL; DeinitFull(); - { Lock dl(_deinitLock); _deinitReq = false; @@ -1170,10 +1177,112 @@ void Protocol::_removeFromMaps(Channel *c) _channelToSocket.erase(c->GetSenderChannel()); _socketToChannel.erase(s); } -void Protocol::_UNSConnection() + +std::string Protocol::_PACKET_BODY_LENGTH="Content-Length"; +std::string Protocol::_NOTIFICATION_HEADER="Intel Management Engine Notification"; +int Protocol::_UNSHandler(char *data, int dataLength) { - PRINT("UNS event\n"); + PRINT("UNS event data\n"); + char *pBuffer = NULL; + static char *sBuffer = NULL; + static int sBufferLength = 0; + int rc = -1; + unsigned int packetBodyLength = 0; + HttpParser httpParser; + std::string httpBody; + AlertIndication alertIndication; + + //printf("Processing notification message %d\n", newNotification); + + //Init if new notification. Append recieved notification bytes to existing buffer otherwise. + if (_newNotification == true) + { if (sBuffer != NULL) { + delete []sBuffer; + } + sBuffer = NULL; + sBufferLength = 0; + } + + if (sBuffer == NULL) { + sBufferLength = 0; + sBuffer = new char[(dataLength+1) *sizeof(char)]; + memcpy(sBuffer, data, dataLength); + } else { + pBuffer = new char[(sBufferLength + dataLength + 1)*sizeof(char)]; + memcpy(pBuffer, sBuffer, sBufferLength); + memcpy(pBuffer+sBufferLength, data, dataLength); + delete []sBuffer; + sBuffer = pBuffer; + } + + sBufferLength += dataLength; + sBuffer[sBufferLength] = '\0'; + + do { + + if (httpParser.parse(sBuffer) != 0) { + break; + } + + if (httpParser.getHeaderField(_PACKET_BODY_LENGTH).empty()) { + break; + } + + packetBodyLength = stoi(httpParser.getHeaderField(_PACKET_BODY_LENGTH)); + + if (packetBodyLength == 0) { + break; + } + + httpBody = httpParser.getBody(); + if (httpBody.size() < packetBodyLength) { + break; + } + + if (alertIndication.initFromXml((char*)httpBody.c_str(), httpBody.size())) { + break; + } + + std::string alertIDString(alertIndication.getMessageID().data, alertIndication.getMessageID().dataLength); + if (alertIDString.empty()) { + break; + } + + /*Check if we have match only with ID, if fails then use MessageArguments and checkagain */ + std::string alertDescription; + std::string _alertDescription; + std::string notificationBody; + std::string messageArguments; + alertDescription = AlertDescription::getAlertDescription(alertIDString); + messageArguments = std::string(alertIndication.getMessageArguments().data, alertIndication.getMessageArguments().dataLength); + + if (alertDescription.empty()) { + alertIDString += "-" + messageArguments; + alertDescription = AlertDescription::getAlertDescription(alertIDString); + } else { + _alertDescription = messageArguments; + } + + notificationBody = std::string(alertIndication.getIndicationTime().data, alertIndication.getIndicationTime().dataLength); + if (alertDescription.empty()) { + notificationBody += " " + alertIDString; + } else { + if (_alertDescription.empty()) { + notificationBody += " " + alertDescription; + } else { + notificationBody += " : " + _alertDescription + " : " + alertDescription; + } + } + + Utils::notifyDesktop(_NOTIFICATION_HEADER, notificationBody, true); + rc = 0; + + } while(0); + + return rc; + } + int Protocol::_sendHostFQDN() { char localName[FQDN_MAX_SIZE] = "\0"; @@ -1195,12 +1304,15 @@ void Protocol::_apfChannelOpen(LMEChannelOpenRequestMessage *chOpenMsg, int *sta " Recipient channel %d for address %s, port %d.\n", chOpenMsg->SenderChannel, chOpenMsg->Address.c_str(), chOpenMsg->Port); + if(chOpenMsg->Port==0) { - _UNSConnection(); - _sendHostFQDN(); - return; + _UNSSenderChannel = chOpenMsg->SenderChannel; + _lme.ChannelOpenReplySuccess(_UNSSenderChannel, _UNSRecipientChannel); + _newNotification = true; + return; } + SOCKET s = ATNetworkTool::Connect(chOpenMsg->Address.c_str(), chOpenMsg->Port, error, PF_UNSPEC); if (s == INVALID_SOCKET) { @@ -1282,33 +1394,41 @@ PortForwardRequest *Protocol::_apfChannelClose(LMEChannelCloseMessage *chClMsg) Lock l(_channelsLock); PRINT("_apfChannelClose: RecipientChannel=%d\n",chClMsg->RecipientChannel); - - ChannelToSocketMap::iterator it = _channelToSocket.find(chClMsg->RecipientChannel); - if (it != _channelToSocket .end()) - { - SOCKET s = it->second; - Channel *c = _socketToChannel[s]; - switch(c->GetStatus()) { - case Channel::OPEN: - c->SetStatus(Channel::CLOSED); - - _lme.ChannelClose(c->GetRecipientChannel(), c->GetSenderChannel()); - PRINT("Channel %d was closed by Intel AMT.\n", c->GetSenderChannel()); + do { + if (chClMsg->RecipientChannel == _UNSRecipientChannel) + { + //UNS event channel close. + //We have not created a channel on LMS side, hence ignore break; + } - case Channel::WAITING_CLOSE: - PRINT("Received reply by Intel AMT on closing channel %d.\n", c->GetSenderChannel()); - break; + ChannelToSocketMap::iterator it = _channelToSocket.find(chClMsg->RecipientChannel); + if (it != _channelToSocket .end()) + { + SOCKET s = it->second; + Channel *c = _socketToChannel[s]; + switch(c->GetStatus()) { + case Channel::OPEN: + c->SetStatus(Channel::CLOSED); + + _lme.ChannelClose(c->GetRecipientChannel(), c->GetSenderChannel()); + PRINT("Channel %d was closed by Intel AMT.\n", c->GetSenderChannel()); + break; - case Channel::CLOSED: - case Channel::NOT_OPENED: - break; - } + case Channel::WAITING_CLOSE: + PRINT("Received reply by Intel AMT on closing channel %d.\n", c->GetSenderChannel()); + break; - _removeFromMaps(c); - clPFwdReq = _closeMChannel(c); + case Channel::CLOSED: + case Channel::NOT_OPENED: + break; + } + + _removeFromMaps(c); + clPFwdReq = _closeMChannel(c); - } + } + } while(0); _channelGenerator.FreeChannel(chClMsg->RecipientChannel); @@ -1320,6 +1440,18 @@ PortForwardRequest *Protocol::_apfChannelData(LMEChannelDataMessage *chDMsg, int PortForwardRequest *clPFwdReq = NULL; do { + if (chDMsg->RecipientChannel == _UNSRecipientChannel) + + { + if (_UNSHandler((char*)chDMsg->Data, chDMsg->DataLength) == 0) + { + _lme.ChannelClose(_UNSSenderChannel, _UNSRecipientChannel); + } + _newNotification = false; + //UNS event data handle. + //We have not created a channel on LMS side, hence break + break; + } Lock l(_channelsLock); ChannelToSocketMap::iterator it = _channelToSocket.find(chDMsg->RecipientChannel); @@ -1341,6 +1473,7 @@ PortForwardRequest *Protocol::_apfChannelData(LMEChannelDataMessage *chDMsg, int int senderr = 0; int count = _send(channel->GetSocket(), (char *)chDMsg->Data, chDMsg->DataLength, senderr); + PRINT("Sent %d bytes of %d from Intel AMT to channel %d with socket %d.\n", count, chDMsg->DataLength, chDMsg->RecipientChannel, channel->GetSocket()); diff --git a/src/Protocol.h b/src/Protocol.h index a4ef419..858cb78 100755 --- a/src/Protocol.h +++ b/src/Protocol.h @@ -46,6 +46,7 @@ #define SOCKET int #define INVALID_SOCKET (SOCKET)(~0) +#define INVALID_CHANNEL -1 #define SOCKET_ERROR (-1) @@ -120,7 +121,7 @@ private: PortForwardRequest *_apfChannelData(LMEChannelDataMessage *chDMsg, int *status); void _LmeReceive(void *buffer, unsigned int len, int *status); void _signalSelect(); - void _UNSConnection(); + int _UNSHandler(char *buffer, int len); bool _acceptConnection(SOCKET s, unsigned int port); int _rxFromSocket(SOCKET s); int _handleFQDNChange(const char *fqdn); @@ -192,6 +193,11 @@ private: typedef std::set listenPortSet; listenPortSet _listenFailReported; ChannelGenerator _channelGenerator; + static const unsigned int _UNSRecipientChannel = 55555; + unsigned int _UNSSenderChannel; + bool _newNotification; + static std::string _PACKET_BODY_LENGTH; + static std::string _NOTIFICATION_HEADER; }; #endif diff --git a/src/alertDescription.cpp b/src/alertDescription.cpp new file mode 100644 index 0000000..f05f940 --- /dev/null +++ b/src/alertDescription.cpp @@ -0,0 +1,144 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ +#include "alertDescription.h" +#include "miniXmlParser.h" +#include +#include +#include "defaultAlerts.h" +#include "types.h" + +bool AlertDescription::classInited = false; +std::string AlertDescription::alertXmlFile = "/usr/local/share/xml/AMTAlerts.xml"; +std::string AlertDescription::alertXmlFile1 = "/usr/share/xml/AMTAlerts.xml"; +std::map AlertDescription::alertDescriptionMap; + +void AlertDescription::initAlertDescription() { + + char *value = NULL; + unsigned int valueLength = 0; + bool fromFile = false; + std::string alertIdArg; + std::stringstream ss; + std::string xmlData; + CDataLen id; + CDataLen arg; + CDataLen description; + MiniXmlParser xmlParser; + std::listdefaultAlertsList; + std::list::iterator it; + + do { + if (classInited) { + break; + } + + std::ifstream is(alertXmlFile, std::ifstream::in); + if (is.good()) { + ss << is.rdbuf(); + xmlData = ss.str(); + fromFile = true; + } else { + std::ifstream _is(alertXmlFile1, std::ifstream::in); + if (_is.good()) { + ss << _is.rdbuf(); + xmlData = ss.str(); + fromFile = true; + } + _is.close(); + } + is.close(); + + /* Parse alert descriptions from xml file, if file is absent use the default ones */ + if (fromFile) { + /* From xml file */ + if (xmlParser.parse((char*)xmlData.c_str(), xmlData.size()) == 0) { + /* Process alert xml of form + * iAMT00521 ... ... + */ + if (xmlParser.getXmlTagValue(xmlParser.getRootNode(), "Alerts", 6, NULL, 0, &value, &valueLength) == 0 ) { + while (xmlParser.getXmlTagValue(NULL, "Alert", 5, NULL, 0, &value, &valueLength) == 0) { + xmlParser.getXmlTagValue(NULL, "Id", 2, NULL, 0, &value, &valueLength); + id.data = value; + id.dataLength = valueLength; + + xmlParser.getXmlTagValue(NULL, "Arg", 3, NULL, 0, &value, &valueLength); + arg.data = value; + arg.dataLength = valueLength; + + alertIdArg = std::string(id.data, id.dataLength) + "-" + std::string(arg.data, arg.dataLength); + + xmlParser.getXmlTagValue(NULL, "Message", 7, NULL, 0, &value, &valueLength); + alertDescriptionMap.insert(std::pair(alertIdArg, std::string(value, valueLength))); + } + classInited = true; + } + } else { + PRINT("Failed to parse XML\n"); + } + } else { + /* Using default XML alerts descriptions */ + defaultAlertsList = Utils::split(DEFAULT_ALERTS , DEFAULT_ALERTS_LENGTH , ";", 1); + for (CDataLen alert: defaultAlertsList) { + std::list alertIdDescription = Utils::split(alert.data, alert.dataLength, ":", 1); + if (alertIdDescription.size() >= 2) { + it = alertIdDescription.begin(); + id.data = it->data; + id.dataLength = it->dataLength; + it++; + description.data = it->data; + description.dataLength = it->dataLength; + /* Add to std::map for faster retreival */ + alertDescriptionMap.insert(std::pair(std::string(id.data, id.dataLength), + std::string(description.data, description.dataLength))); + } + } + classInited = true; + } + } while(0); +} + + +std::string AlertDescription::getAlertDescription(std::string alert) { + CDataLen alertDescription; + std::map::iterator it; + + if (classInited == false) { + initAlertDescription(); + } + + if (classInited && alertDescriptionMap.empty() == false) { + it = alertDescriptionMap.find(alert); + if (it != alertDescriptionMap.end()) { + return it->second; + } + } + + return ""; +}; diff --git a/src/alertDescription.h b/src/alertDescription.h new file mode 100644 index 0000000..6413f2a --- /dev/null +++ b/src/alertDescription.h @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ +#ifndef _ALERTDESCRIPTION_H +#define _AlERTDESCRIPTION_H +#include "utils.h" +#include +#include +class AlertDescription { + protected: + static bool classInited; + static std::string alertXmlFile; + static std::string alertXmlFile1; + static void initAlertDescription(); + static std::map alertDescriptionMap; + public: + static std::string getAlertDescription(std::string alert); +}; +#endif diff --git a/src/alertIndication.cpp b/src/alertIndication.cpp new file mode 100644 index 0000000..ed14abd --- /dev/null +++ b/src/alertIndication.cpp @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ +#include "miniXmlParser.h" +#include "alertIndication.h" +#include + +const char* AlertIndication::CLASS_URI = "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_AlertIndication"; +void AlertIndication::initAlertIndication(char *ns, unsigned int nsLen) { + + char *value = NULL; + unsigned int valueLen= 0; + + if (xmlParser.getXmlTagValue(xmlParser.getRootNode(), "MessageID", strlen("MessageID"), ns, nsLen, &value, &valueLen) == 0) { + messageID.data = value; + messageID.dataLength = valueLen; + } + + if (xmlParser.getXmlTagValue(xmlParser.getRootNode(), "MessageArguments", strlen("MessageArguments"), ns, nsLen, &value, &valueLen) == 0) { + messageArguments.data = value; + messageArguments.dataLength = valueLen; + } + + if (xmlParser.getXmlTagValue(xmlParser.getRootNode(), "IndicationTime", strlen("IndicationTime"), ns, nsLen, &value, &valueLen) == 0) { + if (xmlParser.getXmlTagValue(NULL, "Datetime", strlen("Datetime"), NULL, 0, &value, &valueLen) == 0) { + indicationTime.data = value; + indicationTime.dataLength = valueLen; + } + } +} + +int AlertIndication::initFromXml(char *buffer, unsigned int bufferLen) { + + char *nsPrefix = NULL; + int rc = 0; + unsigned int nsPrefixLen = 0; + + do { + if (buffer == NULL || bufferLen == 0) { + rc = -1; + break; + } + + if (xmlParser.parse(buffer, bufferLen)) { + rc = -1; + break; + } + + if (xmlParser.getNSPrefix(xmlParser.getRootNode(), (char*)CLASS_URI, CLASS_URI_LEN, &nsPrefix, &nsPrefixLen)) { + rc = -1; + break; + } + + initAlertIndication(nsPrefix, nsPrefixLen); + + } while(0); + + return rc; +} + +CDataLen AlertIndication::getMessageArguments() { return messageArguments; }; +CDataLen AlertIndication::getIndicationTime() { return indicationTime; }; +CDataLen AlertIndication::getMessageID() { return messageID; }; + diff --git a/src/alertIndication.h b/src/alertIndication.h new file mode 100644 index 0000000..cf6dc51 --- /dev/null +++ b/src/alertIndication.h @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ +#ifndef __ALERTINDICATION_H +#define __ALERTINDICATION_H + +#include "utils.h" +#include + +class AlertIndication { + private: + MiniXmlParser xmlParser; + CDataLen messageArguments; + CDataLen indicationTime; + CDataLen messageID; + void initAlertIndication(char *ns, unsigned int nsLen); + + public: + static const char* CLASS_URI; + static const int CLASS_URI_LEN = 69; + int initFromXml(char *buffer, unsigned int bufferLen); + CDataLen getMessageArguments(); + CDataLen getMessageID(); + CDataLen getIndicationTime(); + +}; + +#endif diff --git a/src/defaultAlerts.h b/src/defaultAlerts.h new file mode 100644 index 0000000..23283f8 --- /dev/null +++ b/src/defaultAlerts.h @@ -0,0 +1,43 @@ +#ifndef _DEFAULTALERTS_H +#define _DEFAULTALERTS_H +#define DEFAULT_ALERTS_LENGTH 6257 +#define DEFAULT_ALERTS "iAMT0001-:System Defense Policy triggered.;iAMT0002-:Agent Presence Agent not started.;iAMT0003-:Agent Presence Agent stopped.;iAMT0004-:Agent Presence: running.;\ +iAMT0005-:Agent Presence: expired.;iAMT0006-:Agent Presence: suspended.;iAMT0007-:Host software attempt to disable AMT Network link detected.;\ +iAMT0008-:Host software attempt to disable AMT Network link detected -- Host Network link blocked.;iAMT0009-:AMT clock or FLASH wear-out protection disabled.;\ +iAMT0010-:Intel(R) AMT Network Interface: Heuristics defense slow threshold trespassed.;iAMT0011-:Intel(R) AMT Network Interface: Heuristics defense fast threshold trespassed.;\ +iAMT0012-:Intel(R) AMT Network Interface: Heuristics defense factory defined threshold trespassed.;iAMT0013-:Intel(R) AMT Network Interface: Heuristics defense Encounter timeout expired.;\ +iAMT0014-:General certificate error.;iAMT0015-:Certificate expired.;iAMT0016-:No trusted root certificate.;iAMT0017-:Not configured to work with server certificate.;iAMT0018-:Certificate revoked.;\ +iAMT0019-:RSA exponent too large.;iAMT0020-:RSA modulus too large.;iAMT0021-:Unsupported digest.;iAMT0022-:Distinguished name too long.;iAMT0023-:Key usage missing.;\ +iAMT0024-:General SSL handshake error.;iAMT0025-:General 802.1x error.;iAMT0026-:AMT Diagnostic AlertEAC error - General NAC error.;\ +iAMT0027-:AMT Diagnostic AlertEAC error - attempt to get a NAC posture while AMT NAC is disabled.;iAMT0028-:AMT Diagnostic AlertEAC error - attempt to get a posture of an unsupported type.;\ +iAMT0029-:Audit log storage is 50% full.;iAMT0030-:Audit log storage is 75% full.;iAMT0031-:Audit log storage is 85% full.;iAMT0032-:Audit log storage is 95% full.;\ +iAMT0033-:Audit log storage is full.;iAMT0034-:Firmware Update Event - Partial.;iAMT0035-:Firmware Update Event - Failure.;iAMT0036-:Remote connectivity initiated.;\ +iAMT0037-:ME Presence event.;iAMT0038-0:AMT is being unprovisioned using BIOS command.;iAMT0038-1:AMT is being unprovisioned using Local MEI command.;\ +iAMT0038-2:AMT is being unprovisioned using Local WS-MAN/SOAP command.;iAMT0038-3:AMT is being unprovisioned using Remote WS-MAN/SOAP command.;\ +iAMT0050-:User Notification Alert - General Notification.;iAMT0050-16:User Notification Alert - Circuit Breaker notification (CB Drop TX filter hit.).;\ +iAMT0050-17:User Notification Alert - Circuit Breaker notification (CB Rate Limit TX filter hit.).;iAMT0050-18:User Notification Alert - Circuit Breaker notification (CB Drop RX filter hit.).;\ +iAMT0050-19:User Notification Alert - Circuit Breaker notification (CB Rate Limit RX filter hit.).;iAMT0050-32:User Notification Alert - EAC notification.;\ +iAMT0050-48:User Notification Alert - Remote diagnostics - (Remote Redirection session started - SOL).;iAMT0050-49:User Notification Alert - Remote diagnostics - (Remote Redirection session stopped - SOL).;\ +iAMT0050-50:User Notification Alert - Remote diagnostics. (Remote Redirection session started - IDE-R).;iAMT0050-51:User Notification Alert - Remote diagnostics. (Remote Redirection session stopped - IDE-R).;\ +iAMT0050-66:User Notification Alert - WLAN notification (Host profile mismatch - Management Interface ignored).;\ +iAMT0050-67:User Notification Alert - WLAN notification (Management device overrides host radio).;iAMT0050-68:User Notification Alert - WLAN notification (Host profile security mismatch).;\ +iAMT0050-69:User Notification Alert - WLAN notification (Management device relinquishes control over host Radio).;iAMT0051-:User Notification Alert - SecIo event.;\ +iAMT0051-0:User Notification Alert - SecIo event semaphore at host.;iAMT0051-1:User Notification Alert - semaphore at ME.;iAMT0051-2:User Notification Alert - SecIo event - semaphore timeout.;\ +iAMT0052-:User Notification Alert - KVM session event.;iAMT0052-0:User Notification Alert - KVM session requested.;iAMT0052-1:User Notification Alert - KVM session started.;\ +iAMT0052-2:User Notification Alert - KVM session stopped.;iAMT0053-:User Notification Alert - RCS notification.;\ +iAMT0053-50:User Notification Alert - RCS notification (HW button pressed. Connection initiated automatically).;\ +iAMT0053-52:User Notification Alert - RCS notification (HW button pressed. Connection wasn't initiated automatically).;iAMT0053-53:User Notification Alert - RCS notification (Contracts updated).;\ +iAMT0054-:User Notification Alert - WLAN notification. Wireless Profile sync enablement state changed.;iAMT0055-:User Notification Alert - Provisioning state change notification.;\ +iAMT0055-0:User Notification Alert - Provisioning state change notification - Pre-configuration.;iAMT0055-1:User Notification Alert - Provisioning state change notification - In configuration.;\ +iAMT0055-2:User Notification Alert - Provisioning state change notification - Post-configuration.;\ +iAMT0055-3:User Notification Alert - Provisioning state change notification - unprovision process has started.;iAMT0056-:User Notification Alert - System Defense change notification.;\ +iAMT0057-:User Notification Alert - Network State change notification.;iAMT0058-:User Notification Alert - Remote Access change notification.;\ +iAMT0058-1:User Notification Alert - Remote Access change notification - tunnel is closed.;iAMT0058-1:User Notification Alert - Remote Access change notification - tunnel is open.;\ +iAMT0059-:User Notification Alert - KVM enabled event.;iAMT0059-0:User Notification Alert - KVM enabled event - KVM disabled.;\ +iAMT0059-1:User Notification Alert - KVM enabled event - KVM enabled (both from MEBx and PTNI).;iAMT0060-:User Notification Alert - SecIO configuration event.;iAMT0061-:ME FW reset occurred.;\ +iAMT0062-:User Notification Alert - IpSyncEnabled event.;iAMT0062-0:User Notification Alert - IpSyncEnabled event - IpSync disabled.;\ +iAMT0062-1:User Notification Alert - IpSyncEnabled event - IpSync enabled.;iAMT0063-:User Notification Alert - HTTP Proxy sync enabled event.;\ +iAMT0063-0:User Notification Alert - HTTP Proxy sync enabled event - HTTP Proxy Sync disabled.;iAMT0063-1:User Notification Alert - HTTP Proxy sync enabled event - HTTP Proxy Sync enabled.;\ +iAMT0064-:User Notification Alert - User Consent event.;iAMT0064-1:User Notification Alert - User Consent event - User Consent granted.;\ +iAMT0064-2:User Notification Alert - User Consent event - User Consent ended.;" +#endif diff --git a/src/notifyDesktop.sh b/src/notifyDesktop.sh new file mode 100644 index 0000000..06bfd97 --- /dev/null +++ b/src/notifyDesktop.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# get list of current users +for x in $(who | sort -u -k1,1 | awk '{print $1}'); do + # send message to anyone on display 0 + dbus_session_file=$(eval echo "~$x")/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0 + if [ -e "$dbus_session_file" ]; then + su -l "$x" -c "source '$dbus_session_file'; export DISPLAY=:0; notify-send -u critical -t 2000 '$1' '$2'" + fi +done + diff --git a/src/tools/httpParser.cpp b/src/tools/httpParser.cpp new file mode 100644 index 0000000..38d2901 --- /dev/null +++ b/src/tools/httpParser.cpp @@ -0,0 +1,101 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ +#include "httpParser.h" +#include "utils.h" +#include "types.h" + +int HttpParser::parse(char *buffer) { + + std::vector headerBody; + std::vector header; + int rc = 0; + do { + if (buffer == NULL) { + rc = -1; + break; + } + + headerBody = Utils::split(buffer, "\r\n\r\n"); + if (headerBody.size() < 2) + { + PRINT("Failed to process httpHeader\n"); + rc = -1; + break; + } + + /* Entries in Header are seperated by \r\n */ + header = Utils::split((char*)headerBody[0].c_str(), "\r\n"); + + /* First line in header is the the header line + * e.g. POST HTTP/1.1 + * e.g GET HTTP/1.1 + */ + headerLine = header[0]; + + /* After headerline are the Fields + * e.g Content-Length:2204 + */ + for (unsigned int i=1; i< header.size(); i++) { + std::vector field = Utils::split((char*)header[i].c_str(), ":"); + if (field.size() < 2) { + rc = -1; + break; + } + headerFields.insert(std::pair(field[0], field[1])); + } + + if (rc) break; + + body = headerBody[1]; + } while(0); + + return rc; +} + +std::string HttpParser::getHeaderLine() { + return headerLine; +} + +std::string HttpParser::getHeaderField(std::string field) { + std::map::iterator it; + std::string fieldValue = ""; + + it = headerFields.find(field); + if (it != headerFields.end()) + { + fieldValue = it->second; + } + + return fieldValue; +} + +std::string HttpParser::getBody() { + return body; +} diff --git a/src/tools/httpParser.h b/src/tools/httpParser.h new file mode 100644 index 0000000..a82d82a --- /dev/null +++ b/src/tools/httpParser.h @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ +#ifndef _HTTPPARSER_H +#define _HTTPPARSER_H +#include +#include +#include + +class HttpParser { + + public: + int parse(char *buffer); + std::string getHeaderLine(); + std::string getHeaderField(std::string field); + std::string getBody(); + private: + std::string headerLine; + std::map headerFields; + std::string body; + +}; +#endif diff --git a/src/tools/miniXmlParser.cpp b/src/tools/miniXmlParser.cpp new file mode 100644 index 0000000..f1f0503 --- /dev/null +++ b/src/tools/miniXmlParser.cpp @@ -0,0 +1,375 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ +#include "miniXmlParser.h" +#include "utils.h" +#include +#include +#include +#include "types.h" + +MiniXmlParser::MiniXmlParser() { + rootNode = NULL; +} + +MiniXmlParser::~MiniXmlParser() { + if (rootNode) { + deleteXmlTree(rootNode); + rootNode = NULL; + } +} + +void MiniXmlParser::deleteXmlTree(XMLNode* rootNode) { + XMLNode* node = rootNode; + XMLNode* tempNode = NULL; + + while (node != NULL) { + tempNode = node->childNode; + delete node; + node = tempNode; + } +} + +int MiniXmlParser::validateXML(XMLNode const* rootNode) { + int rc = 0; + XMLNode* current = (XMLNode *)rootNode; + XMLNode* temp = NULL; + std::stack tagStack; + + while (current != NULL) { + if (current->tagName == NULL) { + PRINT("ValidateXML failed, foung a empty tag\n"); + rc = -1; + break; + } + + if (memcmp(current->tagName, "!", 1) == 0) { + temp = current; + current = tagStack.empty()?NULL:tagStack.top(); + if (current != NULL) { + current->childNode = temp->childNode; + } else { + current = temp; + } + } else if (current->startTag) { + current->parentNode = tagStack.empty()?NULL:tagStack.top(); + tagStack.push(current); + } else { + if (tagStack.empty() == false) { + temp = tagStack.top(); + tagStack.pop(); + } else { + temp = NULL; + } + if (temp != NULL) { + if (temp->tagLength == current->tagLength && memcmp(temp->tagName, current->tagName, current->tagLength) == 0) { + if (current->childNode != NULL) { + if (current->childNode->startTag != 0) { + temp->siblingNode = current->childNode; + } + } + temp->closingTag = current; + current->startingTag = temp; + } else { + PRINT("ValidateXML failed, Illegal tag\n"); + rc = -1; + break; + } + } else { + PRINT("ValidateXML failed, Illegal closing tag\n"); + rc = -1; + break; + } + } + current = current->childNode; + } + + if (tagStack.empty() == false) { + PRINT("ValidateXML failed, Incomplete XML\n"); + rc = -1; + } + + return rc; +} + +int MiniXmlParser::parse(char* buffer, unsigned int bufferLength) { + int validXml = -1; + XMLNode* node = NULL; + + node = _parse(buffer, bufferLength); + if (node) { + validXml = validateXML(node); + } + rootNode = node; + return validXml; +} + +XMLNode* MiniXmlParser::_parse(char const* buffer, unsigned int bufferLength) { + + char* tagName = NULL; + char* nsTag = NULL; + char* CommentEnd = NULL; + + int tagLength = 0; + int startTag = 0; + int emptyTag = 0; + int nsLength = 0; + int i = 0; + int CommentIndex = 0; + + std::list xmlFields; + std::list temp2; + std::list tagValue; + + XMLNode *rootNode = NULL;; + XMLNode *current = NULL; + XMLNode *newNode = NULL; + std::list::iterator it; + + if (buffer == NULL || bufferLength == 0) { + return NULL; + } + + xmlFields = Utils::split(buffer, bufferLength, "<", 1); + for (CDataLen xmlField: xmlFields) { + if (xmlField.dataLength != 0 && memcmp(xmlField.data, "?", 1) != 0 && (xmlField.data > CommentEnd)) { + /*Parse XML comments and ignore it.*/ + if (xmlField.dataLength > 3 && memcmp(xmlField.data, "!--", 3)==0) { + CommentIndex = 3; + while (((xmlField.data + CommentIndex) < (buffer + bufferLength)) && memcmp(xmlField.data + CommentIndex, "-->", 3) != 0) { + CommentIndex++; + } + CommentEnd = xmlField.data + CommentIndex; + continue; + } else { + emptyTag = 0; + /*if the first char is / after < then its ending tag, otherwise starting tag. ("", 1); + } else { + + startTag = 1; + temp2 = Utils::split(xmlField.data, xmlField.dataLength, ">", 1); + if (temp2.front().dataLength > 0 && *(char*)(temp2.front().data-1) == '/') { + //".../>" are empty tags + emptyTag = 1; + } + } + } + /*split on ":" to get namespace:tagName*/ + tagValue = Utils::split(temp2.front().data, temp2.front().dataLength, ":", 1); + if (tagValue.size() == 1) { + nsTag = NULL; + nsLength = 0; + tagName = tagValue.front().data; + tagLength = tagValue.front().dataLength; + } else { + it = tagValue.begin(); + nsTag = it->data; + nsLength = it->dataLength; + it++; + tagName = it->data; + tagLength = it->dataLength; + } + tagValue.clear(); + temp2.clear(); + + /*Parse for multiple ns:tags and recompute the first tagLength*/ + for(i=0; i')||(tagName[i] == '\t')||(tagName[i] == '\r')||(tagName[i] == '\n')) { + if (i != 0) { + if (tagName[i]=='/') { + emptyTag = 1; + } + tagLength = i; + break; + } + } + } + + /*Create XML Node, populate properties and add it to the list*/ + if (tagLength != 0) { + newNode = new XMLNode(); + newNode->tagName = tagName; + newNode->tagLength = tagLength; + newNode->startTag = startTag; + newNode->nsTag = nsTag; + newNode->nsLength = nsLength; + + + if (rootNode == NULL) { + rootNode = newNode; + } + else { + current->childNode = newNode; + } + current = newNode; + + if (emptyTag) { + newNode = new XMLNode(); + newNode->tagName = tagName; + newNode->tagLength = tagLength; + newNode->nsTag = nsTag; + newNode->nsLength = nsLength; + + current->emptyTag = 1; + current->childNode = newNode; + current = newNode; + } + } + + } + } + + xmlFields.clear(); + return rootNode; +} + +/* + * Parse the XML Tree from rootNode and retrive value of a given key. + * If rootNode is passed as NULL, parsing resumes from last key retrieved node. + * Return 0 on Success , -1 otherwise. + * Inputs : XMLNode *rootNode, char *tag, unsigned int tagLen, char *ns, unsigned int nsLen + * Outputs: char** value, unsigned int *valueLen + */ +int MiniXmlParser::getXmlTagValue(XMLNode const* rootNode, char const* tag, unsigned int tagLen, char const* ns, unsigned int nsLen, char** value, unsigned int *valueLen) +{ + + static XMLNode *cur = (XMLNode*) rootNode; + static XMLNode *pcur = cur; + char *pValue = NULL; + bool found = false; + + if (tag == NULL) { + return -1; + } + + if (rootNode != NULL) { + cur = (XMLNode *) rootNode; + pcur = cur; + } + + while (cur != NULL) { + while (pcur != NULL) { + if (pcur->closingTag && memcmp((pcur->tagName), tag, tagLen) == 0) { + if (ns) { + if (memcmp(pcur->nsTag, ns, pcur->nsLength) == 0) { + found = true; + } + } else { + found = true; + } + + if (found) { + pValue = strstr(pcur->tagName, ">") + 1; + if (pcur->closingTag->nsLength) { + *valueLen = pcur->closingTag->nsTag - pValue - 2; + } else { + *valueLen = pcur->closingTag->tagName - pValue - 2; + } + *value = pValue; + pcur = pcur->childNode; + return 0; + } + } + pcur = pcur->childNode; + } + cur = cur->siblingNode; + pcur = cur; + } + + return -1; +} + +/* Returns Namespace prefix of given URI namespace + * Inputs : XMLNode *node, char *uri, unsigned int uriLen + * Outputs: char **nsPrefix, unsigned int *nsPrefixLen + */ +int MiniXmlParser::getNSPrefix(XMLNode const* node, char const* uri, unsigned int uriLen, char **nsPrefix, unsigned int *nsPrefixLen) { + + bool foundNS = false;; + char *tagEnd = NULL; + int rc = 0; + CDataLen tempNS; + CDataLen tempURI; + std::list tags; + std::list temp; + std::list temp2; + std::list::iterator it; + + if (node == NULL || uri == NULL) { + rc = -1; + return rc; + } + + tagEnd = strstr(node->tagName, ">"); + if (tagEnd && nsPrefix != NULL && nsPrefixLen != NULL) { + tags = Utils::split(node->tagName, tagEnd - node->tagName, " ", 1); + for (CDataLen tag: tags) { + temp = Utils::split(tag.data, tag.dataLength, ":", 1); + if (temp.size() >= 2) { + it = temp.begin(); + tempNS.data = it->data; + tempNS.dataLength = it->dataLength; + it++; + + if (memcmp(tempNS.data, "xmlns", 5) == 0) { + temp2 = Utils::split(it->data, it->dataLength, "=", 1); + if (temp2.size() >= 2) { + it = temp2.begin(); + tempNS.data = it->data; + tempNS.dataLength = it->dataLength; + it++; + } + } + //Ignore if first character is " or ' + if (it->data[0] == 34 || it->data[0] == 39) { + it->data = it->data + 1; + } + + if (memcmp(it->data, uri, uriLen) == 0) { + foundNS = true; + break; + } + } + } + } else { + rc = -1; + } + + if (rc == 0 && foundNS) { + *nsPrefix = tempNS.data; + *nsPrefixLen = tempNS.dataLength; + } + + return rc; +} diff --git a/src/tools/miniXmlParser.h b/src/tools/miniXmlParser.h new file mode 100644 index 0000000..ae0d234 --- /dev/null +++ b/src/tools/miniXmlParser.h @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ +#ifndef _MINIXMLPARSER_H +#define _MINIXMLPARSER_H +#include +#include "xmlNode.h" + +class MiniXmlParser { + public: + MiniXmlParser(); + ~MiniXmlParser(); + int parse(char* buffer, unsigned int bufferLength); + XMLNode* getRootNode() { return rootNode; }; + int getXmlTagValue(XMLNode const* rootNode, char const *tag, unsigned int tagLen, char const* ns, unsigned int nsLen, char** value, unsigned int *valueLen); + int getNSPrefix(XMLNode const* nonde, char const* uri, unsigned int uriLen, char **nsPrefix, unsigned int *nsPrefixLen); + + private: + XMLNode* rootNode; + XMLNode* _parse(char const* buffer, unsigned int bufferLength); + /* Validates if the XML is well formed and sets up parent sibling pointers */ + int validateXML(XMLNode const* rootNode); + void deleteXmlTree(XMLNode *root); +}; +#endif diff --git a/src/tools/utils.cpp b/src/tools/utils.cpp new file mode 100644 index 0000000..ec20b28 --- /dev/null +++ b/src/tools/utils.cpp @@ -0,0 +1,185 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ +#include +#include "utils.h" +#include +#include + +std::vector Utils::split(char const * str, char const * delim) { + char* tok = (char*)str; + char* ptok = tok; + int delimLength = 0; + std::vector splittedStrings; + + do { + if (str == NULL) { + break; + } + + if (delim == NULL) { + splittedStrings.push_back(std::string(str)); + break; + } + + delimLength = strlen(delim); + tok = strstr(ptok, delim); + while (tok) { + if (ptok != tok) { + splittedStrings.push_back(std::string(ptok, tok-ptok)); + } + ptok = tok + delimLength; + tok = strstr(ptok, delim); + } + + if (ptok != str+strlen(str)) { + splittedStrings.push_back(std::string(ptok, strlen(ptok))); + } + } while(0); + return splittedStrings; +} + + +char* Utils::strnstr(char const* haystack, unsigned int haystackLength, char const* needle, unsigned int needleLength) { + + char* needleInHaystack = NULL; + unsigned int j; + do { + if (haystack == NULL || needle == NULL) { + break; + } + + for (unsigned int i = 0; i < haystackLength; i++) { + if (haystack[i] == '\0' || ((haystackLength - i) < needleLength)) { + break; + } + + for (j = 0; j < needleLength; j++) { + if (haystack[i + j] != needle[j]) { + break; + } + } + + if (j == needleLength) { + //Found needle in haystack + needleInHaystack = (char*)&haystack[i]; + break; + } + } + } while(0); + return needleInHaystack; +} + +std::list Utils::split(char const* str, unsigned int strLength, char const* delim, unsigned int delimLength) { + char* tok = (char*)str; + char* ptok = tok; + std::list splittedStrings; + CDataLen dataLen; + + do { + if (str == NULL) { + break; + } + + if (delim == NULL) { + dataLen.data = (char*)str; + dataLen.dataLength = strLength; + splittedStrings.push_back(dataLen); + break; + } + + tok = Utils::strnstr(str, strLength, delim, delimLength); + while (tok) { + dataLen.data = ptok; + dataLen.dataLength = tok-ptok; + if (ptok!=tok) { + splittedStrings.push_back(dataLen); + } + ptok = tok + delimLength; + tok = Utils::strnstr(ptok, (str + strLength - ptok), delim, delimLength); + } + + if (ptok != (str + strLength)) { + dataLen.data = ptok; + dataLen.dataLength = str + strLength - ptok; + splittedStrings.push_back(dataLen); + } + } while (0); + return splittedStrings; +} + +std::string Utils::DEFAULT_NOTIFY_CMD="export DISPLAY=:0; notify-send -u critical -t 2000 "; +std::string Utils::NOTIFY_DESKTOP_SCRIPT="/usr/local/bin/notifyDesktop.sh"; +std::string Utils::NOTIFY_DESKTOP_SCRIPT1="/usr/bin/notifyDesktop.sh"; + +void Utils::notifyDesktop(std::string header, std::string body, bool logInSyslog) { + + std::string notifyCMD; + + if (! access (NOTIFY_DESKTOP_SCRIPT.c_str(), X_OK)) { + notifyCMD = NOTIFY_DESKTOP_SCRIPT + " '" + header + "' '" + body + "'"; + } else if (! access (NOTIFY_DESKTOP_SCRIPT1.c_str(), X_OK)) { + notifyCMD = NOTIFY_DESKTOP_SCRIPT1 + " '" + header + "' '" + body + "'"; + } else { + notifyCMD = DEFAULT_NOTIFY_CMD + " '" + header + "' '" + body + "'"; + } + + if (logInSyslog) { + syslog(LOG_INFO, "%s %s\n", header.c_str(), body.c_str()); + } + + system(notifyCMD.c_str()); +} + + +std::string Utils::format(const char *format , ...) { + char* buffer = NULL; + int bufferLength = 512; + int _bufferLength = 0; + va_list vl; + std::string formattedString(""); + + buffer = new char[bufferLength]; + if (buffer) { + va_start(vl, format); + + _bufferLength = vsnprintf(buffer, bufferLength, format, vl); + if (bufferLength <= _bufferLength) { + delete[] buffer; + buffer = new char[_bufferLength + 1]; + _bufferLength = vsnprintf(buffer, _bufferLength, format, vl); + } + + formattedString = std::string(buffer); + va_end(vl); + delete[] buffer; + } + + return formattedString; +} diff --git a/src/tools/utils.h b/src/tools/utils.h new file mode 100644 index 0000000..a7568fa --- /dev/null +++ b/src/tools/utils.h @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ + +#ifndef __UTILS_H +#define __UTILS_H +#include +#include +#include +#include +#include + +class CDataLen { + public: + char* data; + int dataLength; + CDataLen() { data = NULL; dataLength = 0; }; +}; + +class Utils { + public: + static std::string NOTIFY_DESKTOP_SCRIPT; + static std::string NOTIFY_DESKTOP_SCRIPT1; + static std::string DEFAULT_NOTIFY_CMD; + static std::vector split(char const* str, char const * delim); + static std::list split(char const* str, unsigned int strLength, char const* delim, unsigned int delimLength); + static char* strnstr(char const* haystack, unsigned int haystackLength, char const* needle, unsigned int needleLength); + static void notifyDesktop(std::string header, std::string body, bool logInSyslog); + static std::string format(const char *format , ...); +}; +#endif diff --git a/src/tools/xmlNode.cpp b/src/tools/xmlNode.cpp new file mode 100644 index 0000000..827cd3f --- /dev/null +++ b/src/tools/xmlNode.cpp @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ +#include "xmlNode.h" +#include +XMLNode::XMLNode() { + tagName = NULL; + nsTag = NULL; + tagLength = 0; + nsLength = 0; + startTag = 0; + emptyTag = 0; + + closingTag = NULL; + startingTag = NULL; + parentNode = NULL; + childNode = NULL; + siblingNode = NULL; +} diff --git a/src/tools/xmlNode.h b/src/tools/xmlNode.h new file mode 100644 index 0000000..4a6c91e --- /dev/null +++ b/src/tools/xmlNode.h @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (C) 2017 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corporation. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corporation. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ +#ifndef __XMLNODE_H +#define __XMLNODE_H +class XMLNode { + + public: + char* tagName; + char* nsTag; + int tagLength; + int nsLength; + int startTag; + int emptyTag; + + XMLNode* closingTag; + XMLNode* startingTag; + XMLNode* parentNode; + XMLNode* childNode; + XMLNode* siblingNode; + XMLNode(); +}; +#endif -- 2.9.3