Добавлена поддержка перенаправления POST для OAuth2 (в случае response_mode=form_post
), чтобы разрешить указывать области действия для интеграции с Apple OAuth2.
Примечание 1: Если вы используете поток «Ручной обмен кодом» с Apple (также известный как authWithOAuth2Code()
), вам необходимо либо обновить свой собственный обработчик перенаправления, чтобы принимать запросы POST, либо, если вам не нужен адрес электронной почты пользователя Apple, заменить в URL авторизации Apple response_mode=form_post
обратно на response_mode=query
.
Примечание 2: Существующим пользователям, которые уже вошли в систему с помощью Apple, может потребоваться отозвать доступ, чтобы увидеть параметры обмена электронной почтой, как показано на этом скриншоте. Если вы хотите принудительно использовать новый экран согласия, вы можете зарегистрировать новое приложение Apple OAuth2.
⚠️ Исправлена уязвимость системы безопасности, связанная с автолинком электронной почты OAuth2 (спасибо @dalurness за сообщение об этом).
Также я опубликовал рекомендацию по безопасности GitHub (может потребоваться некоторое время, чтобы она появилась в соответствующих базах данных безопасности).
Чтобы ею воспользоваться, у вас должны быть включены оба метода аутентификации: OAuth2 и пароль.
Возможный сценарий атаки может быть таким:
Теперь мы сбрасываем пароль для этого конкретного случая, если ранее созданный пользователь не был проверен (исключение составляет случай, когда связывание является явным/ручным, то есть когда вы отправляете Authorization:TOKEN
с вызовом аутентификации OAuth2).
Кроме того, чтобы предупредить пользователей, теперь мы отправляем предупреждение по электронной почте, если пользователь вошёл в систему с паролем, но имеет хотя бы одну связанную учётную запись OAuth2. Оно выглядит примерно так:
Здравствуйте!
Просто сообщаем вам, что кто-то вошёл в вашу учётную запись Acme с паролем, в то время как у вас уже подключена GitLab-аутентификация OAuth2. Если вы недавно вошли в систему с паролем, вы можете проигнорировать это письмо. Если вы не распознаёте указанное выше действие, вам следует немедленно изменить пароль вашей учётной записи Acme. Спасибо! Команда Acme_
Поток будет дополнительно улучшен с помощью текущего рефакторинга, и мы начнём отправлять электронные письма при входе с «неизвестного устройства» (OTP и MFA уже реализованы и будут доступны со следующим выпуском v0.23.0 в ближайшее время).
Исправлена несогласованность правил для текстовых литералов внутри скобок (#5017).
Обновлены зависимости Go.
Исправлено неправильное выравнивание макета сетки календаря в Firefox (#4865).
Обновлены зависимости Go и повышена минимальная версия Go в действии выпуска GitHub до Go 1.22.3, поскольку она поставляется с некоторыми незначительными исправлениями безопасности.
Обновлено нормализованное имя загруженного файла, чтобы учитывать двойные расширения (#4824).
В моделях коллекций добавлен кэш для ускорения выполнения общих запросов списка и просмотра примерно на 25%. Это было извлечено из текущей работы над... ### 4355
И есть много других небольших оптимизаций, которые уже были реализованы, но их придётся подождать до завершения рефакторинга.
Исправлено автоматическое подстановочное значение «~» при экранировании символа «%» в параметре (#4704).
Другие незначительные улучшения пользовательского интерфейса (добавлены aria-expanded=true/false
к триггерам раскрывающегося списка, добавлена контрастная рамка вокруг стиля кнопки шаблона почты по умолчанию и т. д.).
Обновлены зависимости Go и увеличена минимальная версия Go в действии GitHub release до Go 1.22.2, поскольку она поставляется с некоторыми исправлениями безопасности и ошибок в net/http
([https://github.com/golang/go/issues?q=milestone%3AGo1.22.2]).
Заменён драйвер по умолчанию s3blob
урезанной версией из вендора для уменьшения размера двоичного файла примерно на 10 МБ. Его можно дополнительно уменьшить ещё примерно на 10 МБ, когда мы полностью заменим зависимость aws-sdk-go-v2
, но я столкнулся с некоторыми крайними случаями, связанными с подписанием заголовков, и пока отложил это.
Другие небольшие улучшения (обновлён логотип провайдера GitLab OAuth2 [https://github.com/pocketbase/pocketbase/pull/4650], нормализованы сообщения об ошибках, обновлены зависимости npm и т.д.).
Улучшения доступности административного пользовательского интерфейса:
исправлена навигация по вкладкам, клавишам ввода и пробела в раскрывающихся списках (#4607);
добавлены атрибуты role
, aria-label
, aria-hidden
к некоторым элементам, чтобы лучше помогать программам чтения с экрана.
Небольшие исправления помощников тестирования (#4600):
вызов хука OnTerminate
в TestApp.Cleanup()
;
автоматический запуск миграций БД при инициализации тестового приложения с помощью tests.NewTestApp()
.
Добавлено более подробное предупреждающее сообщение при восстановлении резервной копии, объясняющее, как работает операция.
Пропускаются нерегулярные файлы (символьные ссылки, сокеты и т. д.) при восстановлении zip-архива резервных копий из административного пользовательского интерфейса или вызова archive.Extract(src, dst)
, поскольку они связаны со слишком большим количеством крайних случаев и неясностей.
Подробнее:
Это было первоначально зарегистрировано как проблема безопасности (спасибо Харви Спеку), но в контексте PocketBase это не то, что можно использовать без вмешательства администратора, а поскольку общие ожидания заключаются в том, что администраторы PocketBase могут делать всё, что угодно, и именно они управляют своим сервером, это следует рассматривать с той же осторожностью при использовании scp
/rsync
/rclone
/etc. с ненадёжными источниками файлов.
Невозможно (или, по крайней мере, я не знаю, как это легко сделать) выполнить сканирование вирусов/вредоносного содержимого в загруженных файлах архивных резервных копий, и всегда требуется некоторая осторожность при использовании административного пользовательского интерфейса или выполнении команд оболочки, отсюда и текст предупреждения о восстановлении резервных копий.
Или другими словами, если кто-то отправляет вам файл и просит загрузить его на ваш сервер (либо в виде zip-файла резервной копии, либо вручную через scp), очевидно, вы не должны этого делать, если вы действительно им не доверяете.
PocketBase — это обычное приложение, которое вы запускаете на своём сервере, и в нём нет встроенной «песочницы» для того, что может выполнять процесс PocketBase. Это остаётся на усмотрение разработчиков, чтобы ограничить выполнение на уровне приложения или операционной системы в зависимости от их потребностей. Если вы самостоятельно размещаете PocketBase, обычно вам не нужно этого делать, но если вы предлагаете PocketBase в качестве услуги и позволяете незнакомым людям запускать свои собственные экземпляры PocketBase на вашем сервере, вам необходимо будет реализовать механизмы изоляции самостоятельно.
Устранено противоречие стилей, из-за которого предварительный просмотр подробных данных журнала кодовых блоков отображался неправильно (#4505).
Незначительные улучшения JSVM:
добавлен помощник $filesystem.fileFromUrl(url, optSecTimeout)
;
реализован интерфейс FormData
и добавлена поддержка. Для отправки запросов multipart/form-data с помощью $http.send() (#4544).
Исправлен z-индекс текущего выпадающего меню администратора в Safari (#4492).
Исправлено отсутствие ссылки на ошибку отладки в журнале OnAfterApiError nil (#4498).
Добавлено имя поля как часть соединения @request.data.someRelField.* для обработки случая, когда коллекция имеет 2 или более полей отношений, указывающих на одно и то же место (#4500).
Обновлены Go deps и увеличена минимальная версия Go в действии GitHub release до Go 1.22.1, поскольку она поставляется с некоторыми исправлениями безопасности (https://github.com/golang/go/issues?q=milestone%3AGo1.22.1).
Исправлены панели записей и коллекций администратора, которые неправильно повторно инициализировались при навигации назад/вперёд в браузере (#4462).
Инициализация RecordAuthWithOAuth2Event.IsNewRecord для хука OnRecordBeforeAuthWithOAuth2Request (#4437).
Добавлены проверки ошибок в автоматически сгенерированные миграции Go (#4448).
Добавлен провайдер центра планирования OAuth2 (#4393; спасибо @alxjsn).
Улучшения административного интерфейса:
Поддержка обратных отношений filter/sort (одиночных и множественных). Синтаксис для ссылки на поля обратной связи — yourCollection_via_yourRelField.*. ⚠️ Чтобы избежать чрезмерных объединений, глубина вложенных отношений теперь ограничена максимальным уровнем 6 (так же, как и expand). Обратите внимание, что в будущем появятся более продвинутые и детальные параметры для указания подмножеств фильтруемых/сортируемых полей.
Поддержка нескольких обратных/косвенных отношений expand и обновление ключей для использования синтаксиса ссылок via (yourCollection_via_yourRelField). Чтобы минимизировать критические изменения, старый синтаксис ссылок в скобках (yourCollection(yourRelField)) будет продолжать работать, но он мягко устарел, и появится консольный журнал, напоминающий вам о необходимости изменить его на новый.
⚠️ Коллекциям и полям больше не разрешено иметь via в своих именах, чтобы избежать конфликтов с синтаксисом ссылок обратных/косвенных отношений.
Добавление jsvm.Config.OnInit необязательной функции конфигурации для регистрации пользовательских привязок Go к JSVM.
Добавление правила @request.context, которое можно использовать для применения другого набора ограничений на основе контекста выполнения API-правила. Например, чтобы запретить создание пользователя с помощью аутентификации OAuth2, вы можете установить для пользователей правило создания API @request.context != «oauth2». В настоящее время поддерживаются значения @request.context:
default
realtime
protectedFile
oauth2
Настройка cron.Start() для запуска тикера в секунду cron интервала (#4394). Обратите внимание, что формат cron имеет только минутную детализацию, и всё ещё нет гарантии, что запланированное задание всегда будет выполняться в секунду.
Исправлена некорректная перезагрузка автоматических резервных копий после изменения настроек приложения (#4431).
Обновление до aws-sdk-go-v2 и добавление специальной обработки для GCS для обхода предыдущей проблемы с заголовками подписи GCS. Данный текст представляет собой описание изменений в различных версиях программного обеспечения PocketBase. В тексте идёт речь о технических аспектах разработки и улучшениях функционала программы.
В тексте упоминаются различные версии программного обеспечения, а также описываются изменения и исправления ошибок в каждой из них. Текст содержит информацию о поддержке новых функций, улучшении существующих возможностей и исправлении проблем с безопасностью.
Также в тексте есть ссылки на проблемы на GitHub, которые были решены в соответствующих версиях.
Конкретные изменения включают в себя:
Это лишь некоторые из изменений, описанных в тексте. Полный список изменений можно найти в исходном тексте. deps
v0.20.5
v0.20.4
v0.20.3
v0.20.2
Добавлена привязка JSVM sleep(миллисекунды). Работает так же, как Go time.Sleep(), то есть приостанавливает выполнение goroutine, где выполняется код JSVM.
Исправлено многострочное текстовое копирование в строке поиска Admin UI (#4022).
Исправлен моноширинный шрифт в Admin UI.
Различные исправления в документации и комментариях кода.
v0.20.1
Добавлен флаг --dev и соответствующий метод app.IsDev() (вместо ранее удалённого --debug) для помощи в разработке (#3918). Флаг --dev выводит в консоль «всё», а именно: — операторы SQL БД данных; — все записи app.Logger().* (отладка, информация, предупреждение, ошибка и т.д.), независимо от настроек сохранения журналов в Admin UI.
Мелкие исправления Admin UI: — Исправлена проблема с переносом текста метки error в журнале. — Добавлены метки referer (когда они из другого источника) и details в списке журналов. — Удалена пустая текущая временная запись из диаграммы журналов, поскольку она вызывала путаницу при использовании с настраиваемыми временными диапазонами. — Обновлён синтаксический маркер SQL и автозаполнение ключевых слов в Admin UI для распознавания выражений CAST(x as bool).
Заменён тайм-аут по умолчанию для тестов API новым параметром ApiScenario.Timeout (#3930). Отрицательное или нулевое значение означает отсутствие тайм-аута. Если один тест API занимает более 3 секунд, появится сообщение журнала, видимое при сбое теста или при использовании флага go test -v.
Добавлена отметка времени в начале сгенерированного файла типов JSVM, чтобы избежать его создания каждый раз при запуске приложения.
v0.20.0
// JS SDK v0.20.0
pb.collection("example").subscribe("*", (e) => {
...
}, {
expand: "someRelField",
filter: "status = 'active'",
fields: "id,expand.someRelField.*:excerpt(100)",
})
// Dart SDK v0.17.0
pb.collection("example").subscribe("*", (e) {
...
},
expand: "someRelField",
filter: "status = 'active'",
fields: "id,expand.someRelField.*:excerpt(100)",
)
app.Logger().Info("Example message", "total", 123, "details", "lorem ipsum...")
// JS: https://pocketbase.io/docs/js-logging/ $app.logger().info("Example message", "total", 123, "details", "lorem ipsum...");
Для лучшей производительности и минимизации блокировок в горячих путях журналы в настоящее время записываются с использованием debounce и пакетов:
Некоторые заметные изменения, связанные с журналами:
⚠️ Повышен минимальный требуемый уровень Go до 1.21.
⚠️ Удалена таблица _requests
в пользу обобщённой таблицы _logs
. Обратите внимание, что существующие журналы будут удалены!
⚠️ Переименованы следующие методы Dao журнала:
Dao.RequestQuery(...) -> Dao.LogQuery(...)
Dao.FindRequestById(...) -> Dao.FindLogById(...)
Dao.RequestsStats(...) -> Dao.LogsStats(...)
Dao.DeleteOldRequests(...) -> Dao.DeleteOldLogs(...)
Dao.SaveRequest(...) -> Dao.SaveLog(...)
⚠️ Убраны app.IsDebug() и флаг --debug. Это было сделано, чтобы избежать путаницы с новым регистратором и его уровнем серьёзности отладки. Если вы хотите хранить журналы отладки, вы можете установить -4 в качестве минимального уровня журнала в Admin UI.
Рефакторинг Admin UI Logs:
Добавлен новый метод filesystem/System.Copy(src, dest) для копирования существующих файлов из одного места в другое. Обычно это полезно при программном дублировании записей с полями file.
Добавлен вспомогательный метод filesystem.NewFileFromUrl(ctx, url) для создания файла *filesystem.BytesReader из указанного URL.
Дополнения, связанные с OAuth2:
добавлены новые методы PKCE() и SetPKCE(enable) OAuth2, чтобы указать, поддерживается ли поток PKCE или нет. Значение PKCE в настоящее время настраивается только через пользовательский интерфейс для поставщиков OIDC. Это было добавлено для поддержки поставщиков OIDC, которые могут выдавать ошибку, если неподдерживаемые параметры PKCE отправляются вместе с запросом аутентификации (например, LinkedIn; см. #3799).
добавлено новое поле displayName для каждого элемента провайдера OAuth2 listAuthMethods(). Значение свойства displayName в настоящее время настраивается через пользовательский интерфейс только для поставщиков OIDC.
Добавлено поле expiry в ответ пользователя OAuth2, содержащее необязательное время истечения срока действия токена доступа OAuth2 (#3617).
Разрешено использовать одного пользователя OAuth2 для аутентификации в нескольких коллекциях аутентификации. Поскольку теперь у вас может быть более одного внешнего поставщика с парой collectionId-provider-providerId, метод Dao.FindExternalAuthByProvider(provider, providerId) был удалён в пользу более общего метода Dao.FindFirstExternalAuthByExpr(expr).
Добавлено auth collection option onlyVerified для глобального запрета запросов аутентификации для непроверенных пользователей.
Добавлена поддержка однострочных комментариев (например, // ваш комментарий) в правилах API и выражениях фильтров.
Добавлена поддержка указания псевдонима коллекции в @collection.someCollection:alias.*.
Мягко устарело и переименовано app.Cache() в app.Store().
Незначительные обновления и исправления JSVM:
Обновлены $security.parseUnverifiedJWT(token) и $security.parseJWT(token, key), чтобы возвращать результат полезной нагрузки токена в виде простого объекта.
Добавлен $apis.requireGuestOnly() промежуточного программного обеспечения JSVM привязки (#3896).
Используйте IS NOT вместо != в качестве оператора SQL-запроса «не равно» для обработки. Текст запроса:
Cases when comparing with nullable columns or expressions (eg. json_extract
over json
field).
Based on my local dataset I wasn't able to find a significant difference in the performance between the 2 operators, but if you stumble on a query that you think may be affected negatively by this, please report it and I'll test it further.
MaxSize
для json
, чтобы предотвратить хранение больших данных JSON в БД (#3790).Существующие поля json обновляются с помощью системной миграции, чтобы иметь ограничение на размер около 2 МБ (можно настроить через интерфейс администратора).
Исправлена поддержка нормализации отрицательных строковых чисел для типа поля json
.
Запускать хук app.OnTerminate()
при вызове app.Restart()
.
Также добавлено новое логическое поле IsRestart
в событие core.TerminateEvent
.
Исправлено корректное завершение работы и немного ускорено время завершения работы приложения.
Ограничьте одновременную генерацию эскизов, чтобы избежать высокого использования ЦП и памяти в пиковых сценариях (#3794; спасибо @t-muehlberger).
В настоящее время максимальное количество процессов генерации эскизов ограничено «общим количеством логических процессоров + 1».
Это выбрано произвольно и может измениться в будущем в зависимости от отзывов пользователей и шаблонов использования.
Если вы сталкиваетесь с ошибками OOM во время создания больших эскизов изображений, особенно в контейнерной среде, вы можете попробовать определить переменную среды GOMEMLIMIT=500MiB
перед запуском исполняемого файла.
Немного ускорьте (~10%) генерацию эскизов за счёт изменения с кубического (CatmullRom
) на билинейный (Linear
) фильтр повторной выборки (разница в качестве очень мала).
По умолчанию добавлен красный вывод Stderr в случае ошибки команды консоли.
Теперь также можно индивидуально отключать ошибки пользовательских команд с помощью поля cobra.Command.SilenceErrors
.
Исправлены ссылки в автоматически сгенерированном теле письма html->text.
Убраны неправильно импортированные пустые объявления шрифта local('')
.
Исправлен просмотрщик исходного кода TinyMCE в текстовой области (#3715).
Исправлены минимальные и максимальные валидаторы поля text
, чтобы правильно подсчитывать многобайтовые символы (#3735).
Разрешены дефисы в имени пользователя (#3697).
Больше контроля над настройками системных полей будет доступно в будущем.
Обновлены типы, сгенерированные JSVM, для непосредственного использования типа значения вместо объединения * | undefined
в функциях/методах возвращаемых объявлений.
Добавлены примечания к выпуску в консольный вывод ./pocketbase update
(#3685).
Добавлена отсутствующая документация для привязок JSVM $mails.*
.
Ослаблена проверка URL-адреса перенаправления OAuth2, чтобы разрешить любое строковое значение (#3689; спасибо @sergeypdev).
Обратите внимание, что формат URL-адреса переадресации по-прежнему привязан к принятым значениям конкретным провайдером OAuth2.
Исправлено tokenizer.Scan()/ScanAll()
, чтобы игнорировать разделители из набора обрезки по умолчанию.
Добавлена возможность возвращать также найденные пустые токены с помощью Tokenizer.KeepEmptyTokens(true)
.
Это должно исправить синтаксический анализ символов пробела вокруг имён столбцов запросов без кавычек (#3616).
Исправлен модификатор параметра запроса полей :excerpt(max, withEllipsis?)
, чтобы должным образом добавлять пробел к сгенерированному фрагменту текста после тегов блоков.
Добавлен Patreon OAuth2 provider (#3323; спасибо @ghostdevv).
Добавлен mailcow OAuth2 provider. В версии 0.18.10:
— Добавлена поддержка модификатора полей :excerpt(max, withEllipsis?)
, который будет возвращать короткую текстовую версию любого строкового значения (теги HTML удаляются). Это можно использовать для минимизации загружаемых данных JSON при перечислении записей с большими значениями editor
HTML.
Пример кода:
await pb.collection("example").getList(1, 20, {
"fields": "*,description:excerpt(100)"
})
И так далее.
Полный текст перевода вы можете запросить отдельно. Добавлены более подробные внутренние сообщения об ошибках при отсутствии адреса электронной почты пользователя или администратора в запросах на сброс пароля.
Обновлены Go-зависимости.
\
) в Admin UI для использования значений поля select
с запятой.readerToString(reader)
для чтения значений Go io.Reader
.html/template
и net/http
.editor
.$security.*
JSVM:// HMAC с SHA256
$security.hs256("hello", "secret")
// HMAC с SHA512
$security.hs512("hello", "secret")
// сравнение 2 строк с постоянным временем
$security.equal(hash1, hash2)
serve
для принятия доменного имени (имён) в качестве аргумента для уменьшения дополнительной ручной настройки хостов, которая иногда требовалась ранее при развёртывании в рабочей среде:./pocketbase serve yourdomain.com
SmtpConfig.LocalName
для указания пользовательского доменного имени (или IP-адреса) для начального обмена EHLO/HELO.NoDecimal
для чисел.editor
:
false
для нового контента).json
в Admin UI.// все макросы основаны на UTC
@second - @now second number (0-59)
@minute - @now minute number (0-59)
@hour - @now hour number (0-23)
@weekday - @now weekday number (0-6)
@day - @now day number
@month - @now month number
@year - @now year number
@todayStart - начало текущего дня в виде строки datetime
@todayEnd - конец текущего дня **Текст запроса:**
string
@monthStart — начало текущего месяца в виде строки datetime.
@monthEnd — конец текущего месяца в виде строки datetime.
@yearStart — начало текущего года в виде строки datetime.
@yearEnd — конец текущего года в виде строки datetime.
**Перевод:**
Строка
@monthStart – начало текущего месяца как строка datetime.
@monthEnd – конец текущего месяца как строка datetime.
@yearStart – начало текущего года как строка datetime.
@yearEnd – конец текущего года как строка datetime. **prod environments since they могут вызвать потерю данных и, хотя это не идеально, предыдущее старое поведение всегда устанавливать правила в null/nil безопаснее, чем вообще не обновлять правила.**
- Обновлены некоторые Go deps.
## v0.17.6
- Исправлена ошибка require() файла JSVM при использовании разделителей пути в стиле Windows ([#3163](https://github.com/pocketbase/pocketbase/issues/3163#issuecomment-1685034438)).
## v0.17.5
- Добавлены кавычки вокруг столбцов запроса представления, представленных в v0.17.4.
## v0.17.4
- Исправлено получение записей представлений при использовании числового идентификатора ([#3110](https://github.com/pocketbase/pocketbase/issues/3110)). *С этим исправлением мы также теперь правильно распознаём `CAST(... as TEXT)` и `CAST(... as BOOLEAN)` как поля `text` и `bool`.*
- Исправлено сообщение об ошибке «Cascade delete» для отношения ([#3098](https://github.com/pocketbase/pocketbase/issues/3098)).
- Исправлен префикс сообщения об ошибке jsvm при неудачных миграциях ([#3103](https://github.com/pocketbase/pocketbase/pull/3103); спасибо @nzhenev).
- Отключён начальный кэш счётчика администраторов UI администратора, когда нет начальных администраторов, чтобы можно было обнаруживать учётные записи, созданные извне (например, с помощью команды `admin`) ([#3106](https://github.com/pocketbase/pocketbase/issues/3106)).
- Понижена версия зависимости `google/go-cloud` до версии 0.32.0 до выпуска версии 0.34.0, чтобы предотвратить ошибки `os.TempDir` `cross-device link`, так как слишком много пользователей жаловались на это.
## v0.17.3
- Исправлена ошибка Docker `cross-device link` при создании резервных копий `pb_data` на локальном подключённом томе ([#3089](https://github.com/pocketbase/pocketbase/issues/3089)).
- Исправлены сообщения об ошибках для отношений с представлениями ([#3090](https://github.com/pocketbase/pocketbase/issues/3090)).
- Всегда резервируется место для полосы прокрутки, чтобы уменьшить сдвиги макета в записях списка UI администратора из-за устаревшего `overflow: overlay`.
- Включена отложенная загрузка для эскизов изображений администратора UI.
## v0.17.2
- Мягко устарело использование `$http.send({ data: object, ... })` в пользу `$http.send({ body: rawString, ... })$ для отправки тела запроса без JSON ([#3058](https://github.com/pocketbase/pocketbase/discussions/3058)). Существующее свойство `data` будет продолжать работать, но рекомендуется использовать `body` (*для отправки JSON вы можете использовать `JSON.stringify(...)` в качестве значения body*).
- Добавлено поле `core.RealtimeConnectEvent.IdleTimeout`, позволяющее указать различную продолжительность тайм-аута простоя в реальном времени для каждого клиента ([#3054](https://github.com/pocketbase/pocketbase/discussions/3054)).
- Исправлена заметка об устаревании `apis.RequestData` ([#3068](https://github.com/pocketbase/pocketbase/pull/3068); спасибо @gungjodi).
## v0.17.1
- Использовать относительный путь при перенаправлении на страницу поставщиков OAuth2 в пользовательском интерфейсе администратора для поддержки развёртывания подпутей ([#3026](https://github.com/pocketbase/pocketbase/pull/3026); спасибо @sonyarianto).
- Вручную запускать хук `OnBeforeServe` для `tests.ApiScenario` ([#3025](https://github.com/pocketbase/pocketbase/discussions/3025)).
- Запускать обработчик JSVM `cronAdd()` только на сервере приложения, чтобы избежать неожиданных (и, возможно, дублированных) вызовов обработчиков cron при использовании пользовательских команд консоли ([#3024](https://github.com/pocketbase/pocketbase/discussions/3024#discussioncomment-6592703)).
- Сообщения `console.log()` теперь записываются в `stdout`, а не в `stderr`.
## v0.17.0
- Новые более подробные руководства по использованию PocketBase в качестве фреймворка (как для Go, так и для JS). *Если вы обнаружите какие-либо опечатки или проблемы с документами, пожалуйста, сообщите о них на сайте https://github.com/pocketbase/site.*
- Добавлены новые экспериментальные хуки JavaScript-приложений, связываемые через [goja](https://github.com/dop251/goja). Они доступны по умолчанию в предварительно созданном исполняемом файле, если вы создадите файлы `*.pb.js` в каталоге `pb_hooks`. Не ожидайте многого, поскольку интеграция имеет некоторые ограничения. Для получения дополнительной информации ознакомьтесь с руководством [Расширение с помощью JavaScript](https://pocketbase.io/docs/js-overview/). При желании вы также можете включить хуки JS-приложения как часть пользовательской сборки Go для динамического создания сценариев, но вам необходимо зарегистрировать плагин `jsvm` вручную:
```go **JSVM.MustRegister(app core.App, config jsvm.Config{})**
- Добавлен провайдер OAuth2 от Instagram ([#2534](https://github.com/pocketbase/pocketbase/pull/2534); спасибо @pnmcosta).
- Добавлен провайдер VK OAuth2 ([#2533](https://github.com/pocketbase/pocketbase/pull/2533); спасибо @imperatrona).
- Добавлен провайдер Yandex OAuth2 ([#2762](https://github.com/pocketbase/pocketbase/pull/2762); спасибо @imperatrona).
- В **core.ServeEvent** добавлены новые поля:
```go
type ServeEvent struct {
App App
Router *echo.Echo
// new fields
Server *http.Server // позволяет настраивать конфигурацию HTTP-сервера (глобальные таймауты, опции TLS и т. д.)
CertManager *autocert.Manager // позволяет настраивать опции autocert (каталог кэша, политика хоста и т.д.)
}
Добавили хелперы record.ExpandedOne(rel) и record.ExpandedAll(rel) для получения приведения к типу и извлечения одного или нескольких расширенных отношений из уже загруженных данных «expand» Record.
Добавили помощников правил и фильтров записи Dao:
app.Dao().FindRecordsByFilter("posts", "title ~ 'lorem ipsum' && visible = true", "-created", 10)
app.Dao().FindFirstRecordByFilter("posts", "slug='test' && active=true")
app.Dao().CanAccessRecord(record, requestInfo, rule)
Добавили помощник Dao.WithoutHooks(), чтобы создать новый Dao на основе текущего, но без хуков create/update/delete.
Используем функцию по умолчанию, которая будет возвращать все отношения, если аргумент fetchFunc в Dao.ExpandRecord(record, expands, fetchFunc) и Dao.ExpandRecords(records, expands, fetchFunc) равен nil.
Теперь можно вызывать Dao.RecordQuery(collectionModelOrIdentifier) только с идентификатором или именем коллекции. Если передана недопустимая строка идентификатора/имени коллекции, запрос будет разрешён с ошибкой контекста.
Рефакторили сериализацию ошибок валидации apis.ApiError, чтобы разрешить использование map[string]error и map[string]any при генерации безопасного для публичного использования форматированного ApiError.Data.
Добавили поддержку обёрнутых API-ошибок (если используется Go 1.20+ с несколькими обёрнутыми ошибками, первая apis.ApiError имеет приоритет).
Добавили параметр запроса файла ?download=1 к конечной точке обслуживания файлов, чтобы браузер всегда загружал файл и не показывал его превью.
Добавили новый служебный подпакет github.com/pocketbase/pocketbase/tools/template, который помогает с рендерингом HTML-шаблонов с использованием стандартного синтаксиса Go html/template и text/template.
Добавили помощники types.JsonMap.Get(k) и types.JsonMap.Set(k, v) для случаев, когда прямой доступ к карте с методами не разрешён (например, в goja).
Мягко устарели security.NewToken() в пользу security.NewJWT().
Hook.Add() и Hook.PreAdd теперь возвращают уникальный строковый идентификатор, который можно использовать для удаления зарегистрированного обработчика хука через Hook.Remove(handlerId).
Изменили порядок вызова хуков после*, чтобы они вызывались непосредственно перед записью пользовательского ответа. Это позволяет пользователям возвращать ошибки ответов из хуков after*. Также больше нет необходимости явно возвращать hook.StopPropagtion, когда мы пишем собственное тело ответа в хуке, потому что мы пропустим запись окончательного тела ответа, если ответ уже был «зафиксирован».
⚠️ Переименовали Options{} в Config{} для единообразия и заменили ненужные указатели их эквивалентами значений, чтобы сохранить применяемые настройки конфигурации изолированными в своих вызовах функций:
old: pocketbase.NewWithConfig(config *pocketbase.Config) *pocketbase.PocketBase
new: pocketbase.NewWithConfig(config pocketbase.Config) *pocketbase.PocketBase
old: core.NewBaseApp(config *core.BaseAppConfig) *core.BaseApp
new: core.NewBaseApp(config core.BaseAppConfig) *core.BaseApp
old: apis.Serve(app core.App, options *apis.ServeOptions) error
new: apis.Serve(app core.App, config apis.ServeConfig) (*http.Server, error)
old: jsvm.MustRegisterMigrations(app core.App, options *jsvm.MigrationsOptions)
new: jsvm.MustRegister(app core.App, config jsvm.Config)
old:
``` ghupdate.MustRegister(app core.App, rootCmd *cobra.Command, config ghupdate.Config)
new: ghupdate.MustRegister(приложение core.App, rootCmd *cobra.Command, options *ghupdate.Options)
old: migratecmd.MustRegister(app core.App, rootCmd *cobra.Command, options *migratecmd.Options)
new: migratecmd.MustRegister(приложение core.App, rootCmd *cobra.Command, config migratecmd.Config).
- ⚠️ Изменён тип `subscriptions.Message.Data` с `string` на `[]byte`, потому что `Data`, как правило, представляет собой срез байтов JSON.
- ⚠️ Переименован `models.RequestData` в `models.RequestInfo`, а `apis.RequestData(c)` мягко объявлен устаревшим в пользу `apis.RequestInfo(c)`, чтобы избежать путаницы с полем `Data`.
*Старый метод `apis.RequestData()` всё ещё работает, чтобы минимизировать критические изменения, но рекомендуется заменить его на `apis.RequestInfo(c)`.*
- ⚠️ Изменения в API списка/поиска:
- Добавлен новый параметр запроса `?skipTotal=1`, чтобы пропустить запрос `COUNT`, выполняемый действиями списка/поиска ([#2965](https://github.com/pocketbase/pocketbase/discussions/2965)).
Если установлено `?skipTotal=1`, поля ответа `totalItems` и `totalPages` будут иметь значение `-1` (это сделано для того, чтобы не было разных ответов JSON и чтобы отличать их от нуля по умолчанию).
В последних версиях JS SDK 0.16+ и Dart SDK v0.11+ параметр `skipTotal=1` устанавливается по умолчанию для запросов `getFirstListItem()` и `getFullList()`.
- Операторы `count` и обычные операторы `select` теперь выполняются одновременно, что означает, что мы больше не выполняем нормализацию над параметром `page`, и если пользователь запросит страницу, которая не существует (например, `?page=99999999`), мы вернём пустой массив `items`.
- Восстановлено значение по умолчанию `COUNT` столбца до `id`, поскольку существуют некоторые общие ситуации, когда это может негативно повлиять на производительность запроса.
Кроме того, начиная с этой версии мы также устанавливаем `PRAGMA temp_store = MEMORY`, что также помогает с созданием временного B-дерева при использовании `id`.
*Существуют сценарии, в которых запросы `COUNT` с использованием `rowid` выполняются быстрее, но в большинстве случаев, когда используются вложенные поисковые запросы, это, похоже, имеет противоположный эффект (по крайней мере, на основе набора данных тестов).*
- ⚠️ Запрещены отношения с представлениями **из коллекций, не являющихся представлениями** ([#3000](https://github.com/pocketbase/pocketbase/issues/3000)).
Изменение было необходимо, потому что я не смог найти эффективный способ отслеживать изменения представлений, и предыдущее поведение могло иметь слишком много неожиданных побочных эффектов (например, представление с вычисленными идентификаторами).
Существует системная миграция, которая преобразует существующие поля `relation` представления в поля `json` (несколько) и `text` (одно).
Это может привести к критическим изменениям, если у вас есть `relation` к представлению и вы используете `expand` или некоторые из полей `relation` представлений в качестве части правила коллекции.
- ⚠️ Добавлен дополнительный аргумент `action` в хуки `Dao`, чтобы разрешить пропуск поведения сохранения по умолчанию.
В рамках подготовки к обобщению журналов методы `Dao.After*Func` теперь также позволяют возвращать ошибку.
- Разрешено использование `0` в качестве значения `RelationOptions.MinSelect`, чтобы избежать двусмысленности между 0 и незаполненным входным значением ([#2817](https://github.com/pocketbase/pocketbase/discussions/2817)).
- Исправлено, что нулевое значение по умолчанию не используется, если поле явно не задано при ручном создании записей ([#2992](https://github.com/pocketbase/pocketbase/issues/2992)).
Кроме того, `record.Get(field)` теперь всегда будет возвращать нормализованное значение (такое же, как при сериализации json) для согласованности и во избежание двусмысленностей с тем, что хранится в связанной таблице БД.
Определение столбцов `DEFAULT` схемы также было обновлено для новых коллекций, чтобы гарантировать, что значения `NULL` не могут быть случайно вставлены.
- Исправлена ошибка, из-за которой `migrate down` не возвращал правильное значение `lastAppliedMigrations()`, когда сохранённое время применения миграции было указано в секундах.
- Исправлен вызов события удаления в реальном времени после того, как запись была удалена из БД (*включая транзакции и операции каскадного удаления*).
- Другие незначительные исправления и улучшения (исправление опечаток и грамматических ошибок, обновление...). **Зависимости**, *удалено ненужное* **проверок ошибок 404 в пользовательском интерфейсе администратора** и т. д.).
## v0.16.10
- Добавлены нормализации полей с несколькими значениями (`relation`, `select`, `file`), чтобы гарантировать, что для вновь созданного поля с несколькими значениями применяется значение по умолчанию, равное нулю, для уже существующих данных ([#2930](https://github.com/pocketbase/pocketbase/issues/2930)).
## v0.16.9
- Зарегистрируйте промежуточное ПО `eagerRequestInfoCache` только для внутренних маршрутов группы `api`, чтобы избежать конфликтов с обработчиками пользовательских маршрутов ([#2914](https://github.com/pocketbase/pocketbase/issues/2914)).
## v0.16.8
- Исправлена ошибка, из-за которой подробное сообщение об ошибке уникального валидатора не возвращалось при использовании имени поля camelCase ([#2868](https://github.com/pocketbase/pocketbase/issues/2868)).
- Обновлён синтаксический анализатор индекса, чтобы разрешить отсутствие пробела между именем таблицы и списком столбцов ([#2864](https://github.com/pocketbase/pocketbase/discussions/2864#discussioncomment-6373736)).
- Обновлено go deps.
## v0.16.7
- Незначительная оптимизация запросов списка/поиска для использования `rowid` с оператором `COUNT`, когда это возможно. Это устраняет шаг временного B-TREE при выполнении запроса, а для больших наборов данных (например, 150 тыс.) может быть улучшение в 10 раз (с ~580 мс до ~60 мс).
## v0.16.6
- Исправлено нормализация сортировки столбца индекса коллекции в пользовательском интерфейсе администратора ([#2681](https://github.com/pocketbase/pocketbase/pull/2681); спасибо @SimonLoir).
- Удалено ненужное количество администраторов в промежуточном программном обеспечении `apis.RequireAdminAuthOnlyIfAny` ([#2726](https://github.com/pocketbase/pocketbase/pull/2726); спасибо @svekko).
- Исправлен запрос `multipart/form-data`, не заполняющий значения элементов массива карты ([#2763](https://github.com/pocketbase/pocketbase/discussions/2763#discussioncomment-6278902)).
- Обновили зависимости npm и Go.
## v0.16.5
- Исправлена сериализация пользовательского интерфейса администратора для неявных полей отображения отношений ([#2675](https://github.com/pocketbase/pocketbase/issues/2675)).
- Сброс пользовательского интерфейса администратора в случае переименования или удаления активного поля сортировки коллекции.
## v0.16.4
- Исправлена команда самообновления, которая не работает в Windows из-за отсутствия `.exe` в пути к извлечённому двоичному файлу ([#2589](https://github.com/pocketbase/pocketbase/discussions/2589)). Обратите внимание, что команда в Windows будет работать начиная с версии v0.16.4 и далее, то есть вам всё равно придётся обновить вручную ещё один раз до версии v0.16.4.
- Поддержка `int64`, `int32`, `uint`, `uint64` и `uint32` при сканировании `types.DateTime` ([#2602](https://github.com/pocketbase/pocketbase/discussions/2602))
- Обновление зависимостей.
## v0.16.3
- Исправлена проблема с сортировкой полей схемы, не работающая в Safari/Gnome Web ([#2567](https://github.com/pocketbase/pocketbase/issues/2567)).
- Исправлены стандартные `PRAGMA`, которые не применяются для новых подключений ([#2570](https://github.com/pocketbase/pocketbase/discussions/2570)).
## v0.16.2
- Исправлена ошибка архива резервных копий, исключающего локальный каталог `backups` в Windows ([#2548](https://github.com/pocketbase/pocketbase/discussions/2548#discussioncomment-5979712)).
- Изменено поле файла, чтобы не использовать `dataTransfer.effectAllowed` при перетаскивании файлов, поскольку оно ненадёжно и непоследовательно в разных ОС и браузерах ([#2541](https://github.com/pocketbase/pocketbase/issues/2541)).
- Автоматически регистрировать начальную миграцию моментального снимка, чтобы предотвратить неправильное повторное применение моментального снимка при перезапуске Docker ([#2551](https://github.com/pocketbase/pocketbase/discussions/2551)).
- Исправлена опечатка в сообщении об ошибке отсутствующего поля просмотра.
## v0.16.1
- Исправлена ошибка резервного копирования, не работающего в среде контейнера, когда `pb_data` смонтирован как том ([#2519](https://github.com/pocketbase/pocketbase/issues/2519)).
- Исправлен пример предварительного просмотра реального времени API Dart SDK ([#2523](https://github.com/pocketbase/pocketbase/pull/2523); спасибо @xFrann).
- Исправлена типографская ошибка в панели создания резервных копий ([#2526](https://github.com/pocketbase/pocketbase/pull/2526); спасибо @dschissler).
- Удалён ненужный чек длины среза в `list.ExistInSlice` ([#2527](https://github.com/pocketbase/pocketbase/pull/2527); спасибо @KunalSin9h).
- Избегайте изменения кэшированных данных запроса при создании пользователя OAuth2. ### v0.16.0
- Добавлена функция автоматического резервного копирования (с ротацией через cron) для каталога `pb_data` и соответствующий API. Резервные копии также можно инициализировать программно с помощью команды `app.CreateBackup("backup.zip")`
Существует экспериментальный метод восстановления — `app.RestoreBackup("backup.zip")`, который в настоящее время работает только в системах UNIX, поскольку использует функцию `execve_`. Резервные копии могут храниться локально или во внешнем хранилище S3 (для него предусмотрена отдельная конфигурация, не связанная с файловой системой хранилища загрузок).
- Появилась возможность ограничивать возвращаемые поля API с помощью параметра запроса `?fields`. «Выбор полей» применяется к `SearchResult.Items` и любому другому ответу JSON. Например:
```js
// оригинал: {"id": "RECORD_ID", "name": "abc", "description": "...something very big...", "items": ["id1", "id2"], "expand": {"items": [{"id": "id1", "name": "test1"}, {"id": "id2", "name": "test2"}]}}
// вывод: {"name": "abc", "expand": {"items": [{"name": "test1"}, {"name": "test2"}]}}
const result = await pb.collection("example").getOne("RECORD_ID", {
expand: "items",
fields: "name,expand.items.name",
})
Введена новая команда ./pocketbase update
для самостоятельного обновления готового исполняемого файла (с возможностью создания резервной копии pb_data
).
Представлена новая консольная команда администратора ./pocketbase admin
:
// создаёт новую учётную запись администратора
./pocketbase admin create test@example.com 123456890
// изменяет пароль существующей учётной записи администратора
./pocketbase admin update test@example.com 0987654321
// удаляет отдельную учётную запись администратора (если существует)
./pocketbase admin delete test@example.com
Для запуска сервера API программно добавлен помощник apis.Serve(app, options)
.
Обновлён интерфейс администратора схемы для более аккуратного отображения полей.
Реальный IP-адрес в журналах теперь проверяется по заголовку Fly-Client-IP
, а заголовок X-Forward-For
использует первый ненулевой левый IP, так как он ближе всего к реальному IP.
Создан новый вспомогательный пакет tools/archive
для управления архивами (в настоящее время работает только с zip).
Разработан новый вспомогательный пакет tools/cron
для планирования задач с использованием синтаксиса, подобного cron (возможно, в будущем будет экспортирован в отдельный репозиторий).
Реализован новый помощник Filesystem.List(prefix)
для получения плоского списка всех файлов под указанным префиксом.
Создана новая функция App.NewBackupsFilesystem()
для создания специализированной абстракции файловой системы для управления резервными копиями данных приложения.
Добавлен новый хук App.OnTerminate()
, выполняемый непосредственно перед завершением работы приложения, например, при получении сигнала SIGTERM
.
Атрибут accept
добавлен к полю файла с указанием типов MIME (#2466; спасибо @Nikhil1920).
Обеспечена поддержка множественной сортировки файлов в интерфейсе администратора (#2445).
Поддерживается сортировка нескольких связей в интерфейсе администратора.
Поле meta.isNew
добавлено в ответ JSON OAuth2 для обозначения нового пользователя PocketBase, созданного с помощью OAuth2.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )