void CVerifyCertDialog::LoadTrustedCerts() { CReentrantInterProcessMutexLocker mutex(MUTEX_TRUSTEDCERTS); if (!m_xmlFile.Modified()) { return; } TiXmlElement* pElement = m_xmlFile.Load(); if (!pElement) { return; } m_trustedCerts.clear(); if (!(pElement = pElement->FirstChildElement("TrustedCerts"))) return; bool modified = false; TiXmlElement* pCert = pElement->FirstChildElement("Certificate"); while (pCert) { wxString value = GetTextElement(pCert, "Data"); TiXmlElement* pRemove = 0; t_certData data; if (value.empty() || !(data.data = ConvertStringToHex(value, data.len))) pRemove = pCert; data.host = GetTextElement(pCert, "Host"); data.port = GetTextElementInt(pCert, "Port"); if (data.host.empty() || data.port < 1 || data.port > 65535) pRemove = pCert; wxLongLong activationTime = GetTextElementLongLong(pCert, "ActivationTime", 0); if (activationTime == 0 || activationTime > wxDateTime::GetTimeNow()) pRemove = pCert; wxLongLong expirationTime = GetTextElementLongLong(pCert, "ExpirationTime", 0); if (expirationTime == 0 || expirationTime < wxDateTime::GetTimeNow()) pRemove = pCert; if (IsTrusted(data.host, data.port, data.data, data.len, true)) // Weed out duplicates pRemove = pCert; if (!pRemove) m_trustedCerts.push_back(data); else delete [] data.data; pCert = pCert->NextSiblingElement("Certificate"); if (pRemove) { modified = true; pElement->RemoveChild(pRemove); } } if (modified) m_xmlFile.Save(false); }
void ProcessSSDVMessage(int Channel, unsigned char *Message) { // SSDV packet static uint32_t PreviousCallsignCode=0; static int PreviousImageNumber=-1, PreviousPacketNumber=0; uint32_t CallsignCode; char Callsign[7], *FileMode, *EncodedCallsign, *EncodedEncoding, *EncodedData, HexString[513]; int ImageNumber, PacketNumber; char filename[100]; FILE *fp; Message[0] = 0x55; CallsignCode = Message[2]; CallsignCode <<= 8; CallsignCode |= Message[3]; CallsignCode <<= 8; CallsignCode |= Message[4]; CallsignCode <<= 8; CallsignCode |= Message[5]; decode_callsign(Callsign, CallsignCode); ImageNumber = Message[6]; PacketNumber = Message[8]; // Create new file ? if ((ImageNumber != PreviousImageNumber) || (PacketNumber <= PreviousPacketNumber) || (CallsignCode != PreviousCallsignCode)) { // New image so new file // FileMode = "wb"; FileMode = "ab"; Config.LoRaDevices[Channel].SSDVMissing = PacketNumber; } else { FileMode = "ab"; if (PacketNumber > (PreviousPacketNumber+1)) { Config.LoRaDevices[Channel].SSDVMissing += PacketNumber - PreviousPacketNumber - 1; } } LogMessage("Ch%d: SSDV Packet, Callsign %s, Image %d, Packet %d, %d Missing\n", Channel, Callsign, Message[6], Message[7] * 256 + Message[8], Config.LoRaDevices[Channel].SSDVMissing); ChannelPrintf(Channel, 4, 1, "SSDV Packet "); PreviousImageNumber = ImageNumber; PreviousPacketNumber = PacketNumber; PreviousCallsignCode = CallsignCode; // Save to file sprintf(filename, "/tmp/%s_%d.bin", Callsign, ImageNumber); if ((fp = fopen(filename, FileMode))) { fwrite(Message, 1, 256, fp); fclose(fp); } // Upload to server if (Config.EnableSSDV) { EncodedCallsign = url_encode(Callsign); EncodedEncoding = url_encode("hex"); // Base64Data = base64_encode(Message, 256, &output_length); // printf("output_length=%d, byte=%02Xh\n", output_length, Base64Data[output_length]); // Base64Data[output_length] = '\0'; // printf ("Base64Data '%s'\n", Base64Data); ConvertStringToHex(HexString, Message, 256); EncodedData = url_encode(HexString); UploadImagePacket(EncodedCallsign, EncodedEncoding, EncodedData); free(EncodedCallsign); free(EncodedEncoding); // free(Base64Data); free(EncodedData); } Config.LoRaDevices[Channel].SSDVCount++; }
void CVerifyCertDialog::LoadTrustedCerts() { CReentrantInterProcessMutexLocker mutex(MUTEX_TRUSTEDCERTS); if (!m_xmlFile.Modified()) { return; } auto element = m_xmlFile.Load(); if (!element) { return; } m_trustedCerts.clear(); if (!(element = element.child("TrustedCerts"))) return; bool modified = false; auto cert = element.child("Certificate"); while (cert) { wxString value = GetTextElement(cert, "Data"); pugi::xml_node remove; t_certData data; if (value.empty() || !(data.data = ConvertStringToHex(value, data.len))) remove = cert; data.host = GetTextElement(cert, "Host"); data.port = GetTextElementInt(cert, "Port"); if (data.host.empty() || data.port < 1 || data.port > 65535) remove = cert; int64_t activationTime = GetTextElementInt(cert, "ActivationTime", 0); if (activationTime == 0 || activationTime > wxDateTime::GetTimeNow()) remove = cert; int64_t expirationTime = GetTextElementInt(cert, "ExpirationTime", 0); if (expirationTime == 0 || expirationTime < wxDateTime::GetTimeNow()) remove = cert; if (IsTrusted(data.host, data.port, data.data, data.len, true)) // Weed out duplicates remove = cert; if (!remove) m_trustedCerts.push_back(data); else delete [] data.data; cert = cert.next_sibling("Certificate"); if (remove) { modified = true; element.remove_child(remove); } } if (modified) m_xmlFile.Save(false); }