src/Pure/General/secure.ML
author blanchet
Tue, 17 Feb 2009 14:01:54 +0100
changeset 29956 62f931b257b7
parent 29606 fedb8be05f24
child 30625 d53d1a16d5ee
permissions -rw-r--r--
Reintroduce set_interpreter for Collect and op :. I removed them by accident when removing old code that dealt with the "set" type. Incidentally, there is still some broken "set" code in Refute that should be fixed (see TODO in refute.ML).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/General/secure.ML
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
     3
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
     4
Secure critical operations.
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
     5
*)
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
     6
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
     7
signature SECURE =
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
     8
sig
20977
dbf1eca9b34e tuned signature;
wenzelm
parents: 20925
diff changeset
     9
  val set_secure: unit -> unit
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    10
  val is_secure: unit -> bool
26080
d920e4c8ba82 export deny_secure;
wenzelm
parents: 25753
diff changeset
    11
  val deny_secure: string -> unit
28268
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    12
  val use_text: ML_NameSpace.nameSpace -> int * string ->
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    13
    (string -> unit) * (string -> 'a) -> bool -> string -> unit
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    14
  val use_file: ML_NameSpace.nameSpace ->
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    15
    (string -> unit) * (string -> 'a) -> bool -> string -> unit
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    16
  val use: string -> unit
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    17
  val commit: unit -> unit
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents: 26080
diff changeset
    18
  val system_out: string -> string * int
20992
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    19
  val system: string -> int
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    20
end;
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    21
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    22
structure Secure: SECURE =
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    23
struct
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    24
20992
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    25
(** secure flag **)
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    26
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    27
val secure = ref false;
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    28
20977
dbf1eca9b34e tuned signature;
wenzelm
parents: 20925
diff changeset
    29
fun set_secure () = secure := true;
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    30
fun is_secure () = ! secure;
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    31
22567
1565d476a9e2 removed assert/deny (avoid clash with Alice keywords and confusion due to strict evaluation);
wenzelm
parents: 22144
diff changeset
    32
fun deny_secure msg = if is_secure () then error msg else ();
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    33
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    34
25753
99c9fc5e11f2 tuned spaces;
wenzelm
parents: 25703
diff changeset
    35
20992
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    36
(** critical operations **)
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    37
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    38
(* ML evaluation *)
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    39
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    40
fun secure_mltext () = deny_secure "Cannot evaluate ML source in secure mode";
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    41
28268
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    42
fun raw_use_text ns = use_text ML_Parse.fix_ints (Position.str_of oo Position.line_file) ns;
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    43
fun raw_use_file ns = use_file ML_Parse.fix_ints (Position.str_of oo Position.line_file) ns;
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    44
28268
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    45
fun use_text ns pos pr verbose txt =
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    46
  (secure_mltext (); raw_use_text ns pos pr verbose txt);
23922
707639e9497d marked some CRITICAL sections (for multithreading);
wenzelm
parents: 22567
diff changeset
    47
28268
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    48
fun use_file ns pr verbose name =
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    49
  (secure_mltext (); raw_use_file ns pr verbose name);
23922
707639e9497d marked some CRITICAL sections (for multithreading);
wenzelm
parents: 22567
diff changeset
    50
28268
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    51
fun use name = use_file ML_NameSpace.global Output.ml_output true name;
23978
6e8d5a05ffe8 added use_noncritical;
wenzelm
parents: 23922
diff changeset
    52
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    53
(*commit is dynamically bound!*)
28268
ac8431ecd57e use_text/use_file now depend on explicit ML name space;
wenzelm
parents: 26883
diff changeset
    54
fun commit () = raw_use_text ML_NameSpace.global (0, "") Output.ml_output false "commit();";
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    55
20992
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    56
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    57
(* shell commands *)
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    58
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    59
fun secure_shell () = deny_secure "Cannot execute shell commands in secure mode";
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    60
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents: 26080
diff changeset
    61
val orig_system_out = system_out;
20992
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    62
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents: 26080
diff changeset
    63
fun system_out s = (secure_shell (); orig_system_out s);
26332
aa54cd3ddc9f system: writeln output, if available;
wenzelm
parents: 26220
diff changeset
    64
aa54cd3ddc9f system: writeln output, if available;
wenzelm
parents: 26220
diff changeset
    65
fun system s =
aa54cd3ddc9f system: writeln output, if available;
wenzelm
parents: 26220
diff changeset
    66
  (case system_out s of
aa54cd3ddc9f system: writeln output, if available;
wenzelm
parents: 26220
diff changeset
    67
    ("", rc) => rc
aa54cd3ddc9f system: writeln output, if available;
wenzelm
parents: 26220
diff changeset
    68
  | (out, rc) => (writeln (perhaps (try (unsuffix "\n")) out); rc));
20992
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    69
20925
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    70
end;
2d19e511fe2c Secure critical operations.
wenzelm
parents:
diff changeset
    71
23978
6e8d5a05ffe8 added use_noncritical;
wenzelm
parents: 23922
diff changeset
    72
(*override previous toplevel bindings!*)
21770
ea6f846d8c4b added use_file;
wenzelm
parents: 20992
diff changeset
    73
val use_text = Secure.use_text;
ea6f846d8c4b added use_file;
wenzelm
parents: 20992
diff changeset
    74
val use_file = Secure.use_file;
24663
015a8838e656 improved error behaviour of use (bootstrap version);
wenzelm
parents: 24600
diff changeset
    75
fun use s = Secure.use s handle ERROR msg => (writeln msg; raise Fail "ML error");
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents: 26080
diff changeset
    76
val system_out = Secure.system_out;
20992
05c3703cc6c5 added execute/system;
wenzelm
parents: 20977
diff changeset
    77
val system = Secure.system;