// GetShares status_t SecurityContext::GetShares(BMessage* shares) { if (!shares) return B_BAD_VALUE; ContextLocker _(this); // iterate through all shares and add their names to the message for (ShareMap::Iterator it = fShares->GetIterator(); it.HasNext();) { Share* share = it.Next().value; // add name status_t error = shares->AddString("shares", share->GetName()); if (error != B_OK) return error; // add path error = shares->AddString("paths", share->GetPath()); if (error != B_OK) return error; } return B_OK; }
// _LoadSecurityContext status_t NetFSServer::_LoadSecurityContext(SecurityContext** _securityContext) { // create a security context SecurityContext* securityContext = new(std::nothrow) SecurityContext; if (!securityContext) return B_NO_MEMORY; status_t error = securityContext->InitCheck(); if (error != B_OK) { delete securityContext; return error; } ObjectDeleter<SecurityContext> securityContextDeleter(securityContext); // load from driver settings for the time being DriverSettings settings; error = settings.Load("netfs-server"); if (error != B_OK) return error; // load users DriverParameter parameter; for (DriverParameterIterator it = settings.GetParameterIterator("user"); it.GetNext(¶meter);) { const char* userName = parameter.ValueAt(0); const char* password = parameter.GetParameterValue("password"); if (!userName) { WARN("Skipping nameless user settings entry.\n"); continue; } // PRINT(("user: %s, password: %s\n", parameter.ValueAt(0), // parameter.GetParameterValue("password"))); error = securityContext->AddUser(userName, password); if (error != B_OK) ERROR("ERROR: Failed to add user `%s'\n", userName); } // load shares for (DriverParameterIterator it = settings.GetParameterIterator("share"); it.GetNext(¶meter);) { const char* shareName = parameter.ValueAt(0); const char* path = parameter.GetParameterValue("path"); if (!shareName || !path) { WARN("settings: Skipping invalid share settings entry (no name" " or no path).\n"); continue; } // PRINT(("share: %s, path: %s\n", parameter.ValueAt(0), // parameter.GetParameterValue("path"))); Share* share; error = securityContext->AddShare(shareName, path, &share); if (error != B_OK) { ERROR("ERROR: Failed to add share `%s'\n", shareName); continue; } Reference<Share> shareReference(share, true); DriverParameter userParameter; // iterate through the share users for (DriverParameterIterator userIt = parameter.GetParameterIterator("user"); userIt.GetNext(&userParameter);) { const char* userName = userParameter.ValueAt(0); // PRINT((" user: %s\n", userName)); User* user = securityContext->FindUser(userName); if (!user) { ERROR("ERROR: Undefined user `%s'.\n", userName); continue; } Reference<User> userReference(user, true); DriverParameter permissionsParameter; if (!userParameter.FindParameter("permissions", &permissionsParameter)) { continue; } Permissions permissions; for (int32 i = 0; i < permissionsParameter.CountValues(); i++) { const char* permission = permissionsParameter.ValueAt(i); // PRINT((" permission: %s\n", permission)); if (strcmp(permission, "mount") == 0) { permissions.AddPermissions(MOUNT_SHARE_PERMISSION); } else if (strcmp(permission, "query") == 0) { permissions.AddPermissions(QUERY_SHARE_PERMISSION); } else if (strcmp(permission, "read") == 0) { permissions.AddPermissions(READ_PERMISSION | READ_DIR_PERMISSION | RESOLVE_DIR_ENTRY_PERMISSION); } else if (strcmp(permission, "write") == 0) { permissions.AddPermissions(WRITE_PERMISSION | WRITE_DIR_PERMISSION); } else if (strcmp(permission, "all") == 0) { permissions.AddPermissions(ALL_PERMISSIONS); } } error = securityContext->SetNodePermissions(share->GetPath(), user, permissions); if (error != B_OK) { ERROR("ERROR: Failed to set permissions for share `%s'\n", share->GetName()); } } } securityContextDeleter.Detach(); *_securityContext = securityContext; return B_OK; }
// constructor SecurityContext::SecurityContext(BMessage* archive) : BArchivable(archive), fUsers(new(std::nothrow) UserMap), fShares(new(std::nothrow) ShareMap), fPermissions(new(std::nothrow) PermissionMap), fNode2Path(new(std::nothrow) NodePathMap), fPath2Node(new(std::nothrow) PathNodeMap) { if (InitCheck() != B_OK) return; status_t error = B_OK; // users BMessage userArchive; for (int32 i = 0; archive->FindMessage("users", i, &userArchive) == B_OK; i++) { User tmpUser; error = tmpUser.Unarchive(&userArchive); if (error != B_OK) return; error = AddUser(tmpUser.GetName(), tmpUser.GetPassword()); if (error != B_OK) return; } // shares BMessage shareArchive; for (int32 i = 0; archive->FindMessage("shares", i, &shareArchive) == B_OK; i++) { Share tmpShare; error = tmpShare.Unarchive(&shareArchive); if (error != B_OK) return; error = AddShare(tmpShare.GetName(), tmpShare.GetPath()); if (error != B_OK) return; } // permissions BMessage permissionsArchive; if (archive->FindMessage("permissions", &permissionsArchive) != B_OK) return; #ifdef ANTARES_TARGET_PLATFORM_DANO const char* userName; #else char* userName; #endif type_code type; for (int32 userIndex = 0; permissionsArchive.GetInfo(B_MESSAGE_TYPE, userIndex, &userName, &type) == B_OK; userIndex++) { User* user = FindUser(userName); if (!user) return; Reference<User> userReference(user, true); error = permissionsArchive.FindMessage(userName, &userArchive); if (error != B_OK) return; // got a user: iterate through its permissions #ifdef ANTARES_TARGET_PLATFORM_DANO const char* path; #else char* path; #endif for (int32 i = 0; userArchive.GetInfo(B_INT32_TYPE, i, &path, &type) == B_OK; i++) { uint32 permissions; error = userArchive.FindInt32(path, (int32*)&permissions); if (error == B_OK) error = SetNodePermissions(path, user, permissions); } } }