# No permission to declare safe\_goal?

**URL:** <https://swi-prolog.discourse.group/t/no-permission-to-declare-safe-goal/721>\
**Category:** Help!\
**Created:** [May 24, 2019, 10:24am UTC](https://swi-prolog.discourse.group/t/no-permission-to-declare-safe-goal/721 "2019-05-24T10:24:11Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![PaulBrownMagic](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/paulbrownmagic/32/211_2.png) [@PaulBrownMagic](https://swi-prolog.discourse.group/u/PaulBrownMagic)\
**Post date:** [May 24, 2019, 10:24am UTC](https://swi-prolog.discourse.group/t/no-permission-to-declare-safe-goal/721/1 "2019-05-24T10:24:11Z")

</div>

I’m using: SWI-Prolog version 8.1.2 and adding an app to the [Prolog Engine application server, current master branch](https://github.com/SWI-Prolog/pengines).

I am using library(persistency) on a pengine, so I’m calling `with_mutex/2`, which is an unsafe predicate. I want to declare the predicate that calls `with_mutex/2` as safe and am following the [rdf example in the docs](http://www.swi-prolog.org/pldoc/man?section=pengine-overview).

But what I’m getting is:  
**ERROR:** No permission to declare safe\_goal `projects\_manager:get\_project/1’

My code looks like this:

**apps/my\_app/app.pl**

```prolog
:- module(my_app, []).

:- prolog_load_context(directory, Dir),
   asserta(user:file_search_path(my_app, Dir)).

:- use_module(library(pengines)).
:- pengine_application(my_app).
:- use_module(my_app:projects).

:- use_module(pengine_sandbox:my_app(projects_manager/projects_manager)).
:- use_module(library(sandbox)).
:- multifile sandbox:safe_primitive/1.

sandbox:safe_primitive(projects_manager:get_project/1).

```

**apps/my\_app/projects.pl**

```prolog
:- module(projects, []).

:- reexport(my_app(projects_manager/projects_manager)).

```

**apps/my\_app/projects\_manager/projects\_manager.pl**

```prolog
:- module(projects_manager,
    [ get_project/1
    , set_project/1
   %, ... etc.
    ]
).

:- use_module(library(persistency)).
:- persistent project(id:atom, project:any).

get_project(Project) :-
    user_project_id(ID), % from another module, not causing issues
    with_mutex(projects_mutex, project(ID, Project)).

```

---

<div class="post-metadata">

**Author:** ![jan](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/jan/32/4_2.png) [@jan](https://swi-prolog.discourse.group/u/jan)\
**Post date:** [May 24, 2019, 11:26am UTC](https://swi-prolog.discourse.group/t/no-permission-to-declare-safe-goal/721/2 "2019-05-24T11:26:49Z")

</div>

One possible reason is that the predicate is not yet defined. safe\_primitive/1 can only be used on defined predicates that are not meta predicates. That is a safety measure to avoid clearly wrong safe declarations. So, you may have to change the declaration order. I normally put sandbox declarations at the bottom of the file in which the safe predicates are defined. Note that if you do not use sandboxing this has no consequences except for one unused clause.

---

<div class="post-metadata">

**Author:** ![PaulBrownMagic](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/paulbrownmagic/32/211_2.png) [@PaulBrownMagic](https://swi-prolog.discourse.group/u/PaulBrownMagic)\
**Post date:** [May 24, 2019, 11:59am UTC](https://swi-prolog.discourse.group/t/no-permission-to-declare-safe-goal/721/3 "2019-05-24T11:59:41Z")

</div>

Thank’s Jan, I tried that, still the same error. I’ve also tried jiggling around when the persistent db file is attached, but that doesn’t seem to help either.

My code **now** looks like this:

**apps/my\_app/app.pl**

```prolog
:- module(my_app, []).

:- prolog_load_context(directory, Dir),
   asserta(user:file_search_path(my_app, Dir)).

:- use_module(library(pengines)).
:- pengine_application(my_app).
:- use_module(my_app:projects).

```

**apps/my\_app/projects.pl**

```prolog
:- module(projects, []).

:- reexport(my_app(projects_manager/projects_manager)).

```

**apps/my\_app/projects\_manager/projects\_manager.pl**

```prolog
:- module(projects_manager,
    [ get_project/1
    , set_project/1
   %, ... etc.
    ]
).

:- use_module(library(persistency)).
:- persistent project(id:atom, project:any).

get_project(Project) :-
    user_project_id(ID), % from another module, not causing issues
    with_mutex(projects_mutex, project(ID, Project)).

:- use_module(pengine_sandbox:projects_manager).
:- use_module(library(sandbox)).
:- multifile sandbox:safe_primitive/1.

sandbox:safe_primitive(projects_manager:get_project/1).

```

---

<div class="post-metadata">

**Author:** ![jan](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/jan/32/4_2.png) [@jan](https://swi-prolog.discourse.group/u/jan)\
**Post date:** [May 24, 2019, 1:00pm UTC](https://swi-prolog.discourse.group/t/no-permission-to-declare-safe-goal/721/4 "2019-05-24T13:00:21Z")

</div>

> [@PaulBrownMagic](#):
>
> sandbox:safe\_primitive(projects\_manager:get\_project/1).

The argument is a goal, not a predicate indicator. This allows you to verify the safety of the arguments.

---

<div class="post-metadata">

**Author:** ![PaulBrownMagic](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/paulbrownmagic/32/211_2.png) [@PaulBrownMagic](https://swi-prolog.discourse.group/u/PaulBrownMagic)\
**Post date:** [May 24, 2019, 1:05pm UTC](https://swi-prolog.discourse.group/t/no-permission-to-declare-safe-goal/721/5 "2019-05-24T13:05:14Z")

</div>

Ah-Ha! Thank you Jan! Can’t believe I didn’t see that… All working beautifully now.
