コード例 #1
0
ファイル: filenode.py プロジェクト: tahoe-lafs/tahoe-lafs
 def replace_me_with_a_child(self, req, client, replace):
     # a new file is being uploaded in our place.
     file_format = get_format(req, "CHK")
     mutable_type = get_mutable_type(file_format)
     if mutable_type is not None:
         data = MutableFileHandle(req.content)
         d = client.create_mutable_file(data, version=mutable_type)
         def _uploaded(newnode):
             d2 = self.parentnode.set_node(self.name, newnode,
                                           overwrite=replace)
             d2.addCallback(lambda res: newnode)
             return d2
         d.addCallback(_uploaded)
     else:
         assert file_format == "CHK"
         uploadable = FileHandle(req.content, convergence=client.convergence)
         d = self.parentnode.add_file(self.name, uploadable,
                                      overwrite=replace)
     def _done(filenode):
         log.msg("webish upload complete",
                 facility="tahoe.webish", level=log.NOISY, umid="TCjBGQ")
         if self.node:
             # we've replaced an existing file (or modified a mutable
             # file), so the response code is 200
             req.setResponseCode(http.OK)
         else:
             # we've created a new file, so the code is 201
             req.setResponseCode(http.CREATED)
         return filenode.get_uri()
     d.addCallback(_done)
     return d
コード例 #2
0
ファイル: unlinked.py プロジェクト: GunioRobot/tahoe-lafs
def POSTUnlinkedCreateDirectory(req, client):
    # "POST /uri?t=mkdir", to create an unlinked directory.
    ct = req.getHeader("content-type") or ""
    if not ct.startswith("multipart/form-data"):
        # guard against accidental attempts to call t=mkdir as if it were
        # t=mkdir-with-children, but make sure we tolerate the usual HTML
        # create-directory form (in which the t=mkdir and redirect_to_result=
        # and other arguments can be passed encoded as multipath/form-data,
        # in the request body).
        req.content.seek(0)
        kids_json = req.content.read()
        if kids_json:
            raise WebError("t=mkdir does not accept children=, "
                           "try t=mkdir-with-children instead",
                           http.BAD_REQUEST)
    file_format = get_format(req, None)
    if file_format == "CHK":
        raise WebError("format=CHK not currently accepted for POST /uri?t=mkdir",
                       http.BAD_REQUEST)
    mt = None
    if file_format:
        mt = get_mutable_type(file_format)
    d = client.create_dirnode(version=mt)
    redirect = get_arg(req, "redirect_to_result", "false")
    if boolean_of_arg(redirect):
        def _then_redir(res):
            new_url = "uri/" + urllib.quote(res.get_uri())
            req.setResponseCode(http.SEE_OTHER) # 303
            req.setHeader('location', new_url)
            req.finish()
            return ''
        d.addCallback(_then_redir)
    else:
        d.addCallback(lambda dirnode: dirnode.get_uri())
    return d
コード例 #3
0
ファイル: root.py プロジェクト: sumonst21/tahoe-lafs
 def render_POST(self, req):
     """
     "POST /uri?t=upload&file=newfile" to upload an
     unlinked file or "POST /uri?t=mkdir" to create a
     new directory
     """
     t = get_arg(req, "t", "").strip()
     if t in ("", "upload"):
         file_format = get_format(req)
         mutable_type = get_mutable_type(file_format)
         if mutable_type is not None:
             return unlinked.POSTUnlinkedSSK(req, self.client, mutable_type)
         else:
             return unlinked.POSTUnlinkedCHK(req, self.client)
     if t == "mkdir":
         return unlinked.POSTUnlinkedCreateDirectory(req, self.client)
     elif t == "mkdir-with-children":
         return unlinked.POSTUnlinkedCreateDirectoryWithChildren(req,
                                                                 self.client)
     elif t == "mkdir-immutable":
         return unlinked.POSTUnlinkedCreateImmutableDirectory(req,
                                                              self.client)
     errmsg = ("/uri accepts only PUT, PUT?t=mkdir, POST?t=upload, "
               "and POST?t=mkdir")
     raise WebError(errmsg, http.BAD_REQUEST)
