ARMANOS

Команда

Команда, роли и папки

Двое в одном аккаунте и в одном браузере это ровно та картина, за которую аккаунты закрывают. Команда здесь означает отдельные входы, отдельные места, замок «один профиль, одно окно» и запись о том, кто что сделал.
$3
за каждое место сверх тарифа, в месяц
5
ролей: владелец и четыре назначаемые
3 мин
держится замок профиля, продление раз в минуту
7 дней
живёт код приглашения

Рабочее пространство это один владелец, один счёт и один общий запас

Каждая учётная запись принадлежит рабочему пространству. Если вы завели её в одиночку, вы хозяин своего и единственный его участник. Приняв приглашение, ваша запись перестаёт считаться сама по себе и начинает смотреть на пространство владельца.

С этой минуты его тариф становится вашим. Норма профилей, места устройств, библиотека прокси, папки и журнал считаются по владельцу, поэтому команда берёт из одного оплаченного запаса и по одному счёту. Доплатить за себя отдельно участник не может: запас принадлежит пространству, а не человеку.

Место это человек в этом пространстве, и одно из них владелец занимает сам. Тариф с тремя местами означает владельца и двух коллег. Место сверх тарифа стоит $3 в месяц и прибавляется к цене тарифа до скидки за срок: квартал снимает 10%, год снимает 20%.

Число мест лежит в записи о доступе, а не выводится из названия тарифа. Места покупаются поштучно, поэтому программа берёт число, которое прислал сервер. Пока эти двое расходились, человек, заплативший за трёх коллег, видел одно место и не мог позвать никого.

Free
1 место
Professional
1 место
Business
3 места
Enterprise
20 мест

Одно из этих мест занимает владелец. Каждое докупленное место добавляет $3 в месяц к цене тарифа.

Места следуют за оплатой, а не за записанным названием тарифа

Когда оплата кончилась и прошли 3 дня льготы на продление, действующий тариф падает до Free, и в пространстве снова одно место. При этом ничего не удаляется: членство остаётся, живые места держат те, кто вступил раньше всех, и с возвратом оплаты все работают дальше. На машине без связи с сервером программа живёт по последнему известному ответу 24 часа.

Пять ролей, и каждая упирается в настоящую границу

Ролей пять. Владелец достаётся тому, кто завёл пространство, и не назначается никому. Остальные четыре вы раздаёте сами: сразу в приглашении или позже в списке людей.

Роль это ступень, а не список галочек. Каждый ход на сервере объявляет, какая ступень ему нужна, и старшая роль удовлетворяет требованию младшей. Незнакомая роль превращается в нулевую ступень, поэтому опечатка не даёт ничего, вместо того чтобы дать всё.

Одна честная подробность: у оператора и участника сегодня одна и та же ступень. Два названия существуют затем, чтобы список людей читался так, как команда говорит вслух, а не потому что права разные. Что может участник, то может и оператор, и наоборот.

РольЧто открываетГде останавливается
ВладелецВсё в пространстве, включая оплату, команду и журналЕго нельзя исключить, нельзя сменить ему роль и нельзя запереть в папках
АдминистраторОплата и тариф, приглашения и роли, доступ к папкам, весь журнал, чужие устройстваНе трогает владельца и не властен в чужом пространстве
УправляющийОбщее рабочее добро: папки, библиотека прокси и заказы, сценарии, расписания, смена IPНи оплаты, ни команды, ни журнала
ОператорПрофили, которые он завёл или которые ему открыли: создать, править, запустить, остановить, синхронизироватьНе заводит и не правит прокси из библиотеки, папки, сценарии и расписания
УчастникТе же права, что у оператораТе же границы, что у оператора
Экран команды в программе: строки участников с почтой, выбор роли, кнопка папок и кнопка исключения.
Роль и папки меняются в одной строке. Счётчик занятых мест стоит выше.

Папки решают, что видит коллега

Роль действует на всё пространство, поэтому одной ролью нельзя сказать «этот исполнитель работает на одного клиента». Это делают папки. Откройте у участника окно папок, отметьте группы, которые ему открыты, и его список сузится до них.

