Bug 53959

Summary: Проблемы при создании общей сетевой папки без гостевого доступа (атрибут self._guest прибит)
Product: Sisyphus Reporter: Vladislav Glinkin <glinkinvd>
Component: gpupdateAssignee: Valery Sinelnikov <greh>
Status: NEW --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: greh, nir, sin
Version: unstable   
Hardware: x86_64   
OS: Linux   

Description Vladislav Glinkin 2025-04-23 15:24:34 MSK
Версия: gpupdate-0.13.2-alt1

Шаги воспроизведения:
1) На управляющей машине включить экспериментальные групповые политики и настроить механизмы GPUpdate для подключения сетевых каталогов
2) На клиентах добавить include = /etc/samba/usershares.conf в секцию global файла /etc/samba/smb.conf
3) На клиентах предварительно создать директорию mkdir /var/cshare && chmod 777 /var/cshare для share
4) На клиентах выполнить # control smb-conf-usershares enabled && control smb-conf-usershare-owner-only disabled
5) На управляющей машине создать сетевую папку cshare для компьютера:
Действие: Создание
Имя шары: cshare
Путь к каталогу: /var/cshare
Комментарий: computer share
Нажать OK
6) Применить групповые политики на клиенте

Всё в соответствии с https://www.altlinux.org/%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8/%D0%9E%D0%B1%D1%89%D0%B8%D0%B5_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B8#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5

Фактический результат:
Сетевая папка не была создана.
2025-04-23 13:16:39.859|[D00182]| Не удалось применить действие с данными общего сетевого ресурса|{'cmd': ['/usr/bin/net', 'usershare', 'add', 'cshare', '/var/cshare', 'computer share', 'Everyone:F', 'guest_ok=y'], 'exc': CalledProcessError(255, ['/usr/bin/net', 'usershare', 'add', 'cshare', '/var/cshare', 'computer share', 'Everyone:F', 'guest_ok=y'])}

Ожидаемый результат:
Сетевая папка создана.

====

net usershare add [--long] <sharename> <path> [<comment>] [<acl>] [<guest_ok=[y|n]>]
        Adds the specified share name for this user.
        <sharename> is the new share name.
        <path> is the path on the filesystem to export.
        <comment> is the optional comment for the new share.
        <acl> is an optional share acl in the format "DOMAIN\name:X,DOMAIN\name:X,...."
        <guest_ok=y> if present sets "guest ok = yes" on this usershare.
                "X" represents a permission and can be any one of the characters f, r or d
                where "f" means full control, "r" means read-only, "d" means deny access.
                name may be a domain user or group. For local users use the local server name instead of "DOMAIN"
                The default acl is "Everyone:r" which allows everyone read-only access.

Обязательными параметрами являются <sharename> и <path>.

В классе Networkshare прибит self._guest = 'guest_ok=y'
class Networkshare:

    def __init__(self, networkshare_obj, username = None):
        self.net_full_cmd = ['/usr/bin/net', 'usershare']
        self.net_cmd_check = ['/usr/bin/net', 'usershare', 'list']
        self.cmd = list()
        self.name = networkshare_obj.name
        self.path = expand_windows_var(networkshare_obj.path, username).replace('\\', '/') if networkshare_obj.path else None

        self.action = action_letter2enum(networkshare_obj.action)
        self.allRegular =  networkshare_obj.allRegular
        self.comment = networkshare_obj.comment
        self.limitUsers = networkshare_obj.limitUsers
        self.abe = networkshare_obj.abe
        self._guest = 'guest_ok=y'
        self.acl = 'Everyone:'
        self.act()

В случаях, когда в конфигурационном файле usershare allow guests = no, возникают ошибки:
2025-04-23 13:16:39.859|[D00182]| Не удалось применить действие с данными общего сетевого ресурса|{'cmd': ['/usr/bin/net', 'usershare', 'add', 'cshare', '/var/cshare', 'computer share', 'Everyone:F', 'guest_ok=y'], 'exc': CalledProcessError(255, ['/usr/bin/net', 'usershare', 'add', 'cshare', '/var/cshare', 'computer share', 'Everyone:F', 'guest_ok=y'])}

Потому что:
# net usershare add "cshare" "/var/cshare" "computer share" "Everyone:F" "guest_ok=y"
net usershare add: guest_ok=y requested but the "usershare allow guests" parameter is not enabled by this server.

Причём, usershare allow guests можно настраивать политикой "Гостевой доступ к общим каталогам" и сломать всё, если запретить его.

Параметр acl тоже прибит со значением Everyone:F, но он не настраивается в /etc/samba/usershares.conf
Было бы славно, для повышение гибкости настройки, настраивать acl с помощью какой-нибудь групповой политики (это скорее улучшение на будущее).

Исправление описанной проблемы с self._guest в https://github.com/altlinux/gpupdate/pull/214