Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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++;
}
Ejemplo n.º 3
0
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);
}