• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Проблема с условием в Access Formula

  • Автор темы prokopulka
  • Дата начала
P

prokopulka

Здравствуйте!

Возникла такая проблема.
Есть форма, в ней секция, в которой находится поле "Body".
Нужно, чтобы это поле становилось доступным для редактирования только для роли Office после того, как документ сохранен и имеет статус "Черновик"("Draft").

Для этого я использую вкладку Access Formula (тип Computed for display) для секции, пишу в ней условие:

<!--shcode--><pre><code class='@-formula'>@If(!@IsNewDoc & Status = "Draft";"[office]";"[none]")[/CODE]

Затем захожу под пользователем с ролью Office, создаю и сохраняю документ, а данное поле не появляется.
Если оставить в условии только !@IsNewDoc, то данный раздел также не появляется после сохранения.

Думаю, что-то не так с использованием этой функции (@IsNewDoc) в Access Formula...

Помогите понять, что не так, пожалуйста!
 
H

hosm

А регистр роли не влияет?
+ всегда люблю поставить явно скобки @If((!@IsNewDoc) & Status = "Draft";"[Office]";"[none]")

Добавлено: А после переоткрытия документа не срабатывает?
кстати, если у Вас для секции задано имя поля (Section Field Name), можете посмотреть, чему равно его значение после сохранения документа - так, для проверки правильности отработки формулы.
 
A

Akupaka

+ всегда люблю поставить явно скобки @If((!@IsNewDoc) & Status = "Draft";"[Office]";"[none]")
Как-то ты их дивно расставила )) Я бы так: @If(!@IsNewDoc & (Status = "Draft");"[Office]";"[none]")

А после переоткрытия документа не срабатывает?
Меня тот же вопрос мучает.
 
H

hosm

А ты придира сегодня. Но прав, вот, например, совсем маньячно:
@If((!@IsNewDoc) & (Status = "Draft");"[Office]";"[none]")
и еще надо помнить, что роли "просто так" (без галочки Enforce consistent ACL) на локале не работают.
 
P

prokopulka

А регистр роли не влияет?
+ всегда люблю поставить явно скобки @If((!@IsNewDoc) & Status = "Draft";"[Office]";"[none]")

Добавлено: А после переоткрытия документа не срабатывает?
кстати, если у Вас для секции задано имя поля (Section Field Name), можете посмотреть, чему равно его значение после сохранения документа - так, для проверки правильности отработки формулы.


Регистр и скобки роли не играют (но на всякий случай попробовала по-разному - ничего не изменилось).

После переоткрытия все тоже самое - поле не отображается.
 
H

hosm

А в поле, указанном в Section Field Name что записано при открытом документе? или дизайн скрыт?
 
P

prokopulka

А ты придира сегодня. Но прав, вот, например, совсем маньячно:
@If((!@IsNewDoc) & (Status = "Draft");"[Office]";"[none]")
и еще надо помнить, что роли "просто так" (без галочки Enforce consistent ACL) на локале не работают.

В этом документе у меня еще кнопка (она находится не в секции) должна при тех же условиях появляться после сохранения. В условии Hide Action if formula is true для нее пишу

@IsNewDoc | !Status="Draft" | !@Contains(@UserRoles; "office")

и все работает, как надо. Так что с ролями, думаю, все нормально...
 
H

hosm

вы уверены, что ошибка именно в формуле? ну, чудес обычно не бывает)))
1) посмотрите, что в поле или что говорит диалог "Кто может редактировать данную секцию" (при клике на секцию)? скопируйте точное имя роли, может, где-то русский символ затесался.
2) может, случайно поставили скрытие на рт-поле
3) может, просто секция свернута
 
P

prokopulka

А в поле, указанном в Section Field Name что записано при открытом документе? или дизайн скрыт?

Посмотрите в screen'е (сделан после сохранения документа под ролью Office).
Там стоит "[none]"

Добавлено:
вы уверены, что ошибка именно в формуле? ну, чудес обычно не бывает)))
1) посмотрите, что в поле или что говорит диалог "Кто может редактировать данную секцию" (при клике на секцию)? скопируйте точное имя роли, может, где-то русский символ затесался.
2) может, случайно поставили скрытие на рт-поле
3) может, просто секция свернута

