syncevo-dbus-server: accept SAN 1.0/1.1 pacakge (MB#9312)
Also accept SAN 1.1 package, this requres enabling SAN_1_1 build option for synthesis SDK. In dbus server, when receving a message with content type 'xml/wbxml', we can not think it as a client contact us, it may also be possibly a server sending SAN 1.1 package to us; in this case first take it as a SAN package and try to parse it, if fails fall back to a normal synchronization message from a client. The SAN parsing did not fail as expected in the original implementation, thus a patch for synthesis sdk is essential.
This commit is contained in:
parent
626f0a851e
commit
12bd955d88
1 changed files with 53 additions and 45 deletions
|
@ -3404,13 +3404,62 @@ void Connection::process(const Caller_t &caller,
|
|||
// type used for testing, payload is config name
|
||||
config.assign(reinterpret_cast<const char *>(message.second),
|
||||
message.first);
|
||||
} else if (message_type == TransportAgent::m_contentTypeServerAlertedNotificationDS) {
|
||||
} else if (message_type == TransportAgent::m_contentTypeServerAlertedNotificationDS||
|
||||
/* SAN 1.0/1.1 */
|
||||
message_type == TransportAgent::m_contentTypeSyncML ||
|
||||
message_type == TransportAgent::m_contentTypeSyncWBXML) {
|
||||
sysync::SanPackage san;
|
||||
if (san.PassSan(const_cast<uint8_t *>(message.second), message.first) || san.GetHeader()) {
|
||||
int mode = (message_type == TransportAgent::m_contentTypeServerAlertedNotificationDS) ? 2 : 1;
|
||||
if (san.PassSan(const_cast<uint8_t *>(message.second), message.first, mode) || san.GetHeader()) {
|
||||
// We are very tolerant regarding the content of the message.
|
||||
// If it doesn't parse, try to do something useful anyway.
|
||||
config = "default";
|
||||
SE_LOG_DEBUG(NULL, NULL, "SAN parsing failed, falling back to 'default' config");
|
||||
// only for SAN 1.2, for SAN 1.0/1.1 we can not be sure
|
||||
// whether it is a SAN package or a normal sync pacakge
|
||||
if (message_type == TransportAgent::m_contentTypeServerAlertedNotificationDS) {
|
||||
config = "default";
|
||||
SE_LOG_DEBUG(NULL, NULL, "SAN parsing failed, falling back to 'default' config");
|
||||
} else if (message_type == TransportAgent::m_contentTypeSyncML ||
|
||||
message_type == TransportAgent::m_contentTypeSyncWBXML) {
|
||||
// run a new SyncML session as server
|
||||
serverMode = true;
|
||||
if (m_peer.find("config") == m_peer.end() &&
|
||||
!m_peer["config"].empty()) {
|
||||
SE_LOG_DEBUG(NULL, NULL, "ignoring pre-chosen config '%s'",
|
||||
m_peer["config"].c_str());
|
||||
}
|
||||
|
||||
// peek into the data to extract the locURI = device ID,
|
||||
// then use it to find the configuration
|
||||
SyncContext::SyncMLMessageInfo info;
|
||||
info = SyncContext::analyzeSyncMLMessage(reinterpret_cast<const char *>(message.second),
|
||||
message.first,
|
||||
message_type);
|
||||
if (info.m_deviceID.empty()) {
|
||||
// TODO: proper exception
|
||||
throw runtime_error("could not extract LocURI=deviceID from initial message");
|
||||
}
|
||||
BOOST_FOREACH(const SyncConfig::ConfigList::value_type &entry,
|
||||
SyncConfig::getConfigs()) {
|
||||
SyncConfig peer(entry.first);
|
||||
if (info.m_deviceID == peer.getRemoteDevID()) {
|
||||
config = entry.first;
|
||||
SE_LOG_DEBUG(NULL, NULL, "matched %s against config %s (%s)",
|
||||
info.toString().c_str(),
|
||||
entry.first.c_str(),
|
||||
entry.second.c_str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (config.empty()) {
|
||||
// TODO: proper exception
|
||||
throw runtime_error(string("no configuration found for ") +
|
||||
info.toString());
|
||||
}
|
||||
|
||||
// abort previous session of this client
|
||||
m_server.killSessions(info.m_deviceID);
|
||||
peerDeviceID = info.m_deviceID;
|
||||
}
|
||||
} else {
|
||||
// Extract server ID and match it against a server
|
||||
// configuration. Multiple different peers might use the
|
||||
|
@ -3541,47 +3590,6 @@ void Connection::process(const Caller_t &caller,
|
|||
}
|
||||
|
||||
// TODO: use the session ID set by the server if non-null
|
||||
} else if (message_type == TransportAgent::m_contentTypeSyncML ||
|
||||
message_type == TransportAgent::m_contentTypeSyncWBXML) {
|
||||
// run a new SyncML session as server
|
||||
serverMode = true;
|
||||
if (m_peer.find("config") == m_peer.end() &&
|
||||
!m_peer["config"].empty()) {
|
||||
SE_LOG_DEBUG(NULL, NULL, "ignoring pre-chosen config '%s'",
|
||||
m_peer["config"].c_str());
|
||||
}
|
||||
|
||||
// peek into the data to extract the locURI = device ID,
|
||||
// then use it to find the configuration
|
||||
SyncContext::SyncMLMessageInfo info;
|
||||
info = SyncContext::analyzeSyncMLMessage(reinterpret_cast<const char *>(message.second),
|
||||
message.first,
|
||||
message_type);
|
||||
if (info.m_deviceID.empty()) {
|
||||
// TODO: proper exception
|
||||
throw runtime_error("could not extract LocURI=deviceID from initial message");
|
||||
}
|
||||
BOOST_FOREACH(const SyncConfig::ConfigList::value_type &entry,
|
||||
SyncConfig::getConfigs()) {
|
||||
SyncConfig peer(entry.first);
|
||||
if (info.m_deviceID == peer.getRemoteDevID()) {
|
||||
config = entry.first;
|
||||
SE_LOG_DEBUG(NULL, NULL, "matched %s against config %s (%s)",
|
||||
info.toString().c_str(),
|
||||
entry.first.c_str(),
|
||||
entry.second.c_str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (config.empty()) {
|
||||
// TODO: proper exception
|
||||
throw runtime_error(string("no configuration found for ") +
|
||||
info.toString());
|
||||
}
|
||||
|
||||
// abort previous session of this client
|
||||
m_server.killSessions(info.m_deviceID);
|
||||
peerDeviceID = info.m_deviceID;
|
||||
} else {
|
||||
throw runtime_error("message type not supported for starting a sync");
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue