From a5a54ac5ca5db6f930d7251ce4acb668eec1c491 Mon Sep 17 00:00:00 2001
From: Zooko O'Whielacronx <zooko@zooko.com>
Date: Tue, 18 Dec 2007 17:44:24 -0700
Subject: [PATCH] remove the DirnodeURI foolscap schema and mv those regexes
 into uri.py We currently do not pass dirnode uris over foolscap.

---
 src/allmydata/interfaces.py    | 24 ------------------------
 src/allmydata/test/test_uri.py | 10 +++++-----
 src/allmydata/uri.py           | 28 ++++++++++++++++++++++------
 3 files changed, 27 insertions(+), 35 deletions(-)

diff --git a/src/allmydata/interfaces.py b/src/allmydata/interfaces.py
index 2a23391e..f8ef5acd 100644
--- a/src/allmydata/interfaces.py
+++ b/src/allmydata/interfaces.py
@@ -14,30 +14,6 @@ FURL = StringConstraint(1000)
 StorageIndex = StringConstraint(16)
 URI = StringConstraint(300) # kind of arbitrary
 
-ZBASE32CHAR = "[ybndrfg8ejkmcpqxot1uwisza345h769]" # excludes l, 0, 2, and v
-ZBASE32CHAR_3bits = "[yoearcwh]"
-ZBASE32CHAR_1bits = "[yo]"
-ZBASE32STR_128bits = "%s{25}%s" % (ZBASE32CHAR, ZBASE32CHAR_3bits)
-ZBASE32STR_256bits = "%s{51}%s" % (ZBASE32CHAR, ZBASE32CHAR_1bits)
-COLON="(:|%3A)"
-
-# Writeable SSK bits
-WSSKBITS= "%s%s%s" % (ZBASE32STR_128bits, COLON, ZBASE32STR_256bits)
-
-# URIs (soon to be renamed "caps") are always allowed to come with a leading
-# "http://127.0.0.1:8123/uri/" that will be ignored.
-OPTIONALHTTPLEAD=r'(https?://(127.0.0.1|localhost):8123/uri/)?'
-
-# Writeable SSK URI
-WSSKURI="^%sURI%sSSK%s%s$" % (OPTIONALHTTPLEAD, COLON, COLON, WSSKBITS)
-
-WriteableSSKFileURI = StringConstraint(300, regexp=WSSKURI)
-
-# NewDirectory Read-Write URI
-NDRWURI="^%sURI%sDIR2%s%s/?$" % (OPTIONALHTTPLEAD, COLON, COLON, WSSKBITS)
-
-DirnodeURI = StringConstraint(300,  regexp=NDRWURI)
-
 MAX_BUCKETS = 200  # per peer
 
 # MAX_SEGMENT_SIZE in encode.py is 1 MiB (this constraint allows k = 1)
diff --git a/src/allmydata/test/test_uri.py b/src/allmydata/test/test_uri.py
index 0d2a8f96..3151dc9b 100644
--- a/src/allmydata/test/test_uri.py
+++ b/src/allmydata/test/test_uri.py
@@ -2,8 +2,8 @@
 from twisted.trial import unittest
 from allmydata import uri
 from allmydata.util import hashutil
-from allmydata.interfaces import IURI, IFileURI, IDirnodeURI, DirnodeURI, \
-     IMutableFileURI, IVerifierURI
+from allmydata.interfaces import IURI, IFileURI, IDirnodeURI, IMutableFileURI, \
+    IVerifierURI
 from foolscap.schema import Violation
 
 class Literal(unittest.TestCase):
@@ -169,11 +169,11 @@ class Invalid(unittest.TestCase):
 class Constraint(unittest.TestCase):
     def test_constraint(self):
        good="http://127.0.0.1:8123/uri/URI%3ADIR2%3Aqo8ayna47cpw3rx3kho3mu7q4h%3Abk9qbgx76gh6eyj5ps8p6buz8fffw1ofc37e9w9d6ncsfpuz7icy/"
-       DirnodeURI.checkObject(good, False)
+       self.failUnless(uri.DirnodeURI_RE.search(good))
        bad = good + '==='
-       self.failUnlessRaises(Violation, DirnodeURI.checkObject, bad, False)
+       self.failIf(uri.DirnodeURI_RE.search(bad))
        fileURI = 'URI:CHK:f3mf6az85wpcai8ma4qayfmxuc:nnw518w5hu3t5oohwtp7ah9n81z9rfg6c1ywk33ia3m64o67nsgo:3:10:345834'
-       self.failUnlessRaises(Violation, DirnodeURI.checkObject, fileURI, False)
+       self.failIf(uri.DirnodeURI_RE.search(fileURI))
 
 
 class Mutable(unittest.TestCase):
diff --git a/src/allmydata/uri.py b/src/allmydata/uri.py
index a9485622..962091c6 100644
--- a/src/allmydata/uri.py
+++ b/src/allmydata/uri.py
@@ -4,13 +4,33 @@ from zope.interface import implements
 from twisted.python.components import registerAdapter
 from allmydata.util import idlib, hashutil
 from allmydata.interfaces import IURI, IDirnodeURI, IFileURI, IVerifierURI, \
-     IMutableFileURI, INewDirectoryURI, IReadonlyNewDirectoryURI, DirnodeURI
+     IMutableFileURI, INewDirectoryURI, IReadonlyNewDirectoryURI
 import foolscap
 
 # the URI shall be an ascii representation of the file. It shall contain
 # enough information to retrieve and validate the contents. It shall be
 # expressed in a limited character set (namely [TODO]).
 
+ZBASE32CHAR = "[ybndrfg8ejkmcpqxot1uwisza345h769]" # excludes l, 0, 2, and v
+ZBASE32CHAR_3bits = "[yoearcwh]"
+ZBASE32CHAR_1bits = "[yo]"
+ZBASE32STR_128bits = "%s{25}%s" % (ZBASE32CHAR, ZBASE32CHAR_3bits)
+ZBASE32STR_256bits = "%s{51}%s" % (ZBASE32CHAR, ZBASE32CHAR_1bits)
+COLON="(:|%3A)"
+
+# Writeable SSK bits
+WSSKBITS= "%s%s%s" % (ZBASE32STR_128bits, COLON, ZBASE32STR_256bits)
+
+# URIs (soon to be renamed "caps") are always allowed to come with a leading
+# "http://127.0.0.1:8123/uri/" that will be ignored.
+OPTIONALHTTPLEAD=r'(https?://(127.0.0.1|localhost):8123/uri/)?'
+
+# Writeable SSK URI
+WriteableSSKFileURI_RE=re.compile("^%sURI%sSSK%s%s$" % (OPTIONALHTTPLEAD, COLON, COLON, WSSKBITS))
+
+# NewDirectory Read-Write URI
+DirnodeURI_RE=re.compile("^%sURI%sDIR2%s%s/?$" % (OPTIONALHTTPLEAD, COLON, COLON, WSSKBITS))
+
 
 class _BaseURI:
     def __hash__(self):
@@ -418,11 +438,7 @@ def from_string_dirnode(s):
 registerAdapter(from_string_dirnode, str, IDirnodeURI)
 
 def is_string_newdirnode_rw(s):
-    try:
-        DirnodeURI.checkObject(s, inbound=False)
-        return True
-    except foolscap.tokens.Violation, v:
-        return False
+    return DirnodeURI_RE.search(s)
 
 def from_string_filenode(s):
     u = from_string(s)
-- 
2.45.2