Если проблема не в формуле, я тогда не понимаю, почему, если вообще из условия убрать !@IsNewDoc, то поле для роли Office и статуса документа "Черновик" отображается всегда?
 

Вложения

  • 111.png
    111.png
    3 КБ · Просмотры: 595
H

hosm

проверяйте, где-то что-то не то :)
1) после переоткрытия всё работает.
Field Name: InCard_Access
Data Type: Text List
Data Length: 12 bytes
Seq Num: 1
Dup Item ID: 0
Field Flags: SUMMARY NOUPDATE

"[office]"

2) или кнопка сохранения типа
@Command([FileSave]);
@Command([ViewRefreshFields])
 
P

prokopulka

проверяйте, где-то что-то не то :)
1) после переоткрытия всё работает.
Field Name: InCard_Access
Data Type: Text List
Data Length: 12 bytes
Seq Num: 1
Dup Item ID: 0
Field Flags: SUMMARY NOUPDATE

"[office]"

После переоткрытия-то получается, что нужное поле доступно для "[office]", а вот после сохранения остается "[none]".

2) или кнопка сохранения типа
@Command([FileSave]);
@Command([ViewRefreshFields])

Что-то не пойму, что Вы имеете в виду)) Можно поподробнее, пожалуйста;)
 
N

nvyush

@IsNewDoc | !Status="Draft" | !@Contains(@UserRoles; "office")
Для проверки наличия у пользователя роли следует использовать @IsNotMember("[Office]"; @UserRoles). @Contains проверяет наличие подстроки в строке, соответственно в Вашем варианте будут ложные срабатывания, если в БД помимо "[Office]" есть роли типа "[PostOffice]", "[OfficeManager]" и т.п. Да и работает @IsNotMember быстрее, поскольку при первом же несовпадении заканчивает проверку, а @Contains ищет до конца строки.
Цитата: (OKEN @ 30:06:2010, 00:14 ) *
2) или кнопка сохранения типа
@Command([FileSave]);
@Command([ViewRefreshFields])

Что-то не пойму, что Вы имеете в виду)) Можно поподробнее, пожалуйстаsmile.gif
На кнопке сохранения после команды сохранения добавьте команду обновления документа, может формула не пересчитывается.
 
A

Akupaka

Да и работает @IsNotMember быстрее, поскольку при первом же несовпадении заканчивает проверку
Может при первом же совпадении? ))

prokopulka, рекомендую роли всегда использовать в коде в том же регистре, в котором они заведены в ТУД!
Где-то это не важно, а где-то важно.

Нужно, чтобы это поле становилось доступным для редактирования только для роли Office после того, как документ сохранен и имеет статус "Черновик"("Draft").
Для этого я использую вкладку Access Formula (тип Computed for display) для секции, пишу в ней условие:
@If(!@IsNewDoc & Status = "Draft";"[office]";"[none]")
Затем захожу под пользователем с ролью Office, создаю и сохраняю документ, а данное поле не появляется.
У меня работает, но как и было сказано выше - надо переоткрывать документ, чтобы изменения стали действовать.
 
N

nvyush

Может при первом же совпадении? ))
Я имел ввиду, что функция @IsNotMember(text; textlist) посимвольно сравнивает text с элементами списка textlist и при первом же несовпадении символов считает, что строки не равны. @Contains же проверяет "до упора".
Разумеется, если text содержится в textlist при совпадении text и элемента textlist дальнейшая проверка прекращается. @Contains в этом смысле тоже ищет до первого совпадения.
 
P

prokopulka

Для проверки наличия у пользователя роли следует использовать @IsNotMember("[Office]"; @UserRoles). @Contains проверяет наличие подстроки в строке, соответственно в Вашем варианте будут ложные срабатывания, если в БД помимо "[Office]" есть роли типа "[PostOffice]", "[OfficeManager]" и т.п. Да и работает @IsNotMember быстрее, поскольку при первом же несовпадении заканчивает проверку, а @Contains ищет до конца строки.
В условии скрытия для кнопки поменяла !@Contains на @IsNotMember("[office]"; @UserRoles),теперь кнопка не появляется при сохранении. Что может быть не так?

