mirror of
				https://github.com/Telecominfraproject/wlan-cloud-ucentralgw.git
				synced 2025-11-04 04:37:46 +00:00 
			
		
		
		
	Compare commits
	
		
			26 Commits
		
	
	
		
			openapi-fi
			...
			fix_deadlo
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					115f8c1df9 | ||
| 
						 | 
					8e5eebec67 | ||
| 
						 | 
					b3d55d38d5 | ||
| 
						 | 
					75bcbd748c | ||
| 
						 | 
					b6eba2a96d | ||
| 
						 | 
					17082803d4 | ||
| 
						 | 
					26b9a96506 | ||
| 
						 | 
					5ce8dae9ec | ||
| 
						 | 
					7da135c1e5 | ||
| 
						 | 
					50ee4ba5cb | ||
| 
						 | 
					3a8109d7ad | ||
| 
						 | 
					56232966ec | ||
| 
						 | 
					1ecf98d712 | ||
| 
						 | 
					f5b60ced61 | ||
| 
						 | 
					e4d141bb8e | ||
| 
						 | 
					25b4288050 | ||
| 
						 | 
					82430c2d5d | ||
| 
						 | 
					7b68ec0536 | ||
| 
						 | 
					839f4fec44 | ||
| 
						 | 
					c4178209bb | ||
| 
						 | 
					79ab67db50 | ||
| 
						 | 
					00bc77feea | ||
| 
						 | 
					4f00d77d2b | ||
| 
						 | 
					c679d4ac40 | ||
| 
						 | 
					4a150a9fcb | ||
| 
						 | 
					83eb603f0a | 
@@ -1,5 +1,5 @@
 | 
				
			|||||||
cmake_minimum_required(VERSION 3.13)
 | 
					cmake_minimum_required(VERSION 3.13)
 | 
				
			||||||