Правило читается в двух местах, и иначе нельзя. Список профилей отбирается по разрешённым папкам, и открытие профиля по номеру проходит ту же проверку. Без второй ограничение было бы украшением списка: номера ходят по ссылкам, выгрузкам и сценариям. На профиль вне разрешённых папок сервер отвечает «не найдено», а не «нельзя», чтобы по разнице ответов нельзя было выяснить, что есть у соседей.

Профиль, не положенный ни в одну папку, при заданном ограничении не показывается. Иначе запрет обходится тем, что профиль просто не кладут в папку. Строки доступа пишутся на ваше пространство, поэтому ограничение прежнего работодателя не едет за человеком к следующему.

Раздаёт папки только владелец или администратор и только своим людям. Номера папок сверяются с вашими группами до записи, поэтому чужим номером нельзя выдать доступ туда, где вы не хозяин.

Экран групп в программе: список папок профилей и кнопка создания новой.
Папки это обычные группы профилей. Доступ по папкам решает, какие из них видит конкретный участник.

Пустой список означает «видит всё»

Снять последнюю папку это не «закрыть доступ», а «снять ограничение». Окно говорит об этом словами нарочно. Обратное прочтение заперло бы коллегу целиком, пока вы думали, что правите список, и та же умолчательная сторона позволяет уже работающим командам ничего не заметить при появлении этой возможности.

Открыть один профиль лучше, чем раздать один пароль

Общий доступ это то, что заменяет пересылку логинов. Вы отмечаете коллег в окне доступа, сервер пишет по строке на человека, и профиль появляется у них в списке с пометкой «мне открыли».

Запрос задаёт весь набор целиком, а не разницу. Кто не попал в запрос, тот доступ теряет, и именно поэтому снятая галочка действительно закрывает доступ. Получатели обязаны быть в вашем пространстве, а делиться чужим профилем нельзя, и окно говорит это раньше, чем сервер.

Когда вы закрываете доступ, профиль исчезает у коллеги при ближайшей синхронизации. Данные, уже лежащие у него на диске, при этом не стираются нарочно: закрытый доступ часто означает перестановку, а стереть чужую работу без спроса хуже, чем оставить папку на диске.

  • Отпечаток и настройки

    едут вместе с профилем, поэтому коллега открывает ту же личность, а не похожую копию

  • Куки и входы

    едут через синхронизацию профиля, когда она включена, поэтому сессия продолжается, а не начинается заново

  • Пароли прокси из библиотеки

    управляющий берёт их из самой библиотеки, а оператор получает пароль только вместе с профилем, который ему открыли

  • Пометка в списке

    чужой профиль помечен, поэтому «удалить» на нём не значит того, что значит на своём

Один профиль, одно окно, где бы команда ни сидела

Двое, открывшие один профиль разом, дают две живые сессии одного аккаунта из двух мест. Это ровно то поведение, ради защиты от которого продукт и покупают, поэтому полагаться на вежливость тут нельзя. Машины друг друга не видят, значит замок держит сервер.

Замок держится временем, а не обещанием. Машина, выключенная из розетки, перестаёт продлевать, и профиль освобождается сам. А когда сервера нет или он отвечает «такого хода не знаю», программа запускает профиль как обычно: замок защищает от чужого окна, но не является разрешением на вашу работу.

  1. 1

    Запуск берёт замок

    Программа называет свой номер машины и её имя. Запись условная, поэтому два одновременных запуска не могут оба посчитать себя победившими.

  2. 2

    Отказ называет держателя

    Вторая машина получает 409, а в нём имя машины держателя, её номер, время с начала и признак того, ваш ли это второй компьютер.

  3. 3

    Перехват делается осознанно

    Профиль можно забрать, но только у того держателя, которого вам показали. Два перехвата, пришедшие разом, оба пройти не могут.

  4. 4

    Продление раз в минуту

    Пока профиль открыт, программа продлевает замок. Продлевает та же машина, что его взяла, а не любая машина того же человека.

  5. 5

    Три минуты, и он отпускает

    Падение или обрыв питания останавливают продление, и по истечении срока профиль снова свободен. Звонить в поддержку не нужно.

  6. 6

    Проигравший об этом узнаёт

    Если ваш замок перехватили во время работы, ближайшее продление отвечает отказом, окна закрываются, и вы читаете, что именно произошло.