На кнопке сохранения после команды сохранения добавьте команду обновления документа, может формула не пересчитывается.
На кнопке сохранения добавила команду обновления документа, теперь там так:
@Command ([FileSave]);
@Command([RefreshHideFormulas] );
@Command([ViewRefreshFields])

Создаю и сохраняю документ под ролью office, теперь в свойствах документа для данной секции написано, что доступ для "[office]", но поле все равно не появляется:)

Добавлено: Добавлено:
prokopulka, рекомендую роли всегда использовать в коде в том же регистре, в котором они заведены в ТУД!
Где-то это не важно, а где-то важно.
Да я так обычно и делаю, просто уже и так и сяк пробовала, на всякий случай...))
У меня работает, но как и было сказано выше - надо переоткрывать документ, чтобы изменения стали действовать.
Так-то у меня тоже работает, но проблема в том, что изменения должны появляться сразу после сохранения документа.
 
N

nvyush

В условии скрытия для кнопки поменяла !@Contains на @IsNotMember("[office]"; @UserRoles),теперь кнопка не появляется при сохранении. Что может быть не так?
Всю формулу "в студию" (с). Да, и как там с регистром, как точно роль записана в ACL?
Создаю и сохраняю документ под ролью office, теперь в свойствах документа для данной секции написано, что доступ для "[office]", но поле все равно не появляется
Попробуйте изменить тип поля на просто текст. Если будет появляться, значить проблема именно в том, что для рт-поля необходимо обязательно переоткрыть документ. Как — ищите в разделе codebase.
 
P

prokopulka

Всю формулу "в студию" (с). Да, и как там с регистром, как точно роль записана в ACL?
В условии Hide Action if formula is true для кнопки:
@IsNewDoc | !Status="Draft" | @IsNotMember("[office]"; @UserRoles)
В ACL роль записана [office] (с маленькой o).

Добавлено:
Попробуйте изменить тип поля на просто текст. Если будет появляться, значить проблема именно в том, что для рт-поля необходимо обязательно переоткрыть документ. Как — ищите в разделе codebase.
Поменяла тип поля на просто text, все равно не появляется.
 
P

prokopulka

@IsNewDoc | !Status="Draft" | @IsNotMember("[office]"; @UserRoles)
В ACL роль записана [office] (с маленькой o).

А, в этом условии с @IsNotMember("[office]"; @UserRoles) для кнопки все работает, я просто забыла O на o в '[office]" обратно поменять)))
Так что остается только вопрос по условию для секции...
 
N

nvyush

prokopulka
@IsNewDoc | !Status="Draft" | @IsNotMember("[office]"; @UserRoles)
Я бы написал @IsNewDoc | Status != "Draft" | @IsNotMember("[office]"; @UserRoles), но не суть важно. А база где — на локале или на сервере? На локале могут быть проблемы.
И попробуйте скопировать роль из ТУД — может быть банальная опечатка (русская о, с или е).
А, в этом условии с @IsNotMember("[office]"; @UserRoles) для кнопки все работает, я просто забыла O на o в '[office]" обратно поменять)))
— внимательней быть надо :), так народу мозги вывихнуть можно :).

Добавлено:
Так что остается только вопрос по условию для секции...
Добавьте на форму cfd поле с формулой из секции, чтоб контролировать, что там в каком случае вычисляется.
 
A

Akupaka

Так-то у меня тоже работает, но проблема в том, что изменения должны появляться сразу после сохранения документа.
Ну и? В чем вопрос?
Вариант 1: https://codeby.net/threads/33206.html
Если не сработает, не подойдет, то вариант 2: https://codeby.net/threads/29669.html

nvy
А у тебя без переоткрытия срабатывает изменение прав доступа к секции? :)

Добавлено: У меня и первый формыльный вариант срабатывает!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!