예제 #1
0
// _LoadSettings
status_t
NetFSServer::_LoadSettings()
{
	// get the settings file path
	BPath filePath;
	status_t error = _GetSettingsFilePath(&filePath, false);
	if (error != B_OK)
		RETURN_ERROR(error);

	// if existing load the settings
	BEntry bEntry;
	if (FDManager::SetEntry(&bEntry, filePath.Path()) == B_OK
		&& bEntry.Exists()) {
		return B_ENTRY_NOT_FOUND;
	}

	// open the settings file
	BFile file;
	error = FDManager::SetFile(&file, filePath.Path(), B_READ_ONLY);
	if (error != B_OK)
		RETURN_ERROR(error);

	// read the settings
	BMessage settings;
	error = settings.Unflatten(&file);
	if (error != B_OK)
		RETURN_ERROR(error);

	// get the security context archive
	BMessage securityContextArchive;
	error = settings.FindMessage("security context",
		&securityContextArchive);
	if (error != B_OK)
		RETURN_ERROR(error);

	// create a security context
	SecurityContext* securityContext
		= new(std::nothrow) SecurityContext(&securityContextArchive);
	if (!securityContext)
		RETURN_ERROR(B_NO_MEMORY);
	ObjectDeleter<SecurityContext> securityContextDeleter(securityContext);
	error = securityContext->InitCheck();
	if (error != B_OK) {
		delete securityContext;
		RETURN_ERROR(error);
	}

	// set it
	delete fSecurityContext;
	fSecurityContext = securityContext;
	securityContextDeleter.Detach();

	return B_OK;
}
예제 #2
0
// Mount
status_t
ClientVolume::Mount(UserSecurityContext* securityContext, Share* share)
{
	if (!securityContext || !share)
		return B_BAD_VALUE;
	ObjectDeleter<UserSecurityContext> securityContextDeleter(securityContext);
	if (IsMounted())
		return B_BAD_VALUE;
	fSecurityContext = securityContext;
	securityContextDeleter.Detach();

	fShare = share;
	fShare->AcquireReference();
	dev_t volumeID = share->GetVolumeID();
	ino_t nodeID = share->GetNodeID();

	// into root node ref
	fRootNodeRef.device = volumeID;
	fRootNodeRef.node = nodeID;

	// get the share permissions
	fSharePermissions = securityContext->GetNodePermissions(volumeID, nodeID);

	// get the root directory
	VolumeManager* volumeManager = VolumeManager::GetDefault();
	Directory* rootDir;
	status_t error = volumeManager->LoadDirectory(volumeID, nodeID, &rootDir);
	if (error != B_OK)
		return error;

	// register with the volume manager
	error = volumeManager->AddClientVolume(this);
	if (error != B_OK) {
		Unmount();
		return error;
	}
	fMounted = true;

	// notify the statistics manager
	StatisticsManager::GetDefault()->ShareMounted(fShare,
		fSecurityContext->GetUser());

	return B_OK;
}
예제 #3
0
// _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(&parameter);) {
		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(&parameter);) {
		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;
}