From 82d0b202c1bff1b2d7f21524a62306d2719cf65e Mon Sep 17 00:00:00 2001 From: John Mulligan Date: Mon, 6 May 2024 16:35:31 -0400 Subject: [PATCH] mgr/smb: include login_control content when generating share config The login_control list (modified by restrict_access) defines the smb.conf params 'read list', 'write list', 'admin users', 'invalid users', and 'valid users'. Signed-off-by: John Mulligan --- src/pybind/mgr/smb/handler.py | 40 +++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/pybind/mgr/smb/handler.py b/src/pybind/mgr/smb/handler.py index 4807f624ae5fe..cc799517ba610 100644 --- a/src/pybind/mgr/smb/handler.py +++ b/src/pybind/mgr/smb/handler.py @@ -25,6 +25,8 @@ from .enums import ( CephFSStorageProvider, Intent, JoinSourceType, + LoginAccess, + LoginCategory, State, UserGroupSourceType, ) @@ -992,6 +994,8 @@ def _generate_share( 'x:ceph:id': f'{share.cluster_id}.{share.share_id}', } } + # extend share with user+group login access lists + _generate_share_login_control(share, cfg) # extend share with custom options custom_opts = share.cleaned_custom_smb_share_options if custom_opts: @@ -1000,6 +1004,42 @@ def _generate_share( return cfg +def _generate_share_login_control( + share: resources.Share, cfg: Simplified +) -> None: + valid_users: List[str] = [] + invalid_users: List[str] = [] + read_list: List[str] = [] + write_list: List[str] = [] + admin_users: List[str] = [] + for entry in share.login_control or []: + if entry.category == LoginCategory.GROUP: + name = f'@{entry.name}' + else: + name = entry.name + if entry.access == LoginAccess.NONE: + invalid_users.append(name) + continue + elif entry.access == LoginAccess.ADMIN: + admin_users.append(name) + elif entry.access == LoginAccess.READ_ONLY: + read_list.append(name) + elif entry.access == LoginAccess.READ_WRITE: + write_list.append(name) + if share.restrict_access: + valid_users.append(name) + if valid_users: + cfg['options']['valid users'] = ' '.join(valid_users) + if invalid_users: + cfg['options']['invalid users'] = ' '.join(invalid_users) + if read_list: + cfg['options']['read list'] = ' '.join(read_list) + if write_list: + cfg['options']['write list'] = ' '.join(write_list) + if admin_users: + cfg['options']['admin users'] = ' '.join(admin_users) + + def _generate_config( cluster: resources.Cluster, shares: Iterable[resources.Share], -- 2.39.5