コード例 #4
0
 def replace_me_with_a_child(self, req, client, replace):
     # a new file is being uploaded in our place.
     file_format = get_format(req, "CHK")
     mutable_type = get_mutable_type(file_format)
     if mutable_type is not None:
         data = MutableFileHandle(req.content)
         d = client.create_mutable_file(data, version=mutable_type)
         def _uploaded(newnode):
             d2 = self.parentnode.set_node(self.name, newnode,
                                           overwrite=replace)
             d2.addCallback(lambda res: newnode)
             return d2
         d.addCallback(_uploaded)
     else:
         assert file_format == "CHK"
         uploadable = FileHandle(req.content, convergence=client.convergence)
         d = self.parentnode.add_file(self.name, uploadable,
                                      overwrite=replace)
     def _done(filenode):
         log.msg("webish upload complete",
                 facility="tahoe.webish", level=log.NOISY, umid="TCjBGQ")
         if self.node:
             # we've replaced an existing file (or modified a mutable
             # file), so the response code is 200
             req.setResponseCode(http.OK)
         else:
             # we've created a new file, so the code is 201
             req.setResponseCode(http.CREATED)
         return filenode.get_uri()
     d.addCallback(_done)
     return d
コード例 #5
0
ファイル: directory.py プロジェクト: tahoe-lafs/tahoe-lafs
    def got_child(self, node_or_failure, ctx, name):
        req = IRequest(ctx)
        method = req.method
        nonterminal = len(req.postpath) > 1
        t = get_arg(req, "t", "").strip()
        if isinstance(node_or_failure, Failure):
            f = node_or_failure
            f.trap(NoSuchChildError)
            # No child by this name. What should we do about it?
            if nonterminal:
                if should_create_intermediate_directories(req):
                    # create intermediate directories
                    d = self.node.create_subdirectory(name)
                    d.addCallback(make_handler_for,
                                  self.client, self.node, name)
                    return d
            else:
                # terminal node
                if (method,t) in [ ("POST","mkdir"), ("PUT","mkdir"),
                                   ("POST", "mkdir-with-children"),
                                   ("POST", "mkdir-immutable") ]:
                    # final directory
                    kids = {}
                    if t in ("mkdir-with-children", "mkdir-immutable"):
                        req.content.seek(0)
                        kids_json = req.content.read()
                        kids = convert_children_json(self.client.nodemaker,
                                                     kids_json)
                    file_format = get_format(req, None)
                    mutable = True
                    mt = get_mutable_type(file_format)
                    if t == "mkdir-immutable":
                        mutable = False

                    d = self.node.create_subdirectory(name, kids,
                                                      mutable=mutable,
                                                      mutable_version=mt)
                    d.addCallback(make_handler_for,
                                  self.client, self.node, name)
                    return d
                if (method,t) in ( ("PUT",""), ("PUT","uri"), ):
                    # we were trying to find the leaf filenode (to put a new
                    # file in its place), and it didn't exist. That's ok,
                    # since that's the leaf node that we're about to create.
                    # We make a dummy one, which will respond to the PUT
                    # request by replacing itself.
                    return PlaceHolderNodeHandler(self.client, self.node, name)
            # otherwise, we just return a no-such-child error
            return f

        node = node_or_failure
        if nonterminal and should_create_intermediate_directories(req):
            if not IDirectoryNode.providedBy(node):
                # we would have put a new directory here, but there was a
                # file in the way.
                raise WebError("Unable to create directory '%s': "
                               "a file was in the way" % name,
                               http.CONFLICT)
        return make_handler_for(node, self.client, self.node, name)
コード例 #6
0
ファイル: unlinked.py プロジェクト: GunioRobot/tahoe-lafs
def PUTUnlinkedCreateDirectory(req, client):
    # "PUT /uri?t=mkdir", to create an unlinked directory.
    file_format = get_format(req, None)
    if file_format == "CHK":
        raise WebError("format=CHK not accepted for PUT /uri?t=mkdir",
                       http.BAD_REQUEST)
    mt = None
    if file_format:
        mt = get_mutable_type(file_format)
    d = client.create_dirnode(version=mt)
    d.addCallback(lambda dirnode: dirnode.get_uri())
    # XXX add redirect_to_result
    return d