project(owgw VERSION 3.1.0)
 | 
					project(owgw VERSION 3.2.1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set(CMAKE_CXX_STANDARD 20)
 | 
					set(CMAKE_CXX_STANDARD 20)
 | 
				
			||||||
set(CMAKE_CXX_STANDARD_REQUIRED True)
 | 
					set(CMAKE_CXX_STANDARD_REQUIRED True)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								PROTOCOL.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								PROTOCOL.md
									
									
									
									
									
								
							@@ -324,6 +324,20 @@ should respond with message indicating failure or success.
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If AP supports compressed configuration feature by inidcating `compress_cmd=true` in its capabilities, controller
 | 
				
			||||||
 | 
					will send a compressed configuration message where configuration payload (i.e. contents of `params`) is compressed
 | 
				
			||||||
 | 
					and encoded in base64 format:
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{   "jsonrpc" : "2.0",
 | 
				
			||||||
 | 
					    "method" : "configure",
 | 
				
			||||||
 | 
					    "params" : {
 | 
				
			||||||
 | 
					        "compress_64" : "<b64 encoded zlib compressed payload>",
 | 
				
			||||||
 | 
					        "compress_sz" : "<size of uncompressed data in bytes>"
 | 
				
			||||||
 | 
					     },
 | 
				
			||||||
 | 
					     "id" : <some number>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The device should answer:
 | 
					The device should answer:
 | 
				
			||||||
```json
 | 
					```json
 | 
				
			||||||
{   "jsonrpc" : "2.0",
 | 
					{   "jsonrpc" : "2.0",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -561,14 +561,14 @@ namespace OpenWifi {
 | 
				
			|||||||
	void AP_WS_Connection::OnSocketShutdown(
 | 
						void AP_WS_Connection::OnSocketShutdown(
 | 
				
			||||||
		[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ShutdownNotification> &pNf) {
 | 
							[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ShutdownNotification> &pNf) {
 | 
				
			||||||
		poco_trace(Logger_, fmt::format("SOCKET-SHUTDOWN({}): Closing.", CId_));
 | 
							poco_trace(Logger_, fmt::format("SOCKET-SHUTDOWN({}): Closing.", CId_));
 | 
				
			||||||
//		std::lock_guard	G(ConnectionMutex_);
 | 
							std::lock_guard	G(ConnectionMutex_);
 | 
				
			||||||
		return EndConnection();
 | 
							return EndConnection();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void AP_WS_Connection::OnSocketError(
 | 
						void AP_WS_Connection::OnSocketError(
 | 
				
			||||||
		[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ErrorNotification> &pNf) {
 | 
							[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ErrorNotification> &pNf) {
 | 
				
			||||||
		poco_trace(Logger_, fmt::format("SOCKET-ERROR({}): Closing.", CId_));
 | 
							poco_trace(Logger_, fmt::format("SOCKET-ERROR({}): Closing.", CId_));
 | 
				
			||||||
//		std::lock_guard	G(ConnectionMutex_);
 | 
							std::lock_guard	G(ConnectionMutex_);
 | 
				
			||||||
		return EndConnection();
 | 
							return EndConnection();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -652,8 +652,9 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				case Poco::Net::WebSocket::FRAME_OP_TEXT: {
 | 
									case Poco::Net::WebSocket::FRAME_OP_TEXT: {
 | 
				
			||||||
					poco_trace(Logger_,
 | 
										poco_trace(Logger_,
 | 
				
			||||||
							   fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}",
 | 
											fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}",
 | 
				
			||||||
										   CId_, IncomingSize, flags, IncomingFrame.begin()));
 | 
														CId_, IncomingSize, flags, IncomingFrame.begin()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					
 | 
										
 | 
				
			||||||
					Poco::JSON::Parser parser;
 | 
										Poco::JSON::Parser parser;
 | 
				
			||||||
					auto ParsedMessage = parser.parse(IncomingFrame.begin());
 | 
										auto ParsedMessage = parser.parse(IncomingFrame.begin());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,8 +57,9 @@ namespace OpenWifi {
 | 
				
			|||||||
			if (request.find("Upgrade") != request.end() &&
 | 
								if (request.find("Upgrade") != request.end() &&
 | 
				
			||||||
				Poco::icompare(request["Upgrade"], "websocket") == 0) {
 | 
									Poco::icompare(request["Upgrade"], "websocket") == 0) {
 | 
				
			||||||
				Utils::SetThreadName("ws:conn-init");
 | 
									Utils::SetThreadName("ws:conn-init");
 | 
				
			||||||
				session_id_++;
 | 
									//session_id_++;
 | 
				
			||||||
				return new AP_WS_RequestHandler(Logger_, session_id_);
 | 
									auto new_session_id =  session_id_.fetch_add(1, std::memory_order_seq_cst) + 1;
 | 
				
			||||||
 | 
									return new AP_WS_RequestHandler(Logger_, new_session_id);
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				return nullptr;
 | 
									return nullptr;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -514,10 +515,27 @@ namespace OpenWifi {
 | 
				
			|||||||
			Connection = SessionHint->second;
 | 
								Connection = SessionHint->second;
 | 
				
			||||||
			Sessions_[sessionHash].erase(SessionHint);
 | 
								Sessions_[sessionHash].erase(SessionHint);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							std::atomic_bool duplicate_session = false;
 | 
				
			||||||
		auto deviceHash = MACHash::Hash(SerialNumber);
 | 
							{
 | 
				
			||||||
		std::lock_guard DeviceLock(SerialNumbersMutex_[deviceHash]);
 | 
								auto deviceHash = MACHash::Hash(SerialNumber);
 | 
				
			||||||
		SerialNumbers_[deviceHash][SerialNumber] = Connection;
 | 
								std::lock_guard DeviceLock(SerialNumbersMutex_[deviceHash]);
 | 
				
			||||||
 | 
								auto DeviceHint = SerialNumbers_[deviceHash].find(SerialNumber);
 | 
				
			||||||
 | 
					            if (DeviceHint == SerialNumbers_[deviceHash].end()) {
 | 
				
			||||||
 | 
					                // No duplicate connection go ahead and add new connection
 | 
				
			||||||
 | 
							        SerialNumbers_[deviceHash][SerialNumber] = Connection;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else {
 | 
				
			||||||
 | 
					                // Mark a duplicate session
 | 
				
			||||||
 | 
					                duplicate_session = true;
 | 
				
			||||||
 | 
									poco_information(Logger(), fmt::format("[session ID: {}] Found a duplicate connection for device serial: {}", session_id, Utils::IntToSerialNumber(SerialNumber)));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (duplicate_session.load()){
 | 
				
			||||||
 | 
					            // This is only called if we have a duplicate session
 | 
				
			||||||
 | 
					            // We remove the new incoming session that we just added a few lines above, forcing the destructor for this new session while not impacting the pointers to the old session.
 | 
				
			||||||
 | 
					            std::lock_guard SessionLock(SessionMutex_[sessionHash]);
 | 
				
			||||||
 | 
								Sessions_[sessionHash].erase(session_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool AP_WS_Server::EndSession(uint64_t session_id, uint64_t SerialNumber) {
 | 
						bool AP_WS_Server::EndSession(uint64_t session_id, uint64_t SerialNumber) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -111,7 +111,7 @@ namespace OpenWifi {
 | 
				
			|||||||
				i >> cache;
 | 
									i >> cache;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				for (const auto &[Type, Platform] : cache.items()) {
 | 
									for (const auto &[Type, Platform] : cache.items()) {
 | 
				
			||||||
					Platforms_[Type] = Poco::toLower(to_string(Platform));
 | 
										Platforms_[Type] = Poco::toLower(Platform.get<std::string>());
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} catch (...) {
 | 
								} catch (...) {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -54,8 +54,8 @@ namespace OpenWifi::RESTAPI_RPC {
 | 
				
			|||||||
						std::chrono::milliseconds WaitTimeInMs, Poco::JSON::Object *ObjectToReturn,
 | 
											std::chrono::milliseconds WaitTimeInMs, Poco::JSON::Object *ObjectToReturn,
 | 
				
			||||||
						RESTAPIHandler *Handler, Poco::Logger &Logger, bool Deferred) {
 | 
											RESTAPIHandler *Handler, Poco::Logger &Logger, bool Deferred) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Logger.information(fmt::format("{},{}: New {} command. User={} Serial={}. ", Cmd.UUID,
 | 
							Logger.information(fmt::format("{},{}: New {} command. User={} Serial={} Details={}. ", Cmd.UUID,
 | 
				
			||||||
									   RPCID, Cmd.Command, Cmd.SubmittedBy, Cmd.SerialNumber));
 | 
														   RPCID, Cmd.Command, Cmd.SubmittedBy, Cmd.SerialNumber, Cmd.Details));
 | 
				
			||||||
		Cmd.Submitted = Utils::Now();
 | 
							Cmd.Submitted = Utils::Now();
 | 
				
			||||||
		Cmd.Executed = 0;
 | 
							Cmd.Executed = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -694,9 +694,31 @@ namespace OpenWifi {
 | 
				
			|||||||
				Params.stringify(ParamStream);
 | 
									Params.stringify(ParamStream);
 | 
				
			||||||
				Cmd.Details = ParamStream.str();
 | 
									Cmd.Details = ParamStream.str();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// retrieve capabilities and encode/compress parameters, if required
 | 
				
			||||||
 | 
									Poco::JSON::Object ConfigParams = Params;
 | 
				
			||||||
 | 
									GWObjects::Capabilities Caps;
 | 
				
			||||||
 | 
									if (StorageService()->GetDeviceCapabilities(SerialNumber_, Caps)) {
 | 
				
			||||||
 | 
										Poco::JSON::Object CapsJson;
 | 
				
			||||||
 | 
										Caps.to_json(CapsJson);
 | 
				
			||||||
 | 
										auto DeviceCaps = CapsJson.getObject(uCentralProtocol::CAPABILITIES);
 | 
				
			||||||
 | 
										if (DeviceCaps->has("compress_cmd") && DeviceCaps->get("compress_cmd")) {
 | 
				
			||||||
 | 
											// compressed command capability present and it is set, compress parameters
 | 
				
			||||||
 | 
											Poco::JSON::Object CompressedParams;
 | 
				
			||||||
 | 
											std::string CompressedBase64Data;
 | 
				
			||||||
 | 
											std::uint64_t UncompressedDataLen = ParamStream.str().length();
 | 
				
			||||||
 | 
											if (Utils::CompressAndEncodeBase64(ParamStream.str(), CompressedBase64Data)) {
 | 
				
			||||||
 | 
												// set compressed, base 64 encoded data and length of uncompressed data
 | 
				
			||||||
 | 
												CompressedParams.set(uCentralProtocol::COMPRESS_64, CompressedBase64Data);
 | 
				
			||||||
 | 
												CompressedParams.set(uCentralProtocol::COMPRESS_SZ, UncompressedDataLen);
 | 
				
			||||||
 | 
												ConfigParams = CompressedParams;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// AP_WS_Server()->SetPendingUUID(SerialNumber_, NewUUID);
 | 
									// AP_WS_Server()->SetPendingUUID(SerialNumber_, NewUUID);
 | 
				
			||||||
				RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::configure, true,
 | 
									RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::configure, true,
 | 
				
			||||||
												   Cmd, Params, *Request, *Response, timeout,
 | 
																	   Cmd, ConfigParams, *Request, *Response, timeout,
 | 
				
			||||||
												   nullptr, this, Logger_);
 | 
																	   nullptr, this, Logger_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if(!Cmd.Executed) {
 | 
									if(!Cmd.Executed) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,9 +22,15 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		std::string FileType;
 | 
							std::string FileType;
 | 
				
			||||||
		std::string FileContent;
 | 
							std::string FileContent;
 | 
				
			||||||
		if (!StorageService()->GetAttachedFileContent(UUID, SerialNumber, FileContent, FileType) || FileContent.empty()) {
 | 
							int WaitingForFile = 0;
 | 
				
			||||||
 | 
							if (!StorageService()->GetAttachedFileContent(UUID, SerialNumber, FileContent, FileType, WaitingForFile) && !WaitingForFile) {
 | 
				
			||||||
			return NotFound();
 | 
								return NotFound();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							else if (WaitingForFile) {
 | 
				
			||||||
 | 
								// waiting for file to be uploaded, return Accepted
 | 
				
			||||||
 | 
								return Accepted();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (FileType == "pcap") {
 | 
							if (FileType == "pcap") {
 | 
				
			||||||
			SendFileContent(FileContent, "application/vnd.tcpdump.pcap", UUID + ".pcap");
 | 
								SendFileContent(FileContent, "application/vnd.tcpdump.pcap", UUID + ".pcap");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -243,7 +243,7 @@ namespace OpenWifi {
 | 
				
			|||||||
									 const std::string &Type);
 | 
														 const std::string &Type);
 | 
				
			||||||
		bool CancelWaitFile(std::string &UUID, std::string &ErrorText);
 | 
							bool CancelWaitFile(std::string &UUID, std::string &ErrorText);
 | 
				
			||||||
		bool GetAttachedFileContent(std::string &UUID, const std::string &SerialNumber,
 | 
							bool GetAttachedFileContent(std::string &UUID, const std::string &SerialNumber,
 | 
				
			||||||
									std::string &FileContent, std::string &Type);
 | 
														std::string &FileContent, std::string &Type, int& WaitingForFile);
 | 
				
			||||||
		bool RemoveAttachedFile(std::string &UUID);
 | 
							bool RemoveAttachedFile(std::string &UUID);
 | 
				
			||||||
		bool SetCommandResult(std::string &UUID, std::string &Result);
 | 
							bool SetCommandResult(std::string &UUID, std::string &Result);
 | 
				
			||||||
		bool GetNewestCommands(std::string &SerialNumber, uint64_t HowMany,
 | 
							bool GetNewestCommands(std::string &SerialNumber, uint64_t HowMany,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -376,18 +376,21 @@ static std::string DefaultAPSchema = R"foo(
 | 
				
			|||||||
            "properties": {
 | 
					            "properties": {
 | 
				
			||||||
                "port-mirror": {
 | 
					                "port-mirror": {
 | 
				
			||||||
                    "description": "Enable mirror of traffic from multiple minotor ports to a single analysis port.",
 | 
					                    "description": "Enable mirror of traffic from multiple minotor ports to a single analysis port.",
 | 
				
			||||||
                    "type": "object",
 | 
					                    "type": "array",
 | 
				
			||||||
                    "properties": {
 | 
					                    "items": {
 | 
				
			||||||
                        "monitor-ports": {
 | 
					                        "type": "object",
 | 
				
			||||||
                            "description": "The list of ports that we want to mirror.",
 | 
					                        "properties": {
 | 
				
			||||||
                            "type": "array",
 | 
					                            "monitor-ports": {
 | 
				
			||||||
                            "items": {
 | 
					                                "description": "The list of ports that we want to mirror.",
 | 
				
			||||||
 | 
					                                "type": "array",
 | 
				
			||||||
 | 
					                                "items": {
 | 
				
			||||||
 | 
					                                    "type": "string"
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            },
 | 
				
			||||||
 | 
					                            "analysis-port": {
 | 
				
			||||||
 | 
					                                "description": "The port that mirror'ed packets should be sent to.",
 | 
				
			||||||
                                "type": "string"
 | 
					                                "type": "string"
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                        "analysis-port": {
 | 
					 | 
				
			||||||
                            "description": "The port that mirror'ed packets should be sent to.",
 | 
					 | 
				
			||||||
                            "type": "string"
 | 
					 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
@@ -4652,16 +4655,22 @@ static std::string DefaultSWITCHSchema = R"foo(
 | 
				
			|||||||
            "type": "object",
 | 
					            "type": "object",
 | 
				
			||||||
            "properties": {
 | 
					            "properties": {
 | 
				
			||||||
                "port-mirror": {
 | 
					                "port-mirror": {
 | 
				
			||||||
                    "type": "object",
 | 
					                    "description": "Enable mirror of traffic from multiple minotor ports to a single analysis port.",
 | 
				
			||||||
                    "properties": {
 | 
					                    "type": "array",
 | 
				
			||||||
                        "monitor-ports": {
 | 
					                    "items": {
 | 
				
			||||||
                            "type": "array",
 | 
					                        "type": "object",
 | 
				
			||||||
                            "items": {
 | 
					                        "properties": {
 | 
				
			||||||
 | 
					                            "monitor-ports": {
 | 
				
			||||||
 | 
					                                "description": "The list of ports that we want to mirror.",
 | 
				
			||||||
 | 
					                                "type": "array",
 | 
				
			||||||
 | 
					                                "items": {
 | 
				
			||||||
 | 
					                                    "type": "string"
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            },
 | 
				
			||||||
 | 
					                            "analysis-port": {
 | 
				
			||||||
 | 
					                                "description": "The port that mirror'ed packets should be sent to.",
 | 
				
			||||||
                                "type": "string"
 | 
					                                "type": "string"
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                        "analysis-port": {
 | 
					 | 
				
			||||||
                            "type": "string"
 | 
					 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -431,6 +431,11 @@ namespace OpenWifi {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline void Accepted() {
 | 
				
			||||||
 | 
								PrepareResponse(Poco::Net::HTTPResponse::HTTP_ACCEPTED);
 | 
				
			||||||
 | 
								Response->send();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		inline void SendCompressedTarFile(const std::string &FileName, const std::string &Content) {
 | 
							inline void SendCompressedTarFile(const std::string &FileName, const std::string &Content) {
 | 
				
			||||||
			Response->setStatus(Poco::Net::HTTPResponse::HTTPStatus::HTTP_OK);
 | 
								Response->setStatus(Poco::Net::HTTPResponse::HTTPStatus::HTTP_OK);
 | 
				
			||||||
			SetCommonHeaders();
 | 
								SetCommonHeaders();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -611,6 +611,7 @@ namespace OpenWifi::uCentralProtocol {
 | 
				
			|||||||
	static const char *CFGPENDING = "cfgpending";
 | 
						static const char *CFGPENDING = "cfgpending";
 | 
				
			||||||
	static const char *RECOVERY = "recovery";
 | 
						static const char *RECOVERY = "recovery";
 | 
				
			||||||
	static const char *COMPRESS_64 = "compress_64";
 | 
						static const char *COMPRESS_64 = "compress_64";
 | 
				
			||||||
 | 
						static const char *COMPRESS_SZ = "compress_sz";
 | 
				
			||||||
	static const char *CAPABILITIES = "capabilities";
 | 
						static const char *CAPABILITIES = "capabilities";
 | 
				
			||||||
	static const char *REQUEST_UUID = "request_uuid";
 | 
						static const char *REQUEST_UUID = "request_uuid";
 | 
				
			||||||
	static const char *SANITY = "sanity";
 | 
						static const char *SANITY = "sanity";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -590,6 +590,26 @@ namespace OpenWifi::Utils {
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// Compress given data using utility function and encode it in base64 format.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						bool CompressAndEncodeBase64(const std::string& UnCompressedData, std::string& CompressedBase64Data) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							unsigned long CompressedDataSize = UnCompressedData.size();
 | 
				
			||||||
 | 
							std::vector<Bytef> CompressedData(CompressedDataSize);
 | 
				
			||||||
 | 
							auto status = compress(&CompressedData[0], &CompressedDataSize,
 | 
				
			||||||
 | 
													(Bytef*) UnCompressedData.c_str(), UnCompressedData.size());
 | 
				
			||||||
 | 
							if (status == Z_OK) {
 | 
				
			||||||
 | 
								CompressedBase64Data = OpenWifi::Utils::base64encode(&CompressedData[0], CompressedDataSize);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								// failed to compress data
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool IsAlphaNumeric(const std::string &s) {
 | 
						bool IsAlphaNumeric(const std::string &s) {
 | 
				
			||||||
		return std::all_of(s.begin(), s.end(), [](char c) -> bool { return isalnum(c); });
 | 
							return std::all_of(s.begin(), s.end(), [](char c) -> bool { return isalnum(c); });
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -151,6 +151,8 @@ namespace OpenWifi::Utils {
 | 
				
			|||||||
	bool ExtractBase64CompressedData(const std::string &CompressedData,
 | 
						bool ExtractBase64CompressedData(const std::string &CompressedData,
 | 
				
			||||||
									 std::string &UnCompressedData, uint64_t compress_sz);
 | 
														 std::string &UnCompressedData, uint64_t compress_sz);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool CompressAndEncodeBase64(const std::string& UnCompressedData, std::string& CompressedData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline bool match(const char* first, const char* second)
 | 
						inline bool match(const char* first, const char* second)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// If we reach at the end of both strings, we are done
 | 
							// If we reach at the end of both strings, we are done
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -644,21 +644,7 @@ namespace OpenWifi {
 | 
				
			|||||||
			uint64_t Size = FileContent.str().size();
 | 
								uint64_t Size = FileContent.str().size();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Poco::Data::Session Sess = Pool_->get();
 | 
								Poco::Data::Session Sess = Pool_->get();
 | 
				
			||||||
			Sess.begin();
 | 
					 | 
				
			||||||
			Poco::Data::Statement Statement(Sess);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			std::string StatementStr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			//	Get the existing command
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			StatementStr =
 | 
					 | 
				
			||||||
				"UPDATE CommandList SET WaitingForFile=?, AttachDate=?, AttachSize=? WHERE UUID=?";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			Statement << ConvertParams(StatementStr), Poco::Data::Keywords::use(WaitForFile),
 | 
					 | 
				
			||||||
				Poco::Data::Keywords::use(Now), Poco::Data::Keywords::use(Size),
 | 
					 | 
				
			||||||
				Poco::Data::Keywords::use(UUID);
 | 
					 | 
				
			||||||
			Statement.execute();
 | 
					 | 
				
			||||||
			Sess.commit();
 | 
					 | 
				
			||||||
			if (Size < FileUploader()->MaxSize()) {
 | 
								if (Size < FileUploader()->MaxSize()) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				Poco::Data::BLOB TheBlob;
 | 
									Poco::Data::BLOB TheBlob;
 | 
				
			||||||
@@ -680,7 +666,20 @@ namespace OpenWifi {
 | 
				
			|||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				poco_warning(Logger(), fmt::format("File {} is too large.", UUID));
 | 
									poco_warning(Logger(), fmt::format("File {} is too large.", UUID));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// update CommandList here to ensure that file us uploaded
 | 
				
			||||||
 | 
					                        Sess.begin();
 | 
				
			||||||
 | 
					                        Poco::Data::Statement Statement(Sess);
 | 
				
			||||||
 | 
								std::string StatementStr;
 | 
				
			||||||
 | 
								StatementStr =
 | 
				
			||||||
 | 
									"UPDATE CommandList SET WaitingForFile=?, AttachDate=?, AttachSize=? WHERE UUID=?";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Statement << ConvertParams(StatementStr), Poco::Data::Keywords::use(WaitForFile),
 | 
				
			||||||
 | 
									Poco::Data::Keywords::use(Now), Poco::Data::Keywords::use(Size),
 | 
				
			||||||
 | 
									Poco::Data::Keywords::use(UUID);
 | 
				
			||||||
 | 
								Statement.execute();
 | 
				
			||||||
			Sess.commit();
 | 
								Sess.commit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (const Poco::Exception &E) {
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
			Logger().log(E);
 | 
								Logger().log(E);
 | 
				
			||||||
@@ -689,7 +688,7 @@ namespace OpenWifi {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool Storage::GetAttachedFileContent(std::string &UUID, const std::string &SerialNumber,
 | 
						bool Storage::GetAttachedFileContent(std::string &UUID, const std::string &SerialNumber,
 | 
				
			||||||
										 std::string &FileContent, std::string &Type) {
 | 
															 std::string &FileContent, std::string &Type, int &WaitingForFile) {
 | 
				
			||||||
		try {
 | 
							try {
 | 
				
			||||||
			Poco::Data::BLOB L;
 | 
								Poco::Data::BLOB L;
 | 
				
			||||||
			/*
 | 
								/*
 | 
				
			||||||
@@ -702,10 +701,10 @@ namespace OpenWifi {
 | 
				
			|||||||
			Poco::Data::Statement Select1(Sess);
 | 
								Poco::Data::Statement Select1(Sess);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			std::string TmpSerialNumber;
 | 
								std::string TmpSerialNumber;
 | 
				
			||||||
			std::string st1{"SELECT SerialNumber, Command FROM CommandList WHERE UUID=?"};
 | 
								std::string st1{"SELECT SerialNumber, Command , WaitingForFile FROM CommandList WHERE UUID=?"};
 | 
				
			||||||
			std::string Command;
 | 
								std::string Command;
 | 
				
			||||||
			Select1 << ConvertParams(st1), Poco::Data::Keywords::into(TmpSerialNumber),
 | 
								Select1 << ConvertParams(st1), Poco::Data::Keywords::into(TmpSerialNumber),
 | 
				
			||||||
				Poco::Data::Keywords::into(Command), Poco::Data::Keywords::use(UUID);
 | 
									Poco::Data::Keywords::into(Command), Poco::Data::Keywords::into(WaitingForFile), Poco::Data::Keywords::use(UUID);
 | 
				
			||||||
			Select1.execute();
 | 
								Select1.execute();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (TmpSerialNumber != SerialNumber) {
 | 
								if (TmpSerialNumber != SerialNumber) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user