src/Pure/General/secure.ML
author wenzelm
Wed, 21 Jan 2009 23:21:44 +0100
changeset 29606 fedb8be05f24
parent 28268 ac8431ecd57e
child 30625 d53d1a16d5ee
permissions -rw-r--r--
removed Ids;
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;