예제 #1
0
// _GetSettingsFilePath
status_t
NetFSServer::_GetSettingsFilePath(BPath* path, bool createDir)
{
	// get settings dir
	BPath dirPath;
	status_t error = _GetSettingsDirPath(&dirPath, createDir);
	if (error != B_OK)
		return error;

	// construct the file path
	return path->SetTo(dirPath.Path(), kSettingsFileName);
}
예제 #2
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 the fallback settings, if present
	BPath path;
	DriverSettings settings;
	
	if (_GetSettingsDirPath(&path, false) == B_OK
			&& path.Append(kFallbackSettingsFileName) == B_OK
			&& settings.Load(path.Path()) == B_OK) {
		// 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;
			}
			BReference<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;
				}
				BReference<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;
}