static AJ_Status SessionBindReply(duk_context* ctx, AJ_Message* msg) { AJ_Status status; uint32_t result; uint16_t port; uint8_t ldstate; status = AJ_UnmarshalArgs(msg, "uq", &result, &port); if (status != AJ_OK) { return status; } if (port != AJS_APP_PORT) { AJ_ResetArgs(msg); #if !defined(AJS_CONSOLE_LOCKDOWN) status = AJS_GetLockdownState(&ldstate); if (status == AJ_OK && ldstate == AJS_CONSOLE_UNLOCKED) { status = AJS_ConsoleMsgHandler(ctx, msg); } #endif if (status == AJ_ERR_NO_MATCH) { status = AJS_ServicesMsgHandler(msg); if (status == AJ_ERR_NO_MATCH) { status = AJ_OK; } } } return status; }
uint8_t AJNS_Consumer_IsSuperAgentLost(AJ_Message* msg) { if (msg->msgId == AJ_SIGNAL_LOST_ADV_NAME) { AJ_Arg arg; AJ_UnmarshalArg(msg, &arg); // <arg name="name" type="s" direction="out"/> AJ_SkipArg(msg); // <arg name="transport" type="q" direction="out"/> AJ_SkipArg(msg); // <arg name="prefix" type="s" direction="out"/> AJ_ResetArgs(msg); // Reset to allow others to re-unmarshal message AJ_InfoPrintf(("LostAdvertisedName(%s)\n", arg.val.v_string)); return (strcmp(arg.val.v_string, currentSuperAgentBusName) == 0); } return FALSE; }
static AJ_Status SessionDispatcher(duk_context* ctx, AJ_Message* msg) { AJ_Status status; uint32_t sessionId; uint16_t port; char* joiner; uint8_t ldstate; status = AJ_UnmarshalArgs(msg, "qus", &port, &sessionId, &joiner); if (status != AJ_OK) { return status; } /* * Automatically accept sessions requests to the application port */ if (port == AJS_APP_PORT) { return AJS_HandleAcceptSession(ctx, msg, port, sessionId, joiner); } /* * See if this is the control panel port */ if (AJCPS_CheckSessionAccepted(port, sessionId, joiner)) { return AJ_BusReplyAcceptSession(msg, TRUE); } status = AJ_ResetArgs(msg); if (status != AJ_OK) { return status; } /* * JavaScript doesn't accept/reject session so the session is either for the console or perhaps * a service if the services bind their own ports. */ #if !defined(AJS_CONSOLE_LOCKDOWN) status = AJS_GetLockdownState(&ldstate); if (status == AJ_OK && ldstate == AJS_CONSOLE_UNLOCKED) { status = AJS_ConsoleMsgHandler(ctx, msg); } #endif if (status == AJ_ERR_NO_MATCH) { status = AJS_ServicesMsgHandler(msg); } if (status == AJ_ERR_NO_MATCH) { AJ_ErrPrintf(("SessionDispatcher rejecting attempt to join unbound port %d\n", port)); status = AJ_BusReplyAcceptSession(msg, FALSE); } return status; }
AJ_Status AJ_BusHandleBusMessage(AJ_Message* msg) { AJ_Status status = AJ_OK; char* name; char* oldOwner; char* newOwner; AJ_Message reply; AJ_InfoPrintf(("AJ_BusHandleBusMessage(msg=0x%p)\n", msg)); /* * Check we actually have a message to handle */ if (!msg->hdr) { return AJ_OK; } switch (msg->msgId) { case AJ_METHOD_PING: AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_METHOD_PING\n")); status = AJ_MarshalReplyMsg(msg, &reply); break; case AJ_METHOD_GET_MACHINE_ID: AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_METHOD_GET_MACHINE_ID\n")); status = HandleGetMachineId(msg, &reply); break; case AJ_METHOD_INTROSPECT: AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_METHOD_INTROSPECT\n")); status = AJ_HandleIntrospectRequest(msg, &reply); break; case AJ_METHOD_EXCHANGE_GUIDS: AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_METHOD_EXCHANGE_GUIDS\n")); status = AJ_PeerHandleExchangeGUIDs(msg, &reply); break; case AJ_METHOD_GEN_SESSION_KEY: AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_METHOD_GEN_SESSION_KEY\n")); status = AJ_PeerHandleGenSessionKey(msg, &reply); break; case AJ_METHOD_EXCHANGE_GROUP_KEYS: AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_METHOD_EXCHANGE_GROUP_KEYS\n")); status = AJ_PeerHandleExchangeGroupKeys(msg, &reply); break; case AJ_METHOD_AUTH_CHALLENGE: AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_METHOD_AUTH_CHALLENGE\n")); status = AJ_PeerHandleAuthChallenge(msg, &reply); break; case AJ_REPLY_ID(AJ_METHOD_EXCHANGE_GUIDS): AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_REPLY_ID(AJ_METHOD_EXCHANGE_GUIDS)\n")); status = AJ_PeerHandleExchangeGUIDsReply(msg); break; case AJ_REPLY_ID(AJ_METHOD_AUTH_CHALLENGE): AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_REPLY_ID(AJ_METHOD_AUTH_CHALLENGE)\n")); status = AJ_PeerHandleAuthChallengeReply(msg); break; case AJ_REPLY_ID(AJ_METHOD_GEN_SESSION_KEY): AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_REPLY_ID(AJ_METHOD_GEN_SESSION_KEY)\n")); status = AJ_PeerHandleGenSessionKeyReply(msg); break; case AJ_REPLY_ID(AJ_METHOD_EXCHANGE_GROUP_KEYS): AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_REPLY_ID(AJ_METHOD_EXCHANGE_GROUP_KEYS)\n")); status = AJ_PeerHandleExchangeGroupKeysReply(msg); break; case AJ_REPLY_ID(AJ_METHOD_CANCEL_SESSIONLESS): AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_REPLY_ID(AJ_METHOD_CANCEL_SESSIONLESS)\n")); // handle return code here status = AJ_OK; break; case AJ_SIGNAL_SESSION_JOINED: case AJ_SIGNAL_NAME_ACQUIRED: AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_SIGNAL_{SESSION_JOINED|NAME_ACQUIRED}\n")); // nothing to do here status = AJ_OK; break; case AJ_REPLY_ID(AJ_METHOD_ADD_MATCH): case AJ_REPLY_ID(AJ_METHOD_REMOVE_MATCH): case AJ_REPLY_ID(AJ_METHOD_CANCEL_ADVERTISE): case AJ_REPLY_ID(AJ_METHOD_ADVERTISE_NAME): AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_REPLY_ID(AJ_METHOD_{ADD_MATCH|CANCEL_ADVERTISE|ADVERTISE_NAME})\n")); if (msg->hdr->msgType == AJ_MSG_ERROR) { status = AJ_ERR_FAILURE; } break; case AJ_SIGNAL_NAME_OWNER_CHANGED: AJ_InfoPrintf(("AJ_BusHandleBusMessage(): AJ_SIGNAL_NAME_OWNER_CHANGED)\n")); AJ_UnmarshalArgs(msg, "sss", &name, &oldOwner, &newOwner); if (newOwner && oldOwner && newOwner[0] == '\0') { AJ_GUID_DeleteNameMapping(oldOwner); } /* * Reset so the application can handle this too */ status = AJ_ResetArgs(msg); break; default: AJ_InfoPrintf(("AJ_BusHandleBusMessage(): default\n")); if (msg->hdr->msgType == AJ_MSG_METHOD_CALL) { status = AJ_MarshalErrorMsg(msg, &reply, AJ_ErrRejected); } break; } if ((status == AJ_OK) && (msg->hdr->msgType == AJ_MSG_METHOD_CALL)) { status = AJ_DeliverMsg(&reply); } return status; }
int AJ_Main(int argc, char** argv) { AJ_Status status = AJ_OK; AJ_BusAttachment bus; uint8_t connected = FALSE; uint32_t sessionId = 0; uint16_t state; uint16_t capabilities; uint16_t info; /* One time initialization before calling any other AllJoyn APIs. */ AJ_Initialize(); /* This is for debug purposes and is optional. */ AJ_PrintXML(AppObjects); AJ_RegisterObjects(AppObjects, NULL); while (TRUE) { AJ_Message msg; if (!connected) { status = AJ_StartService(&bus, NULL, CONNECT_TIMEOUT, FALSE, ServicePort, ServiceName, AJ_NAME_REQ_DO_NOT_QUEUE, NULL); if (status != AJ_OK) { continue; } AJ_InfoPrintf(("StartService returned %d, session_id=%u\n", status, sessionId)); connected = TRUE; AJ_BusEnableSecurity(&bus, suites, numsuites); AJ_BusSetAuthListenerCallback(&bus, AuthListenerCallback); AJ_ManifestTemplateSet(&manifest); AJ_SecurityGetClaimConfig(&state, &capabilities, &info); /* Set app claimable if not already claimed */ if (APP_STATE_CLAIMED != state) { AJ_SecuritySetClaimConfig(&bus, APP_STATE_CLAIMABLE, CLAIM_CAPABILITY_ECDHE_PSK, 0); } } status = AJ_UnmarshalMsg(&bus, &msg, UNMARSHAL_TIMEOUT); if (AJ_ERR_TIMEOUT == status) { continue; } if (AJ_OK == status) { switch (msg.msgId) { case AJ_METHOD_ACCEPT_SESSION: { uint16_t port; char* joiner; AJ_UnmarshalArgs(&msg, "qus", &port, &sessionId, &joiner); if (port == ServicePort) { status = AJ_BusReplyAcceptSession(&msg, TRUE); AJ_InfoPrintf(("Accepted session session_id=%u joiner=%s\n", sessionId, joiner)); } else { status = AJ_ResetArgs(&msg); if (AJ_OK != status) { break; } status = AJ_BusHandleBusMessage(&msg); } } break; case BASIC_SERVICE_PING: status = AppHandlePing(&msg); break; case AJ_SIGNAL_SESSION_LOST_WITH_REASON: /* Force a disconnect. */ { uint32_t id, reason; AJ_UnmarshalArgs(&msg, "uu", &id, &reason); AJ_AlwaysPrintf(("Session lost. ID = %u, reason = %u", id, reason)); } status = AJ_ERR_SESSION_LOST; break; default: /* Pass to the built-in handlers. */ status = AJ_BusHandleBusMessage(&msg); break; } } /* Messages MUST be discarded to free resources. */ AJ_CloseMsg(&msg); if ((status == AJ_ERR_READ) || (status == AJ_ERR_WRITE)) { AJ_Printf("AllJoyn disconnect.\n"); AJ_Disconnect(&bus); connected = FALSE; /* Sleep a little while before trying to reconnect. */ AJ_Sleep(SLEEP_TIME); } } AJ_Printf("Secure service exiting with status 0x%04x.\n", status); // Clean up certificate chain while (chain) { node = chain; chain = chain->next; AJ_Free(node->certificate.der.data); AJ_Free(node); } return status; }
AJSVC_ServiceStatus AJServices_MessageProcessor(AJ_BusAttachment* busAttachment, AJ_Message* msg, AJ_Status* status) { AJSVC_ServiceStatus serviceStatus = AJSVC_SERVICE_STATUS_NOT_HANDLED; if (msg->msgId == AJ_METHOD_ACCEPT_SESSION) { // Process all incoming request to join a session and pass request for acceptance by all services uint16_t port; char* joiner; uint32_t sessionId = 0; AJ_UnmarshalArgs(msg, "qus", &port, &sessionId, &joiner); uint8_t session_accepted = FALSE; session_accepted |= AJServices_CheckSessionAccepted(port, sessionId, joiner); *status = AJ_BusReplyAcceptSession(msg, session_accepted); AJ_AlwaysPrintf(("%s session session_id=%u joiner=%s for port %u\n", (session_accepted ? "Accepted" : "Rejected"), sessionId, joiner, port)); serviceStatus = AJSVC_SERVICE_STATUS_HANDLED; } else if (msg->msgId == AJ_REPLY_ID(AJ_METHOD_JOIN_SESSION)) { // Process all incoming replies to join a session and pass session state change to all services uint32_t replyCode = 0; uint32_t sessionId = 0; uint8_t sessionJoined = FALSE; uint32_t joinSessionReplySerialNum = msg->replySerial; if (msg->hdr->msgType == AJ_MSG_ERROR) { AJ_AlwaysPrintf(("JoinSessionReply: AJ_METHOD_JOIN_SESSION: AJ_ERR_FAILURE\n")); *status = AJ_ERR_FAILURE; } else { *status = AJ_UnmarshalArgs(msg, "uu", &replyCode, &sessionId); if (*status != AJ_OK) { AJ_AlwaysPrintf(("JoinSessionReply: failed to unmarshal\n")); } else { if (replyCode == AJ_JOINSESSION_REPLY_SUCCESS) { AJ_AlwaysPrintf(("JoinSessionReply: AJ_JOINSESSION_REPLY_SUCCESS with sessionId=%u and replySerial=%u\n", sessionId, joinSessionReplySerialNum)); sessionJoined = TRUE; } else { AJ_AlwaysPrintf(("JoinSessionReply: AJ_ERR_FAILURE\n")); *status = AJ_ERR_FAILURE; } } } if (sessionJoined) { serviceStatus = AJServices_SessionJoinedHandler(busAttachment, sessionId, joinSessionReplySerialNum); } else { serviceStatus = AJServices_SessionRejectedHandler(busAttachment, sessionId, joinSessionReplySerialNum, replyCode); } if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) { AJ_ResetArgs(msg); } } else if (msg->msgId == AJ_SIGNAL_SESSION_LOST || msg->msgId == AJ_SIGNAL_SESSION_LOST_WITH_REASON) { // Process all incoming LeaveSession replies and lost session signals and pass session state change to all services uint32_t sessionId = 0; uint32_t reason = 0; if (msg->msgId == AJ_SIGNAL_SESSION_LOST_WITH_REASON) { *status = AJ_UnmarshalArgs(msg, "uu", &sessionId, &reason); } else { *status = AJ_UnmarshalArgs(msg, "u", &sessionId); } if (*status != AJ_OK) { AJ_AlwaysPrintf(("JoinSessionReply: failed to marshal\n")); } else { AJ_AlwaysPrintf(("Session lost: sessionId = %u, reason = %u\n", sessionId, reason)); serviceStatus = AJServices_SessionLostHandler(busAttachment, sessionId, reason); if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) { AJ_ResetArgs(msg); } } } else { if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) { serviceStatus = AJApp_MessageProcessor(busAttachment, msg, status); } if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) { serviceStatus = AJ_About_MessageProcessor(busAttachment, msg, status); } #ifdef CONFIG_SERVICE if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) { serviceStatus = AJCFG_MessageProcessor(busAttachment, msg, status); } #endif #ifdef ONBOARDING_SERVICE if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) { serviceStatus = AJOBS_MessageProcessor(busAttachment, msg, status); } #endif #ifdef NOTIFICATION_SERVICE_PRODUCER if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) { serviceStatus = AJNS_Producer_MessageProcessor(busAttachment, msg, status); } #endif #ifdef NOTIFICATION_SERVICE_CONSUMER if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) { serviceStatus = AJNS_Consumer_MessageProcessor(busAttachment, msg, status); } #endif #ifdef CONTROLPANEL_SERVICE if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) { serviceStatus = AJCPS_MessageProcessor(busAttachment, msg, status); } #endif } return serviceStatus; }