Регистрация  |  Вход

AppExchange package security review

Привет сообщество,

есть у кого опыт с успешным прохождением Security review с такой вот штукой:
- Sharing Violation

Смысл задачи - заказчик очень хочет чтобы контакты и related records синхронизировались с внешним сервисом. Даже тем пользователем, который умеет только читать контакт.

К примеру имеем OWD: Contact - public read, Related records - Public Read/Write
Utils class without sharing с кучей DML - решает задачу синхронизации, но первый раунд security team этот Without sharing не одобрила. Согласно некоторым статьям - такое возможно, но надо знать волшебное слово: https://developer.salesforce.com/page/Without_Sharing.

Если можно что-то с этим сделать без перелопачивания пакета - будет замечательно

С уважением

VV
Привет сообщество,

есть у кого опыт с успешным прохождением Security review с такой вот штукой:
  - Sharing Violation

Смысл задачи - заказчик очень хочет чтобы контакты и related records синхронизировались с внешним сервисом. Даже тем пользователем, который умеет только читать контакт.

К примеру имеем OWD: Contact - public read, Related records - Public Read/Write
Utils class without sharing с кучей DML - решает задачу синхронизации, но первый раунд security team этот Without sharing не одобрила. Согласно некоторым статьям - такое возможно, но  надо знать волшебное слово: https://developer.salesforce.com/page/Without_Sharing.  

Если можно что-то с этим сделать без перелопачивания пакета - будет замечательно

С уважением



А почему класс without sharing если контакты и related records "public read"/"public read/write"?
Если поменять without sharing на with sharing что изменится?

А почему класс without sharing если контакты и related records "public read"/"public read/write"?
Если поменять without sharing на with sharing что изменится?

Нужно подготовить False Positive Doc с обьяснением/обоснованием почему вам нужно иметь without sharing для Utility класса.
Тут есть один пример, но вообще мы и по другому оформляли. Главное чтобы SF review team это поняли. В самом классе тоже не помешает иметь коммент с обьяснением. Как правило если это нужно для имплементации бизнесс логики вашего продукта, то они (review team) идут на встречу.
https://developer.salesforce.com/docs/atlas.en-us.packagingGuide.meta/packagingGuide/security_review_example_checkmarx_scan.htm

Нужно подготовить False Positive Doc с обьяснением/обоснованием почему вам нужно иметь without sharing для Utility класса.
Тут есть один пример, но вообще мы и по другому оформляли. Главное чтобы SF review team это поняли. В самом классе тоже не помешает иметь коммент с обьяснением. Как правило если это нужно для имплементации бизнесс логики вашего продукта, то они (review team) идут на встречу.
https://developer.salesforce.com/docs/atlas.en-us.packagingGuide.meta/packagingGuide/security_review_example_checkmarx_scan.htm

VV
Смысл задачи - заказчик очень хочет чтобы контакты и related records синхронизировались с внешним сервисом. Даже тем пользователем, который умеет только читать контакт.

К примеру имеем OWD: Contact - public read, Related records - Public Read/Write

Вообще как бы Security Team правы в своем решении. Не кажется ли что требования заказчика противоречат сами себе? Либо делайте Public Read/Write для Contact. Либо выносите задачи синхронизации в другой контекст (асинхронный).

Не стоит надеяться на удачу что security team пойдет к вам на встречу. Думаю для этого надо минимум обладать статусом какого-нибудь Salesforce Partner чтобы вести какой-то продуктивный диалог. Проще и быстрее поменять код.

[quote="VV"]Смысл задачи - заказчик очень хочет чтобы контакты и related records синхронизировались с внешним сервисом. Даже тем пользователем, который умеет только читать контакт.

К примеру имеем OWD: Contact - public read, Related records - Public Read/Write[/quote]

Вообще как бы Security Team правы в своем решении. Не кажется ли что требования заказчика противоречат сами себе? Либо делайте Public Read/Write для Contact. Либо выносите задачи синхронизации в другой контекст (асинхронный).

