monads, modules, sandboxes
Daniel Crealer
dcrealer@hotmail.com
Mon, 29 Jul 2002 01:31:35 -0400
Warning: pseudo-caml below since I don't know Haskell too well. But in
trying to learn I came across interesting concept of monad, and that is
what inspired the following idea. I would just like to know if anyone
thinks it's interesting and if someone has already developed it.
Inspired by monads, I had the following idea for controlled sandboxing of an
application. I'll give you a very concrete scenario, but maybe it isn't the
most interesting use of idea. I download a program
off the Internet that claims to do some interesting transformation on
my data. But I don't trust the application not to send my secret data
back to the web site. I could achieve this by running the program in a
sandbox that doesn't allow it to send data over the Internet. But maybe the
program has legitimate reasons to send data, e.g., the company charges based
on how much data I transform, so the program wants to periodically send
messages to the web site saying it performed some units of work.
The idea is just that if my data has type t, instead of a program of type t
-> t, the website provides a program of type m -> m written in a monadic
style. Actually m = t, and the bind operation (>>=) is trivial. But it is
run in the sandbox. Here is pseudo-code, where MYDATA is thought of as a
well-known signature of a well-known standard, like JPEG or something, with
standard implementation MyData (though I could change MyData as long as I
think my changes won't break the code I got off the web site) and
DataTransformer is the untrusted code from the web site. In some
applications, probably you could get away with just bind and return, but for
the example I give here, the untrusted code needs a way to find out if the
data is done being transformed. I implement that by providing an is_done
function, but note that this could be a security hole. A safer way might be
to have really_do_100_steps throw an exception when it finishes that would
be caught by bind.
module MyData =
struct
type t = ...
type m = t
let (>>=) mm f = try run_in_sandbox (fun _ -> f mm)
with _ -> failwith "gotcha"
let return x = x
(* functions that only run in the sandbox *)
... things that take t's ...
(* functions that can run outside the sandbox *)
let is_done = ...
... other things that take m's ...
end
module type MYDATA =
sig
type t = ...
type m
val (>>=) : m -> (t -> m) -> m
val return : t -> m
is_done : m -> bool
... other stuff ...
end
module DataTransformer =
struct
let really_do_100_steps x = ...
let do_100_steps x = x >>= (function y ->
return (really_do_100_steps y))
let rec doit x =
bill_customer_for_100_steps ();
let x' = do_100_steps x in
if is_done x' then x' else doit x'
end
_________________________________________________________________
Join the world’s largest e-mail service with MSN Hotmail.
http://www.hotmail.com