Журнал называет, кто это сделал и чем

Каждое действие, о котором потом спорят, пишет одну строку: кто, что, когда и в каком пространстве. Пространство записывается в саму строку в момент записи. Ровно из-за этой мелочи исключение сотрудника больше не опустошает историю владельца, а нужна она именно в такую минуту.

В строке лежит небольшой блок подробностей. Если запрос пришёл по ключу для программ, туда же пишется номер ключа, и «сделал Иван» читается как «сделал сценарий Ивана»: один утёкший ключ не заставляет отзывать все. Имена сохраняются такими, какими были в тот день, поэтому сегодняшнее переименование профиля не переписывает прошлую неделю.

Читают журнал владелец и администратор. Поверх одних и тех же строк три вида: всё подряд, открытие и закрытие браузера, входы и регистрации устройств с адресом, страной и именем машины.

  • Профили

    создание, правка, удаление, возврат из корзины, запуск, остановка

  • Прокси

    заведение, правка, удаление, проверка, смена адреса и каждая выдача сохранённого пароля

  • Команда

    приглашение, отзыв приглашения, приём, смена роли, смена папок, исключение или уход

  • Устройства и доступ

    регистрация машины, отвязка, вход, закрытие входа после серии промахов, включение и снятие второго шага

  • Деньги и ключи

    смена тарифа, возврат денег, ручная обрезка или выдача доступа, создание и отзыв ключа

Второе чтение поверх тех же строк

Панель подозрительной активности прикладывает к уже накопленному три правила: вход из другой страны, кластер профилей на одном прокси и залп запусков в одну минуту. Она читает 5000 свежих строк за последние 30 дней и считает прокси, вписанный руками, тем же прокси, что и взятый из библиотеки.

Устройства это тоже места, и их можно забрать

Машины это второй вид мест. Тариф даёт их число, считается оно по всему пространству, и держат места самые ранние регистрации. Порядок устойчивый нарочно: иначе на одном ударе пульса машина выпадала бы из мест, а на следующем возвращалась.

Отвязку сервер помнит. Раньше строка просто удалялась, и программа на ближайшем ударе пульса регистрировала ту же машину заново: владелец нажимал «отвязать» и через минуту видел её на месте. Теперь строка помечается отвязанной, место освобождается сразу, а машине на ближайшем пульсе говорят правду вместо тихого возврата.

Свою машину отвязывает каждый. Чужую только администратор или владелец: пока это мог любой участник, он мог запереть владельца в его же продукте. Выход из аккаунта на самой машине это другое действие, там строка удаляется, потому что человек за этой клавиатурой не равен решению издалека.

Отвязанная машина перестаёт работать с профилями

Она не запускает профиль и не продлевает замок, который держала, поэтому ушедшая из команды машина не может держать профиль занятым, просто не отпуская его. Когда место возвращается, запертый экран программы гаснет сразу, а не ждёт следующего пульса через пять минут.

Когда человек уходит, пространство закрывается за ним

Люди уходят. Дорога одна и та же, исключил ли его владелец или он ушёл сам: две дороги к одному событию однажды разойдутся, и одна из них забудет снять доступ.