コード例 #7
0
def PUTUnlinkedCreateDirectory(req, client):
    # "PUT /uri?t=mkdir", to create an unlinked directory.
    file_format = get_format(req, None)
    if file_format == "CHK":
        raise WebError("format=CHK not accepted for PUT /uri?t=mkdir",
                       http.BAD_REQUEST)
    mt = None
    if file_format:
        mt = get_mutable_type(file_format)
    d = client.create_dirnode(version=mt)
    d.addCallback(lambda dirnode: dirnode.get_uri())
    # XXX add redirect_to_result
    return d
コード例 #8
0
 def _POST_mkdir(self, req):
     name = get_arg(req, "name", "")
     if not name:
         # our job is done, it was handled by the code in got_child
         # which created the final directory (i.e. us)
         return defer.succeed(self.node.get_uri()) # TODO: urlencode
     name = name.decode("utf-8")
     replace = boolean_of_arg(get_arg(req, "replace", "true"))
     kids = {}
     mt = get_mutable_type(get_format(req, None))
     d = self.node.create_subdirectory(name, kids, overwrite=replace,
                                       mutable_version=mt)
     d.addCallback(lambda child: child.get_uri()) # TODO: urlencode
     return d
コード例 #9
0
 def _POST_mkdir(self, req):
     name = get_arg(req, "name", "")
     if not name:
         # our job is done, it was handled by the code in got_child
         # which created the final directory (i.e. us)
         return defer.succeed(self.node.get_uri()) # TODO: urlencode
     name = name.decode("utf-8")
     replace = boolean_of_arg(get_arg(req, "replace", "true"))
     kids = {}
     mt = get_mutable_type(get_format(req, None))
     d = self.node.create_subdirectory(name, kids, overwrite=replace,
                                       mutable_version=mt)
     d.addCallback(lambda child: child.get_uri()) # TODO: urlencode
     return d
コード例 #10
0
ファイル: root.py プロジェクト: bhyvex/tahoe-lafs
 def render_PUT(self, ctx):
     req = IRequest(ctx)
     # either "PUT /uri" to create an unlinked file, or
     # "PUT /uri?t=mkdir" to create an unlinked directory
     t = get_arg(req, "t", "").strip()
     if t == "":
         file_format = get_format(req, "CHK")
         mutable_type = get_mutable_type(file_format)
         if mutable_type is not None:
             return unlinked.PUTUnlinkedSSK(req, self.client, mutable_type)
         else:
             return unlinked.PUTUnlinkedCHK(req, self.client)
     if t == "mkdir":
         return unlinked.PUTUnlinkedCreateDirectory(req, self.client)
     errmsg = ("/uri accepts only PUT, PUT?t=mkdir, POST?t=upload, "
               "and POST?t=mkdir")
     raise WebError(errmsg, http.BAD_REQUEST)
コード例 #11
0
ファイル: root.py プロジェクト: warner/tahoe-lafs
 def render_PUT(self, ctx):
     req = IRequest(ctx)
     # either "PUT /uri" to create an unlinked file, or
     # "PUT /uri?t=mkdir" to create an unlinked directory
     t = get_arg(req, "t", "").strip()
     if t == "":
         file_format = get_format(req, "CHK")
         mutable_type = get_mutable_type(file_format)
         if mutable_type is not None:
             return unlinked.PUTUnlinkedSSK(req, self.client, mutable_type)
         else:
             return unlinked.PUTUnlinkedCHK(req, self.client)
     if t == "mkdir":
         return unlinked.PUTUnlinkedCreateDirectory(req, self.client)
     errmsg = ("/uri accepts only PUT, PUT?t=mkdir, POST?t=upload, "
               "and POST?t=mkdir")
     raise WebError(errmsg, http.BAD_REQUEST)
コード例 #12
0
 def _POST_mkdir_with_children(self, req):
     name = get_arg(req, "name", "")
     if not name:
         # our job is done, it was handled by the code in got_child
         # which created the final directory (i.e. us)
         return defer.succeed(self.node.get_uri()) # TODO: urlencode
     name = name.decode("utf-8")
     # TODO: decide on replace= behavior, see #903
     #replace = boolean_of_arg(get_arg(req, "replace", "false"))
     req.content.seek(0)
     kids_json = req.content.read()
     kids = convert_children_json(self.client.nodemaker, kids_json)
     mt = get_mutable_type(get_format(req, None))
     d = self.node.create_subdirectory(name, kids, overwrite=False,
                                       mutable_version=mt)
     d.addCallback(lambda child: child.get_uri()) # TODO: urlencode
     return d
