Этот раздел является обсуждением того, как клиент и сервер Subversion взаимодействуют друг с другом, вне зависимости от используемого вами сетевого решения. После прочтения вы будете понимать, как работает сервер, а также знать различные способы конфигурации клиента.
Основная часть работы клиента Subversion относится к управлению рабочими копиями. Однако, когда возникает необходимость получить информацию из хранилища, он посылает запрос серверу, а сервер посылает соответствующий ответ. Подробности сетевого протокола невидимы пользователю; клиент пытается установить связь с URL, и, в зависимости от схемы URL, использует соответствующий протокол связи с сервером (смотрите URL хранилища). Пользователи могут использовать команду svn --version для получения информации о том, с какими схемами URL и протоколами клиент умеет работать.
Когда сервер получает запрос от клиента, он требует, чтобы клиент идентифицировал себя. Он отсылает запрос об установлении личности клиента, на что клиент реагирует предоставлением идентификационной информации серверу. После окончания процедуры установления личности сервер отсылает клиенту информацию, которую тот запрашивал. Заметьте, что эта система отличается от таких, как в CVS, где клиент вначале отсылает идентификационную информацию, а потом уже посылает запрос. В Subversion сервер сам получает идентификационную информацию, запрашивая её у клиента тогда, когда ему нужно. Такой способ делает определенные операции более изящными. К примеру, в случае, когда конфигурация сервера открывает доступ для чтения всем без ограничений, и клиент выполняет команду svn checkout, сервер не будет запрашивать идентификационную информацию для установления личности.
Когда клиентский запрос пишет в хранилище новые данные
(например svn commit), создается новое
дерево правок. Если клиентский запрос успешно прошел процедуру
установления личности, имя пользователя сохраняется как значение
свойства svn:author
новой правки (смотрите
«Unversioned Properties»). Если клиент
не был опознан (другими словами, сервер ни разу не послал
запрос об установлении личности), то свойство
svn:author
остается пустым.
[39]
Многие серверы сконфигурированы таким образом, что они требуют установить личность при каждом запросе. Это может сильно раздражать пользователей, требуя от них ввода пароля еще и еще раз.
К счастью, клиент Subversion спасает пользователя от этого:
он имеет встроенную систему кэширования идентификационной
информации на диск. По умолчанию, каждый раз, когда клиент
успешно проходит процедуру установления личности
на сервере, он сохраняет идентификационную информацию в области
конфигурации — в ~/.subversion/auth/
на UNIX-системах и в
%APPDATA%/Subversion/auth/
в Windows.
(Подробно про область конфигурации смотрите
«Параметры времени выполнения»). При успешном
определении личности идентификационная информация сохраняется на
диск с ключом, состоящим из имени хоста, порта и области
установления личности.
Когда клиент получает запрос об установлении личности, он в первую очередь ищет соответствующую идентификационную информацию в дисковом кеше пользователя; если ее нет в кеше или она не проходит процедуру опознания, клиент просит пользователя ввести необходимую информацию.
Люди, помешанные на безопасности, могут подумать: « Сохранять пароли на диск? Это ужасно! Вы никогда не должны так делать.» Пожалуйста, успокойтесь, это не так опасно, как кажется.
Каталог auth/
защищен системой прав
доступа, которая позволяет чтение данных из каталога только
его владельцу, и больше никому в мире. Права доступа на уровне
операционной системы защищены паролем.
На операционных системах Windows 2000 и старше Subversion использует стандартные средства шифрования Windows при сохранении пароля на диск. Поскольку ключ шифрования управляется Windows и привязывается к учетной записи пользователя, то только владелец учетной записи может расшифровать сохраненный пароль. (Обратите внимание: если администратор сменит пароль для учетной записи пользователя все сохраненные на диск пароли станут недействительными. Клиент Subversion будет вести себя так, словно их не существует, запрашивая пароль, когда он потребуется.)
Для тех параноиков, которые готовы жертвовать всеми удобствами, предусмотрена возможность отключения механизма кеширования.
Чтобы отключить кеширование для текущей команды, используйте
ключ --no-auth-cache
.
$ svn commit -F log_msg.txt --no-auth-cache Authentication realm: <svn://host.example.com:3690> example realm Username: joe Password for 'joe': Adding newfile Transmitting file data . Committed revision 2324. # password was not cached, so a second commit still prompts us $ svn delete newfile $ svn commit -F new_msg.txt Authentication realm: <svn://host.example.com:3690> example realm Username: joe …
Однако, если вы хотите навсегда отключить механизм
кеширования идентификационной информации, вам надо
отредактировать файл config
(находится в
каталоге auth/
). Просто установите параметр
store-auth-creds
в no
. Всё!
Кешироание идентификационной информации на диск отключено!
[auth] store-auth-creds = no
Иногда требуется удалить идентификационную информацию из
кеша. Для этого необходимо вручную удалить соответствующий файл
из каталога auth/
. Идентификационная
информация хранится в отдельных файлах; если вы просмотрите эти
файлы, вы увидите список ключей и их значений. Ключ
svn:realmstring
описывает конкретную realm
сервера, с которой связан данный файл.
$ ls ~/.subversion/auth/svn.simple/ 5671adf2865e267db74f09ba6f872c28 3893ed123b39500bca8a0b382839198e 5c3c22968347b390f349ff340196ed39 $ cat ~/.subversion/auth/svn.simple/5671adf2865e267db74f09ba6f872c28 K 8 username V 3 joe K 8 password V 4 blah K 15 svn:realmstring V 45 <https://svn.domain.com:443> Joe's repository END
Вы нашли требуемый файл? Теперь просто удалите его.
И последнее о некоторых особенностях идентификации клиента,
а именно небольшое разъяснение ключей --username
и --password
. Многие подкоманды клиента
используют эти ключи, однако следует понимать, что использование
этих ключей не подразумевает автоматическую
отсылку идентификационной информации на сервер. Как объяснялось
раньше, сервер получает идентификационную информацию от клиента
только тогда, когда считает, что это необходимо; клиент не может
передать её серверу по своей инициативе. Когда имя пользователя
и пароль передаются в ключах, они будут отосланы серверу
только в том случае, если сервер запросит
их.
[40]
Обычно эти ключи используются в следующих случаях:
пользователь не хочет использовать текущую учетную запись, или
скрипт хочет пройти опознание личности, не используя сохранённые идентификационные данные.
Вот итоговое описание, как клиент Subversion ведет себя когда он получает запрос на авторизацию:
Проверяет указал ли пользователь любую авторизационную
информацию как параметры командной строки, через
--username
и/или --password
.
Если нет или если эти параметры не прошли авторизацию, тогда
Просматривает область сервера в разделе
auth/
на предмет были ли закешированы данные пользователя. Если
нет, или если закешированные данные пользователя не прошли
авторизацию, тогда
Обращается с запросом к пользователю.
Если клиент успешно идентифицирован через любой из методов, перечисленных выше, он будет пытаться закешировать данные пользователя на диск (за исключением случав, когда пользователь запретил это поведение, как описывалось ранее).
[39] Эта проблема описана в FAQ, она является результатом плохой конфигурации сервера.
[40] И опять-таки, частой ошибкой является
неправильная конфигурация сервера, при которой сервер никогда
не посылает запрос об установлении личности. Когда
пользователи используют ключи --username
и --password
, они могут быть неприятно
удивлены, увидев, что ключи не используются, что новые правки
зафиксированы анонимными пользователями.