Client VoStore VoSpace
|
| DIME put
\------------------------------\
[Auth : x509 cn=user.. ] |
[Data : .............. ] |
|
File
*[File : ivo://vostore/.. ]*
*[Owner : x509 cn=user.. ]*
*[Data : ................ ]*
*[Size : xxxx ]*
This makes it easy for a client to send data to the VoStore?.
However, because the data is included with the control message, it is difficult to redirect
the messages via a VoSpace? layer service.
If we want the new data to appear in the users VoSpace? tree, then we need to tell
the VoSpace? service about the data.
The simplest implementation would be to send the put message to the user's
VoSpace? service.
The VoSpace? service creates the corresponding metadata node, and then forwards the
message on to the relevant VoStore? service.
Client VoStore VoSpace
|
| DIME put
\----------------------------------------------------------------\
[Auth : x509 cn=user ] |
[Path : /home/path/file ] |
[Data : ............... ] |
|
Node
*[Node : ivo://vospace/.. ]*
*[Path : /home/path/file ]*
|
DIME put |
/---------------------------------/
| [Auth : x509 cn=vospace ]
| [Data : ............... ]
|
File
*[File : ivo://vostore/.. ]*
*[Owner : x509 cn=vospace ]*
*[Data : ................ ]*
*[Size : xxxx ]*
|
\---------------------------------\
|
Node
[Node : ivo://vospace/.. ]
[Path : /home/path/file ]
*[File : ivo://vostore/.. ]*
However, this means that all of the data is sent through the VoSpace? service.
If one VoSpace? service is acting as a manager for a large number of VoStore? service,
then this will place a heavy load on the VoSpace? service.
Client VoStore VoSpace
|
| importInit
\------------------------------\
[Auth : x509 cn=user.. ] |
[Protocol : http.put ] |
|
File
*[File : ivo://vostore/.. ]*
*[Owner : x509 cn=user ]*
|
/------------------------------/
| [File : ivo://vostore/.. ]
| [URL : http://vostore/.. ]
The VoStore? service replies with a URL that the client can send the data to.
The client can then transfer the data using the URL supplied by the VoStore? service.
Client VoStore VoSpace
|
| importInit
\------------------------------\
[Auth : x509 cn=user.. ] |
[Protocol : http.put ] |
|
File
*[File : ivo://vostore/.. ]*
*[Owner : x509 cn=user ]*
|
/------------------------------/
| [File : ivo://vostore/.. ]
| [URL : http://vostore/.. ]
|
| HTTP put
\------------------------------\
[Data : ............... ] |
|
File
[File : ivo://vostore/.. ]
[Owner : x509 cn=user ]
*[Data : ................ ]*
*[Size : xxxx ]*
Using a two stage process to transfer the data means that the control information and data
are transferred in separate messages.
This makes it much easier to integrate the VoStore? service with a VoSpace? metadata layer.
In this system, the client would send the initial request to the VoSpace? service rather than
direct to the VoStore? service.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
[Auth : x509 cn=user ] |
[Path : /home/path/file ] |
[Protocol : http.put ] |
Node
*[Node : ivo://vospace/.. ]*
*[Path : /home/path/file ]*
The VoSpace? service creates the metadata node for the new item, and then calls the VoStore?
service to initiate the transfer.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
[Auth : x509 cn=user ] |
[Path : /home/path/file ] |
[Protocol : http.put ] |
Node
*[Node : ivo://vospace/.. ]*
*[Path : /home/path/file ]*
|
importInit |
/---------------------------------/
| [Auth : x509 cn=vospace ]
| [Protocol : http.put ]
|
File
*[File : ivo://vostore/.. ]*
*[Owner : x509 cn=vospace ]*
The VoStore? service creates a new container for the data and replies with a the file identifier
and a URL to send the data to.
The VoSpace? service makes a note of the file identifier, and then passes the information back the client.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
|
importInit |
/---------------------------------/
|
File
*[File : ivo://vostore/.. ]*
*[Owner : x509 cn=vospace ]*
|
\---------------------------------\
[File : ivo://vostore/.. ] |
[URL : http://vostore/.. ] |
|
Node
[Node : ivo://vospace/.. ]
[Path : /home/path/file ]
*[File : ivo://vostore/.. ]*
|
/----------------------------------------------------------------/
| [File : ivo://vostore/.. ]
| [URL : http://vostore/.. ]
The client can then use the URL to transfer the data directly into the VoStore? service.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
|
|
/----------------------------------------------------------------/
| [File : ivo://vostore/.. ]
| [URL : http://vostore/.. ]
|
| HTTP put
\------------------------------\
[Data : ............... ] |
|
File
[File : ivo://vostore/.. ]
[Owner : x509 cn=user ]
*[Data : ................ ]*
*[Size : xxxx ]*
At this point, the VoSpace? service knows where the data should be, but it does not know if the data has arrived yet.
In order to complete the sequence, the VoStore? service needs to call the VoSpace? service to notify it that
the data has arrived, and update the metadata with things like the data size etc.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
|
|
/----------------------------------------------------------------/
|
| HTTP put
\------------------------------\
|
File
[File : ivo://vostore/.. ]
[Owner : x509 cn=user ]
*[Data : ................ ]*
*[Size : xxxx ]*
|
| ImportDone
\---------------------------------\
[File : ivo://vostore/.. ] |
[Size : xxxx ] |
[MD5 : ################ ] |
|
Node
[Node : ivo://vospace/.. ]
[Path : /home/path/file ]
[File : ivo://vostore/.. ]
*[Size : xxxx ]*
*[MD5 : ################ ]*
The full sequence looks like this.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
[Auth : x509 cn=user ] |
[Path : /home/path/file ] |
[Protocol : http.put ] |
Node
*[Node : ivo://vospace/.. ]*
*[Path : /home/path/file ]*
|
importInit |
/---------------------------------/
| [Auth : x509 cn=vospace ]
| [Protocol : http.put ]
|
File
*[File : ivo://vostore/.. ]*
*[Owner : x509 cn=vospace ]*
|
\---------------------------------\
[File : ivo://vostore/.. ] |
[URL : http://vostore/.. ] |
|
Node
[Node : ivo://vospace/.. ]
[Path : /home/path/file ]
*[File : ivo://vostore/.. ]*
|
/----------------------------------------------------------------/
| [File : ivo://vostore/.. ]
| [URL : http://vostore/.. ]
|
| HTTP put
\------------------------------\
[Data : ............... ] |
|
File
[File : ivo://vostore/.. ]
[Owner : x509 cn=user ]
*[Data : ................ ]*
*[Size : xxxx ]*
|
| ImportDone
\---------------------------------\
[File : ivo://vostore/.. ] |
[Size : xxxx ] |
[MD5 : ################ ] |
|
Node
[Node : ivo://vospace/.. ]
[Path : /home/path/file ]
[File : ivo://vostore/.. ]
*[Size : xxxx ]*
*[MD5 : ################ ]*
This is how the current AstroGrid FileManager? (VoSpace?) and FileStore? (VoStore?) implementations
work.
However, there is an inherent security problem in using HTTP put to transfer the data into the VoStore?.
As yet, we have not found a simple, interoperable, way of adding secure authentication to a standard
HTTP put transfer.
Which means that at the moment, anyone can send data to the URL supplied by the VoStore? service and
overwrite the contents of the container.
importInit() request, it specifies SOAP.DIME
as the transport protocol.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
[Auth : x509 cn=user ] |
[Path : /home/path/file ] |
*[Protocol : soap.dime ]* |
Node
*[Node : ivo://vospace/.. ]*
*[Path : /home/path/file ]*
|
importInit |
/---------------------------------/
| [Auth : x509 cn=vospace ]
| *[Protocol : soap.dime ]*
|
File
*[File : ivo://vostore/.. ]*
*[Owner : x509 cn=vospace ]*
In response, the VoStore? service would reply with the URL of a SOAP webservice that can receive
a DIME put message, which the VoSpace? service passes back to the client.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
|
importInit |
/---------------------------------/
|
\---------------------------------\
[File : ivo://vostore/.. ] |
*[URL : http://vostore/.. ]* |
*[Protocol : soap.dime ]* |
|
/----------------------------------------------------------------/
| [File : ivo://vostore/.. ]
| [URL : http://vostore/.. ]
| [Protocol : soap.dime ]
The client can then use the SOAP endpoint to send the data as a DIME attachment.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
|
/----------------------------------------------------------------/
| [File : ivo://vostore/.. ]
| [URL : http://vostore/.. ]
| [Protocol : soap.dime ]
|
| DIME put
\------------------------------\
[Auth : x509 cn=user ] |
[File : ivo://vostore/.. ] |
[Data : ............... ] |
|
File
[File : ivo://vostore/.. ]
[Owner : x509 cn=vospace ]
*[Data : ................ ]*
*[Size : xxxx ]*
Once the data has been transferred, the VoStore? service needs to call the VoSpace? service
to notify it of the completed transfer and update the VoSpace? metadata.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
|
/----------------------------------------------------------------/
|
| DIME put
\------------------------------\
|
File
[File : ivo://vostore/.. ]
[Owner : x509 cn=vospace ]
*[Data : ................ ]*
*[Size : xxxx ]*
|
| ImportDone
\---------------------------------\
[Auth : x509 cn=vostore ] |
[File : ivo://vostore/.. ] |
[Size : xxxx ] |
[MD5 : ################ ] |
|
Node
[Node : ivo://vospace/.. ]
[Path : /home/path/file ]
[File : ivo://vostore/.. ]
*[Size : xxxx ]*
*[MD5 : ################ ]*
put
and importDone() messages.
The file in the VoStore? service was created by the VoSpace? service, which sets the file ownership to
be the identity of the VoSPace? service. Which is what we want.
However, the DIME put call to send the data is comming direct from the client, and so will be authenticated
with the user's certificate and identity.
In order to allow the user to send the data to the file in the VoStore?, we need to add an additional
field to the importInit() message to enable the VoSpace? service to grant write access
to the user's x509 certificate.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
[Auth : x509 cn=user ] |
[Path : /home/path/file ] |
[Protocol : soap.dime ] |
Node
[Node : ivo://vospace/.. ]
[Path : /home/path/file ]
|
importInit |
/---------------------------------/
| [Auth : x509 cn=vospace ]
| *[Write : x509 cn=user ]*
| [Protocol : soap.dime ]
|
File
[File : ivo://vostore/.. ]
[Owner : x509 cn=vospace ]
*[Write : x509 cn=user ]*
If the VoStore? service allows write access to the specified identity, then the client can
send the data as a DIME attachement, using the user's x509 identity to authenticate the
transfer.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
|
/----------------------------------------------------------------/
|
| DIME put
\------------------------------\
*[Auth : x509 cn=user ]* |
[File : ivo://vostore/.. ] |
[Data : ............... ] |
|
File
[File : ivo://vostore/.. ]
[Owner : x509 cn=vospace ]
*[Write : x509 cn=user ]*
[Data : ................ ]
[Size : xxxx ]
This means adding a slightly more complex permission handling to the VoStore? than was currently intended.
We also have a similar problem with ownership of the VoSpace? metadata node.
The node was originally created by a call from the client, using the user's x509 identity,
so logically, VoSpace? should restrict write access of the node to the user's identity.
However, until we are able to handle delegated proxy certificates, the update call from the VoStore? service
to the VoSpace? service can only be authenticated using the VoStore? service's identity.
Client VoStore VoSpace
|
| DIME put
\------------------------------\
|
File
[File : ivo://vostore/.. ]
[Owner : x509 cn=vospace ]
[Data : ................ ]
[Size : xxxx ]
|
| ImportDone
\---------------------------------\
*[Auth : x509 cn=vostore ]* |
[File : ivo://vostore/.. ] |
[Size : xxxx ] |
[MD5 : ################ ] |
|
Node
[Node : ivo://vospace/.. ]
[Path : /home/path/file ]
[File : ivo://vostore/.. ]
[Size : xxxx ]
[MD5 : ################ ]
In order to enable the VoStore? to update the node status in the VoSpace? service, and still limit
write access to the node to general public, we may need to add an additional field to the node
metadata, listing the other identities that are allowed to update the node e.g. the VoStore? service.
In order to avoid having to make the VoSpace? use a lookup mechanism to find the x509 identity of
the VoStore? service, this information can be passed back in the response to the original
importInit() call from VoSpace? to VoStore?.
Client VoStore VoSpace
|
| importInit
\----------------------------------------------------------------\
|
importInit |
/---------------------------------/
|
\---------------------------------\
[File : ivo://vostore/.. ] |
[URL : http://vostore/.. ] |
[Protocol : soap.dime ] |
*[Store : x509 cn=vostore ]* |
|
Node
*[Owner : x509 cn=user ]*
*[Write : x509 cn=vostore ]*
[Node : ivo://vospace/.. ]
[Path : /home/path/file ]
|
/----------------------------------------------------------------/
|
This would then enable the VoStore? service to authenticate using its own identity when it makes the
importDone() call back to the VoSpace?.
Client VoStore VoSpace
|
| DIME put
\------------------------------\
|
| ImportDone
\---------------------------------\
*[Auth : x509 cn=vostore ]* |
[File : ivo://vostore/.. ] |
[Size : xxxx ] |
[MD5 : ################ ] |
|
Node
[Owner : x509 cn=user ]
*[Write : x509 cn=vostore ]*
[Node : ivo://vospace/.. ]
[Path : /home/path/file ]
[File : ivo://vostore/.. ]
[Size : xxxx ]
[MD5 : ################ ]
importDone() callback from the VoStore? to the VoSpace?
which is called when the data import has completed, then we could possibly use a similar mechanism to update
the VoSpace? service whenever the user modifies the file in the VoStore?.
fileModified() callback in place, this may not be a problem.![]() |
Click here for the AstroGrid Service Web |
This is the AstroGrid Development Wiki |
|