コード例 #13
0
 def _POST_mkdir_with_children(self, req):
     name = get_arg(req, "name", "")
     if not name:
         # our job is done, it was handled by the code in got_child
         # which created the final directory (i.e. us)
         return defer.succeed(self.node.get_uri()) # TODO: urlencode
     name = name.decode("utf-8")
     # TODO: decide on replace= behavior, see #903
     #replace = boolean_of_arg(get_arg(req, "replace", "false"))
     req.content.seek(0)
     kids_json = req.content.read()
     kids = convert_children_json(self.client.nodemaker, kids_json)
     mt = get_mutable_type(get_format(req, None))
     d = self.node.create_subdirectory(name, kids, overwrite=False,
                                       mutable_version=mt)
     d.addCallback(lambda child: child.get_uri()) # TODO: urlencode
     return d
コード例 #14
0
ファイル: filenode.py プロジェクト: tahoe-lafs/tahoe-lafs
    def replace_me_with_a_formpost(self, req, client, replace):
        # create a new file, maybe mutable, maybe immutable
        file_format = get_format(req, "CHK")
        contents = req.fields["file"]
        if file_format in ("SDMF", "MDMF"):
            mutable_type = get_mutable_type(file_format)
            uploadable = MutableFileHandle(contents.file)
            d = client.create_mutable_file(uploadable, version=mutable_type)
            def _uploaded(newnode):
                d2 = self.parentnode.set_node(self.name, newnode,
                                              overwrite=replace)
                d2.addCallback(lambda res: newnode.get_uri())
                return d2
            d.addCallback(_uploaded)
            return d

        uploadable = FileHandle(contents.file, convergence=client.convergence)
        d = self.parentnode.add_file(self.name, uploadable, overwrite=replace)
        d.addCallback(lambda newnode: newnode.get_uri())
        return d
コード例 #15
0
    def replace_me_with_a_formpost(self, req, client, replace):
        # create a new file, maybe mutable, maybe immutable
        file_format = get_format(req, "CHK")
        contents = req.fields["file"]
        if file_format in ("SDMF", "MDMF"):
            mutable_type = get_mutable_type(file_format)
            uploadable = MutableFileHandle(contents.file)
            d = client.create_mutable_file(uploadable, version=mutable_type)
            def _uploaded(newnode):
                d2 = self.parentnode.set_node(self.name, newnode,
                                              overwrite=replace)
                d2.addCallback(lambda res: newnode.get_uri())
                return d2
            d.addCallback(_uploaded)
            return d

        uploadable = FileHandle(contents.file, convergence=client.convergence)
        d = self.parentnode.add_file(self.name, uploadable, overwrite=replace)
        d.addCallback(lambda newnode: newnode.get_uri())
        return d
コード例 #16
0
def POSTUnlinkedCreateDirectory(req, client):
    # "POST /uri?t=mkdir", to create an unlinked directory.
    ct = req.getHeader("content-type") or ""
    if not ct.startswith("multipart/form-data"):
        # guard against accidental attempts to call t=mkdir as if it were
        # t=mkdir-with-children, but make sure we tolerate the usual HTML
        # create-directory form (in which the t=mkdir and redirect_to_result=
        # and other arguments can be passed encoded as multipath/form-data,
        # in the request body).
        req.content.seek(0)
        kids_json = req.content.read()
        if kids_json:
            raise WebError(
                "t=mkdir does not accept children=, "
                "try t=mkdir-with-children instead", http.BAD_REQUEST)
    file_format = get_format(req, None)
    if file_format == "CHK":
        raise WebError(
            "format=CHK not currently accepted for POST /uri?t=mkdir",
            http.BAD_REQUEST)
    mt = None
    if file_format:
        mt = get_mutable_type(file_format)
    d = client.create_dirnode(version=mt)
    redirect = get_arg(req, "redirect_to_result", "false")
    if boolean_of_arg(redirect):

        def _then_redir(res):
            new_url = "uri/" + urllib.quote(res.get_uri())
            req.setResponseCode(http.SEE_OTHER)  # 303
            req.setHeader('location', new_url)
            req.finish()
            return ''

        d.addCallback(_then_redir)
    else:
        d.addCallback(lambda dirnode: dirnode.get_uri())
    return d