Не стоит надеяться на удачу что security team пойдет к вам на встречу. Думаю для этого надо минимум обладать статусом какого-нибудь Salesforce Partner чтобы вести какой-то продуктивный диалог. Проще и быстрее поменять код.

Спасибо всем за ответы.

Camamber, При изменении класса на with sharing - обычный пользователь (не оунер, и не админ, и не менеджер) не сможет синкнуть контакт. Вот с таким exception:
Update failed. First exception on row 0 with id 003...; first error: INSUFFICIENT_ACCESS_OR_READONLY, insufficient access rights on object id: []

Rustam Muhametdinov, False Positive Doc - Это как раз и есть первая мысль, убедить security team. Интересно само содержание это доки, как доказать команде, что это дизайн такой Спасибо за пример.

Dmitry, лимиты на асинхронный Apex - они неплохие и, наверное, очень сложно воткнуться в число 250 000+, даже если каждую минуту жать кнопку Sync на лейауте, так что вариант. Я скорее думала о Platform events, как о решении, но учитывая контекст проекта, False positive doc, все же пока первый шаг.

VV
Спасибо всем за ответы. 

Camamber, При изменении класса на with sharing - обычный пользователь (не оунер, и не админ, и не менеджер) не сможет синкнуть контакт. Вот с таким exception:
Update failed. First exception on row 0 with id 003...; first error: INSUFFICIENT_ACCESS_OR_READONLY, insufficient access rights on object id: []   

Rustam Muhametdinov, False Positive Doc - Это как раз и есть первая мысль, убедить security team. Интересно само содержание это доки, как доказать команде, что это дизайн такой :) Спасибо за пример.

Dmitry, лимиты на асинхронный Apex - они неплохие и, наверное, очень сложно воткнуться в число 250 000+, даже если каждую минуту жать кнопку Sync на лейауте, так что вариант. Я скорее думала о Platform events, как о решении, но учитывая контекст проекта, False positive doc, все же пока первый шаг. 

VV
Dmitry, лимиты на асинхронный Apex - они неплохие и, наверное, очень сложно воткнуться в число 250 000+, даже если каждую минуту жать кнопку Sync на лейауте, так что вариант. Я скорее думала о Platform events, как о решении, но учитывая контекст проекта, False positive doc, все же пока первый шаг.

Под понятием "асинхронный контекст" я имел в виде не future/queueable или прочие async вызовы кода про которые лимит 250К. Я скорее имел в виду отдельный поток для синхронизации который не зависит от пользователя.
Это может быть как упомянутые Platform events, так и Scheduler и очередь заданий на синк, а также другие экзотические способы, которые позволяют стартануть код синхронизации в контексте с повышенными привилегиями. Но это все подразумевает изменение бизнес логики проекта и дополнительное кодирование .

Если будет не сложно то можешь держать нас в курсе событий по данному вопросу? Удастся протолкнуть текущий вариант через security review или придется менять код. Очень интересно!

[quote="VV"]Dmitry, лимиты на асинхронный Apex - они неплохие и, наверное, очень сложно воткнуться в число 250 000+, даже если каждую минуту жать кнопку Sync на лейауте, так что вариант. Я скорее думала о Platform events, как о решении, но учитывая контекст проекта, False positive doc, все же пока первый шаг.[/quote]
Под понятием "асинхронный контекст" я имел в виде не future/queueable или прочие async вызовы кода про которые лимит 250К. Я скорее имел в виду отдельный поток для синхронизации который не зависит от пользователя.
Это может быть как упомянутые Platform events, так и Scheduler и очередь заданий на синк, а также другие экзотические способы, которые позволяют стартануть код синхронизации в контексте с повышенными привилегиями. Но это все подразумевает изменение бизнес логики проекта и дополнительное кодирование :) . 

Если будет не сложно то можешь держать нас в курсе событий по данному вопросу? Удастся протолкнуть текущий вариант через security review или придется менять код. Очень интересно!