architect/_archive/2025-11-cleanup/library/drupal/cmlexchange-patched/README_PATCH.md

CML Exchange Module - Патч для Basic Auth

Версия модуля: 1.20.0
Дата патча: 2025-11-14
Автор: Claude Code
Проект: pim-drupal


🎯 Проблема

Модуль CML Exchange не работает с Basic Authentication когда Drupal находится за reverse proxy (Nginx → Apache → PHP).

Причина:
Модуль ожидает переменные $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'], но при работе через Nginx/Apache эти переменные не устанавливаются. Вместо этого доступна только $_SERVER['HTTP_AUTHORIZATION'] с закодированными credentials.


✅ Решение

Модифицирован метод baseAuthUser() в файле src/Service/CheckAuth.php для поддержки парсинга заголовка HTTP_AUTHORIZATION.

Исправленный код

Файл: src/Service/CheckAuth.php

Метод: baseAuthUser()

private function baseAuthUser() {
  $user = FALSE;

  // Парсинг HTTP_AUTHORIZATION заголовка
  if (isset($_SERVER['HTTP_AUTHORIZATION'])) {
    $auth = [];
    if (preg_match('/Basic\s+(.*)$/i', $_SERVER['HTTP_AUTHORIZATION'], $auth)) {
      [$auth_name, $auth_pass] = explode(':', base64_decode($auth[1]));
      $user = [
        'name' => $auth_name,
        'pass' => $auth_pass,
      ];
    }
  }

  return $user;
}

📦 Установка патча

Вариант 1: Применить вручную

  1. Откройте файл модуля:
nano web/modules/contrib/cmlexchange/src/Service/CheckAuth.php
  1. Найдите метод baseAuthUser() (примерно строка 50-60)

  2. Замените весь метод на код выше

  3. Очистите кэш:

drush cr

Вариант 2: Использовать готовый патченный модуль

  1. Скопируйте содержимое этой директории:
cp -r cmlexchange-patched /path/to/drupal/web/modules/contrib/cmlexchange
  1. Очистите кэш:
drush cr

🔧 Настройка интеграции

1. Конфигурация модуля

drush config:set cmlexchange.settings auth 1 -y
drush config:set cmlexchange.settings auth-user '1c_exchange' -y
drush config:set cmlexchange.settings auth-pass '1C_Exchange_2025_Strong' -y
drush config:set cmlexchange.settings cmlmigrations 1 -y
drush config:set cmlexchange.settings debug 1 -y
drush cr

2. Создание пользователя Drupal

drush user:create 1c_exchange \
  --mail='1c@0kt.ru' \
  --password='1C_Exchange_2025_Strong'

drush user:role:add administrator 1c_exchange

3. Настройка Nginx (если используется)

Добавьте в конфигурацию Nginx:

location / {
    proxy_pass http://backend;
    proxy_set_header Authorization $http_authorization;
    proxy_pass_header Authorization;
}

Перезагрузите Nginx:

sudo nginx -t
sudo systemctl reload nginx

🧪 Тестирование

Тест 1: CheckAuth

curl -u "1c_exchange:1C_Exchange_2025_Strong" \
  "https://your-domain.com/cmlexchange?type=catalog&mode=checkauth"

Ожидаемый ответ:

success
catalog
<UUID>

Тест 2: Список сессий

curl -u "1c_exchange:1C_Exchange_2025_Strong" \
  "https://your-domain.com/cmlexchange?type=catalog&mode=init"

Ожидаемый ответ:

zip=no
file_limit=95000000
sessid=<SESSION_ID>
version=3.1

📋 Полная конфигурация CML Exchange

Сохранённая конфигурация находится в файле cmlexchange_config.yaml:

auth: 1                                    # Аутентификация включена
debug: 1                                   # Debug режим
auth-user: 1c_exchange                     # Логин
auth-pass: 1C_Exchange_2025_Strong         # Пароль
auth-ip: ''                                # IP фильтр (пусто = все)
zip: 0                                     # ZIP сжатие отключено
file-path: cml                             # Папка для файлов
file-limit: 95000000                       # Лимит размера файла (95MB)
cmlmigrations: 1                           # Миграции включены

🔗 Интеграция с 1С УНФ 3

Настройки в 1С

Путь:
Главное → Интеграция → Обмен с сайтом

Параметры подключения:

URL (изменения):  https://your-domain.com/cmlexchange
URL (полная):     https://your-domain.com/cmlexchange/full
Логин:            1c_exchange
Пароль:           1C_Exchange_2025_Strong

Процесс обмена

  1. Checkauth - проверка авторизации
  2. Init - инициализация сессии
  3. File - загрузка import.xml
  4. File - загрузка import_files/... (изображения)
  5. Import - импорт данных в Drupal

📁 Структура файлов модуля

cmlexchange-patched/
├── README_PATCH.md                          # Эта документация
├── cmlexchange_config.yaml                  # Конфигурация
├── src/
│   └── Service/
│       └── CheckAuth.php                    # ✅ ИСПРАВЛЕН
├── cmlexchange.info.yml
├── cmlexchange.routing.yml
└── ...

🔄 Обновление модуля

ВНИМАНИЕ: При обновлении модуля через Composer патч будет перезаписан!

Как сохранить патч при обновлении:

  1. Создайте патч-файл:
cd web/modules/contrib/cmlexchange
git diff > /path/to/library/drupal/cmlexchange-http-auth.patch
  1. После обновления применяйте патч:
cd web/modules/contrib/cmlexchange
patch -p1 < /path/to/library/drupal/cmlexchange-http-auth.patch

Или: Используйте Composer Patches:

composer.json:

{
  "extra": {
    "patches": {
      "drupal/cmlexchange": {
        "Fix HTTP_AUTHORIZATION parsing": "patches/cmlexchange-http-auth.patch"
      }
    }
  }
}

🆘 Troubleshooting

Ошибка: "auth error"

Причина: Basic Auth не доходит до модуля

Решение:
1. Проверьте Nginx конфигурацию (proxy_set_header Authorization)
2. Проверьте что патч применён (см. код метода baseAuthUser)
3. Проверьте логи: drush watchdog:show

Ошибка: "No session id"

Причина: Папка для файлов недоступна

Решение:

chmod 777 web/sites/default/files/cml
chown www-data:www-data web/sites/default/files/cml

Ошибка при импорте

Причина: Модуль cmlmigrations не настроен

Решение:

drush en cmlmigrations -y
drush cmlmigrations:rebuild
drush cr

📊 История изменений

Дата Версия Описание
2025-11-14 1.0 Первая версия патча для HTTP_AUTHORIZATION

📞 Поддержка

Проект: pim-drupal
Workspace: /opt/claude-workspace
Документация: projects/pim-drupal/management/


Создано: 2025-11-15
Автор: Claude Code