コード例 #17
0
ファイル: root.py プロジェクト: warner/tahoe-lafs
 def render_POST(self, ctx):
     # "POST /uri?t=upload&file=newfile" to upload an
     # unlinked file or "POST /uri?t=mkdir" to create a
     # new directory
     req = IRequest(ctx)
     t = get_arg(req, "t", "").strip()
     if t in ("", "upload"):
         file_format = get_format(req)
         mutable_type = get_mutable_type(file_format)
         if mutable_type is not None:
             return unlinked.POSTUnlinkedSSK(req, self.client, mutable_type)
         else:
             return unlinked.POSTUnlinkedCHK(req, self.client)
     if t == "mkdir":
         return unlinked.POSTUnlinkedCreateDirectory(req, self.client)
     elif t == "mkdir-with-children":
         return unlinked.POSTUnlinkedCreateDirectoryWithChildren(req,
                                                                 self.client)
     elif t == "mkdir-immutable":
         return unlinked.POSTUnlinkedCreateImmutableDirectory(req,
                                                              self.client)
     errmsg = ("/uri accepts only PUT, PUT?t=mkdir, POST?t=upload, "
               "and POST?t=mkdir")
     raise WebError(errmsg, http.BAD_REQUEST)
コード例 #18
0
    def got_child(self, node_or_failure, ctx, name):
        DEBUG = False
        if DEBUG: print "GOT_CHILD", name, node_or_failure
        req = IRequest(ctx)
        method = req.method
        nonterminal = len(req.postpath) > 1
        t = get_arg(req, "t", "").strip()
        if isinstance(node_or_failure, Failure):
            f = node_or_failure
            f.trap(NoSuchChildError)
            # No child by this name. What should we do about it?
            if DEBUG: print "no child", name
            if DEBUG: print "postpath", req.postpath
            if nonterminal:
                if DEBUG: print " intermediate"
                if should_create_intermediate_directories(req):
                    # create intermediate directories
                    if DEBUG: print " making intermediate directory"
                    d = self.node.create_subdirectory(name)
                    d.addCallback(make_handler_for,
                                  self.client, self.node, name)
                    return d
            else:
                if DEBUG: print " terminal"
                # terminal node
                if (method,t) in [ ("POST","mkdir"), ("PUT","mkdir"),
                                   ("POST", "mkdir-with-children"),
                                   ("POST", "mkdir-immutable") ]:
                    if DEBUG: print " making final directory"
                    # final directory
                    kids = {}
                    if t in ("mkdir-with-children", "mkdir-immutable"):
                        req.content.seek(0)
                        kids_json = req.content.read()
                        kids = convert_children_json(self.client.nodemaker,
                                                     kids_json)
                    file_format = get_format(req, None)
                    mutable = True
                    mt = get_mutable_type(file_format)
                    if t == "mkdir-immutable":
                        mutable = False

                    d = self.node.create_subdirectory(name, kids,
                                                      mutable=mutable,
                                                      mutable_version=mt)
                    d.addCallback(make_handler_for,
                                  self.client, self.node, name)
                    return d
                if (method,t) in ( ("PUT",""), ("PUT","uri"), ):
                    if DEBUG: print " PUT, making leaf placeholder"
                    # we were trying to find the leaf filenode (to put a new
                    # file in its place), and it didn't exist. That's ok,
                    # since that's the leaf node that we're about to create.
                    # We make a dummy one, which will respond to the PUT
                    # request by replacing itself.
                    return PlaceHolderNodeHandler(self.client, self.node, name)
            if DEBUG: print " 404"
            # otherwise, we just return a no-such-child error
            return f

        node = node_or_failure
        if nonterminal and should_create_intermediate_directories(req):
            if not IDirectoryNode.providedBy(node):
                # we would have put a new directory here, but there was a
                # file in the way.
                if DEBUG: print "blocking"
                raise WebError("Unable to create directory '%s': "
                               "a file was in the way" % name,
                               http.CONFLICT)
        if DEBUG: print "good child"
        return make_handler_for(node, self.client, self.node, name)