//-------------------------------------------------------------------------------------------------- static le_result_t GetAppUid ( le_cfg_IteratorRef_t i, ///< [in] Configuration tree iterator. uid_t* uidPtr ///< [out] Pointer to where the user ID will be put if successful. ) //-------------------------------------------------------------------------------------------------- { le_result_t result; char appName[LIMIT_MAX_APP_NAME_BYTES]; result = le_cfg_GetNodeName(i, "", appName, sizeof(appName)); if (result != LE_OK) { LE_CRIT("Configuration node name too long under 'system/apps/'."); return LE_OVERFLOW; } // If this is an "unsandboxed" app, use the root user ID. if (le_cfg_GetBool(i, "sandboxed", true) == false) { char path[256]; le_cfg_GetPath(i, "", path, sizeof(path)); LE_DEBUG("'%s' = <root>", path); *uidPtr = 0; return LE_OK; } // Convert the app name into a user name by prefixing it with "app". char userName[LIMIT_MAX_USER_NAME_BYTES] = "app"; result = le_utf8_Append(userName, appName, sizeof(userName), NULL); if (result != LE_OK) { LE_CRIT("Failed to convert app name into user name."); return LE_OVERFLOW; } // Convert the app user name into a user ID. result = user_GetUid(userName, uidPtr); if (result != LE_OK) { LE_CRIT("Failed to get user ID for user '%s'. (%s)", userName, LE_RESULT_TXT(result)); return LE_NOT_FOUND; } return LE_OK; }
//-------------------------------------------------------------------------------------------------- LE_SHARED appCfg_Iter_t appCfg_CreateAppProcIter ( appCfg_Iter_t appIterRef ///< [IN] Apps iterator ) { CheckFor(appIterRef, ITER_TYPE_APP); char pathStr[LE_CFG_STR_LEN_BYTES] = ""; le_cfg_GetPath(appIterRef->cfgIter, "", pathStr, sizeof(pathStr)); AppsIter_t* iterPtr = le_mem_ForceAlloc(AppIterPool); iterPtr->type = ITER_TYPE_PROC; iterPtr->cfgIter = le_cfg_CreateReadTxn(pathStr); le_cfg_GoToNode(iterPtr->cfgIter, CFG_PROCS_LIST); iterPtr->atFirst = true; return iterPtr; }
//-------------------------------------------------------------------------------------------------- static void SendBindRequest ( uid_t uid, ///< [in] Unix user ID of the client whose binding is being created. le_cfg_IteratorRef_t i ///< [in] Configuration read iterator. ) //-------------------------------------------------------------------------------------------------- { le_result_t result; le_msg_MessageRef_t msgRef = le_msg_CreateMsg(SessionRef); le_sdtp_Msg_t* msgPtr = le_msg_GetPayloadPtr(msgRef); msgPtr->msgType = LE_SDTP_MSGID_BIND; msgPtr->client = uid; // Fetch the client's service name. result = le_cfg_GetNodeName(i, "", msgPtr->clientServiceName, sizeof(msgPtr->clientServiceName)); if (result != LE_OK) { char path[LIMIT_MAX_PATH_BYTES]; le_cfg_GetPath(i, "", path, sizeof(path)); LE_CRIT("Configured client service name too long (@ %s)", path); return; } // Fetch the server's user ID. result = GetServerUid(i, &msgPtr->server); if (result != LE_OK) { return; } // Fetch the server's service name. result = le_cfg_GetString(i, "interface", msgPtr->serverServiceName, sizeof(msgPtr->serverServiceName), ""); if (result != LE_OK) { char path[LIMIT_MAX_PATH_BYTES]; le_cfg_GetPath(i, "interface", path, sizeof(path)); LE_CRIT("Server interface name too big (@ %s)", path); return; } if (msgPtr->serverServiceName[0] == '\0') { char path[LIMIT_MAX_PATH_BYTES]; le_cfg_GetPath(i, "interface", path, sizeof(path)); LE_CRIT("Server interface name missing (@ %s)", path); return; } msgRef = le_msg_RequestSyncResponse(msgRef); if (msgRef == NULL) { ExitWithErrorMsg("Communication with Service Directory failed."); } le_msg_ReleaseMsg(msgRef); }
//-------------------------------------------------------------------------------------------------- static le_result_t GetServerUid ( le_cfg_IteratorRef_t i, ///< [in] Config tree iterator positioned at binding config. uid_t* uidPtr ///< [out] The application's user ID. ) //-------------------------------------------------------------------------------------------------- { le_result_t result; char userName[LIMIT_MAX_USER_NAME_BYTES]; // If an app name is present in the binding config, if (le_cfg_NodeExists(i, "app")) { // Make sure there isn't also a user name. if (le_cfg_NodeExists(i, "user")) { char path[LIMIT_MAX_PATH_BYTES]; le_cfg_GetPath(i, "", path, sizeof(path)); LE_CRIT("Both server user and app nodes appear under binding (@ %s)", path); return LE_DUPLICATE; } // Get the app name. char appName[LIMIT_MAX_APP_NAME_BYTES]; result = le_cfg_GetString(i, "app", appName, sizeof(appName), ""); if (result != LE_OK) { char path[LIMIT_MAX_PATH_BYTES]; le_cfg_GetPath(i, "app", path, sizeof(path)); LE_CRIT("Server app name too big (@ %s)", path); return result; } if (appName[0] == '\0') { char path[LIMIT_MAX_PATH_BYTES]; le_cfg_GetPath(i, "app", path, sizeof(path)); LE_CRIT("Server app name empty (@ %s)", path); return LE_NOT_FOUND; } // Find out if the server app is sandboxed. If not, it runs as root. char path[LIMIT_MAX_PATH_BYTES]; if (snprintf(path, sizeof(path), "/apps/%s/sandboxed", appName) >= sizeof(path)) { LE_CRIT("Config node path too long (app name '%s').", appName); return LE_OVERFLOW; } if (!le_cfg_GetBool(i, path, true)) { *uidPtr = 0; return LE_OK; } // It is not sandboxed. Convert the app name into a user name. result = user_AppNameToUserName(appName, userName, sizeof(userName)); if (result != LE_OK) { LE_CRIT("Failed to convert app name '%s' into a user name.", appName); return result; } } // If a server app name is not present in the binding config, else { // Get the server user name instead. result = le_cfg_GetString(i, "user", userName, sizeof(userName), ""); if (result != LE_OK) { char path[LIMIT_MAX_PATH_BYTES]; le_cfg_GetPath(i, "user", path, sizeof(path)); LE_CRIT("Server user name too big (@ %s)", path); return result; } if (userName[0] == '\0') { char path[LIMIT_MAX_PATH_BYTES]; le_cfg_GetPath(i, "", path, sizeof(path)); LE_CRIT("Server user name or app name missing (@ %s)", path); return LE_NOT_FOUND; } } // Convert the server's user name into a user ID. result = user_GetUid(userName, uidPtr); if (result != LE_OK) { // Note: This can happen if the server application isn't installed yet. // When the server application is installed, sdir load will be run // again and the bindings will be correctly set up at that time. if (strncmp(userName, "app", 3) == 0) { LE_DEBUG("Couldn't get UID for application '%s'. Perhaps it is not installed yet?", userName + 3); } else { char path[LIMIT_MAX_PATH_BYTES]; le_cfg_GetPath(i, "", path, sizeof(path)); LE_CRIT("Couldn't convert server user name '%s' to UID (%s @ %s)", userName, LE_RESULT_TXT(result), path); } return result; } return LE_OK; }
static void StringSizeTest() { le_result_t result; static char pathBuffer[STR_SIZE] = { 0 }; static char parentPathBuffer[STR_SIZE] = { 0 }; static char smallPathBuffer[SMALL_STR_SIZE + 1] = { 0 }; static char smallParentPathBuffer[SMALL_STR_SIZE + 1] = { 0 }; snprintf(pathBuffer, STR_SIZE, "%s/stringSizeTest/strVal", TestRootDir); snprintf(parentPathBuffer, STR_SIZE, "%s/stringSizeTest/", TestRootDir); strncpy(smallPathBuffer, pathBuffer, SMALL_STR_SIZE); strncpy(smallParentPathBuffer, parentPathBuffer, SMALL_STR_SIZE); le_cfg_QuickSetString(pathBuffer, "This is a bigger string than may be usual for this test."); static char buffer[STR_SIZE]; le_cfg_IteratorRef_t iterRef = le_cfg_CreateReadTxn(pathBuffer); result = le_cfg_GetPath(iterRef, "", buffer, SMALL_STR_SIZE); LE_FATAL_IF(result != LE_OVERFLOW, "Test: %s - The buffer should have been too small.", TestRootDir); LE_FATAL_IF(strcmp(buffer, smallPathBuffer) == 0, "Test: %s - Unexpected value returned, %s", TestRootDir, buffer); result = le_cfg_GetString(iterRef, "", buffer, SMALL_STR_SIZE, ""); LE_FATAL_IF(result != LE_OVERFLOW, "Test: %s - The buffer should have been too small.", TestRootDir); LE_FATAL_IF(strcmp(buffer, "This ") == 0, "Test: %s - Unexpected value returned, %s", TestRootDir, buffer); result = le_cfg_GetPath(iterRef, "", buffer, STR_SIZE); LE_FATAL_IF(result != LE_OK, "Test: %s - The buffer should have been big enough.", TestRootDir); LE_FATAL_IF(strcmp(buffer, pathBuffer) != 0, "Test: %s - Unexpected value returned, %s", TestRootDir, buffer); result = le_cfg_GetString(iterRef, "", buffer, STR_SIZE, ""); LE_FATAL_IF(result != LE_OK, "Test: %s - The buffer should have been big enough.", TestRootDir); LE_FATAL_IF(strcmp(buffer, "This is a bigger string than may be usual for this test.") != 0, "Test: %s - Unexpected value returned, %s", TestRootDir, buffer); le_cfg_CancelTxn(iterRef); result = le_cfg_QuickGetString(pathBuffer, buffer, SMALL_STR_SIZE, ""); LE_FATAL_IF(result != LE_OVERFLOW, "Test: %s - The buffer should have been too small.", TestRootDir); LE_FATAL_IF(strcmp(buffer, "This ") == 0, "Test: %s - Unexpected value returned, %s", TestRootDir, buffer); result = le_cfg_QuickGetString(pathBuffer, buffer, STR_SIZE, ""); LE_FATAL_IF(result != LE_OK, "Test: %s - The buffer should have been big enough.", TestRootDir); LE_FATAL_IF(strcmp(buffer, "This is a bigger string than may be usual for this test.") != 0, "Test: %s - Unexpected value returned, %s", TestRootDir, buffer); }