Всё, что ниже, происходит одной сделкой и ровно в этом порядке.

  1. 1

    Доступ снимается в обе стороны

    Уходит его доступ к вашим профилям и чужой доступ к тем профилям, которые уходят вместе с ним. Доступы к остающимся профилям сохраняются, чтобы увольнение молча не отобрало работу у тех, кто остался.

  2. 2

    Его замок отпускается

    Иначе открытый им профиль три минуты выглядел бы занятым, а потом отвечал бы «не найдено», и со стороны это читается как исчезнувший профиль.

  3. 3

    Рабочие профили переходят владельцу

    Профили, заведённые после вступления, сделаны в вашей норме и остаются пространству. Профили, с которыми человек пришёл, заведённые до вступления, уходят с ним.

  4. 4

    Прокси из библиотеки остаются

    У уходящих профилей стирается ссылка на вашу библиотеку, а слепок внутри профиля стирается, если совпал с вашей библиотекой по адресу, порту и логину. Прокси, купленный человеком на свои деньги, остаётся ему.

  5. 5

    Устройства снимаются

    Строки его машин уходят, и места устройств тут же возвращаются пространству.

  6. 6

    Непринятые приглашения гасятся

    Второй, так и не использованный код на тот же адрес иначе остался бы рабочим ключом обратно.

  7. 7

    Ограничение по папкам снимается

    Иначе ваш запрет уедет с человеком в следующее пространство, где таких папок нет, и запрёт его там целиком.

Строка журнала называет человека, а не код

Об уходе пишется одна строка: адрес почты, ушёл ли человек сам или его исключили, и сколько профилей перешло владельцу. Адрес пишется в саму строку, потому что после удаления членства взять его уже неоткуда. Рядом действует ещё одно правило: владелец, у которого есть свои люди, не может принять приглашение в чужое пространство, иначе норма и места считались бы по двум владельцам разом.

Чего это не делает

  • Роль действует на всё пространство. Нельзя сделать человека администратором в одной папке и оператором в другой: доступ по папкам сужает то, что человек видит, а не то, что ему позволено по роли.
  • Приглашение выписывается на уже существующую учётную запись. Человек сначала регистрируется сам, потом вы приглашаете этот адрес, и код живёт 7 дней или до отзыва. Единого входа компании, SAML и выгрузки из справочника сотрудников нет.
  • Письмо с приглашением дойдёт, только если у сервера настроен почтовый ход. Иначе оно составляется, ложится в очередь с отметкой «не отправлено», и код или ссылку вы передаёте сами. В кабинете живые приглашения читаются с сервера, а программа показывает те, что выписаны на этой машине.
  • Закрытый доступ убирает профиль из программы коллеги, но не стирает куки, уже записанные на его диск. Эти данные нарочно оставляют на месте, поэтому отзыв доступа это не стирание издалека.
  • Журнал пространства листается страницами по двадцать строк, от свежих к старым, без отбора по человеку, виду записи и датам. Такой отбор есть только в служебной панели, а не в вашем виде команды.

Как проверить

За каждым утверждением этой страницы стоит файл, а у большинства ещё и стенд, который падает, пока дефект на месте.

Места считаются при выписке приглашения и второй раз при его приёме, с замком по записи владельца
apps/server/src/team/team.service.ts · apps/server/test/team-money-seats.js
Каждая роль закрывает настоящие ходы: управляющий это библиотека, папки, сценарии и расписания, администратор это оплата, команда и журнал
apps/server/src/common/roles/workspace-roles.ts · apps/server/src/common/roles/roles.guard.ts · apps/server/test/group-access.js
Доступ по папкам судит одинаково в списке и при прямом открытии, а пустой список означает снятое ограничение
apps/server/src/team/team.service.ts · apps/server/src/profiles/profiles.service.ts · apps/server/test/group-access.js · apps/web/test/member-folders.js
Одно окно на профиль: держатель назван, перехват осознанный, замок отпускает сам
apps/server/src/profiles/profiles.service.ts · apps/server/test/profile-lock.js · apps/desktop/test/profile-busy.js
Уход и исключение идут одной дорогой, а строка журнала помнит пространство, которому принадлежала
apps/server/src/team/team.service.ts · apps/server/src/common/audit/audit.service.ts · apps/server/test/audit-filters.js · apps/web/test/уход-из-команды.ts

Настройте команду раньше, чем появится первый общий аккаунт

Места покупаются поштучно, поэтому команда из троих это тариф плюс два места. Роли, папки и журнал идут вместе с любым тарифом, где мест больше одного.