Signed-off-by: Daira Hopwood <daira@jacaranda.org>
15 files changed:
from allmydata.introducer.client import IntroducerClient
from allmydata.util import hashutil, base32, pollmixin, log, keyutil, idlib
from allmydata.util.encodingutil import get_filesystem_encoding
from allmydata.introducer.client import IntroducerClient
from allmydata.util import hashutil, base32, pollmixin, log, keyutil, idlib
from allmydata.util.encodingutil import get_filesystem_encoding
+from allmydata.util.fileutil import abspath_expanduser_unicode
from allmydata.util.abbreviate import parse_abbreviated_size
from allmydata.util.time_format import parse_duration, parse_date
from allmydata.stats import StatsProvider
from allmydata.util.abbreviate import parse_abbreviated_size
from allmydata.util.time_format import parse_duration, parse_date
from allmydata.stats import StatsProvider
from allmydata.webish import WebishServer
nodeurl_path = os.path.join(self.basedir, "node.url")
from allmydata.webish import WebishServer
nodeurl_path = os.path.join(self.basedir, "node.url")
- staticdir = self.get_config("node", "web.static", "public_html")
- staticdir = os.path.expanduser(staticdir)
+ staticdir_config = self.get_config("node", "web.static", "public_html").decode("utf-8")
+ staticdir = abspath_expanduser_unicode(staticdir_config, base=self.basedir)
ws = WebishServer(self, webport, nodeurl_path, staticdir)
self.add_service(ws)
ws = WebishServer(self, webport, nodeurl_path, staticdir)
self.add_service(ws)
from zope.interface import implements
from twisted.web.client import getPage
from twisted.internet import defer
from zope.interface import implements
from twisted.web.client import getPage
from twisted.internet import defer
from twisted.conch.ssh import keys
from allmydata.util import base32
from twisted.conch.ssh import keys
from allmydata.util import base32
+from allmydata.util.fileutil import abspath_expanduser_unicode
+
class NeedRootcapLookupScheme(Exception):
"""Accountname+Password-based access schemes require some kind of
class NeedRootcapLookupScheme(Exception):
"""Accountname+Password-based access schemes require some kind of
self.passwords = {}
self.pubkeys = {}
self.rootcaps = {}
self.passwords = {}
self.pubkeys = {}
self.rootcaps = {}
- for line in open(os.path.expanduser(accountfile), "r"):
+ for line in open(abspath_expanduser_unicode(accountfile), "r"):
line = line.strip()
if line.startswith("#") or not line:
continue
line = line.strip()
if line.startswith("#") or not line:
continue
from twisted.internet import defer
from twisted.python.filepath import FilePath
from twisted.internet import defer
from twisted.python.filepath import FilePath
from allmydata.interfaces import IDirectoryNode
from allmydata.util.encodingutil import quote_output, get_filesystem_encoding
from allmydata.interfaces import IDirectoryNode
from allmydata.util.encodingutil import quote_output, get_filesystem_encoding
+from allmydata.util.fileutil import abspath_expanduser_unicode
from allmydata.immutable.upload import FileName
from allmydata.immutable.upload import FileName
service.MultiService.__init__(self)
try:
service.MultiService.__init__(self)
try:
- local_dir_u = os.path.expanduser(local_dir_utf8.decode('utf-8'))
+ local_dir_u = abspath_expanduser_unicode(local_dir_utf8.decode('utf-8'))
if sys.platform == "win32":
local_dir = local_dir_u
else:
if sys.platform == "win32":
local_dir = local_dir_u
else:
import allmydata
from allmydata import node
from allmydata.util import log, rrefutil
import allmydata
from allmydata import node
from allmydata.util import log, rrefutil
-from allmydata.util.encodingutil import get_filesystem_encoding
+from allmydata.util.fileutil import abspath_expanduser_unicode
from allmydata.introducer.interfaces import \
RIIntroducerPublisherAndSubscriberService_v2
from allmydata.introducer.common import convert_announcement_v1_to_v2, \
from allmydata.introducer.interfaces import \
RIIntroducerPublisherAndSubscriberService_v2
from allmydata.introducer.common import convert_announcement_v1_to_v2, \
NODETYPE = "introducer"
GENERATED_FILES = ['introducer.furl']
NODETYPE = "introducer"
GENERATED_FILES = ['introducer.furl']
- def __init__(self, basedir="."):
+ def __init__(self, basedir=u"."):
node.Node.__init__(self, basedir)
self.read_config()
self.init_introducer()
node.Node.__init__(self, basedir)
self.read_config()
self.init_introducer()
introducerservice = IntroducerService(self.basedir)
self.add_service(introducerservice)
introducerservice = IntroducerService(self.basedir)
self.add_service(introducerservice)
- old_public_fn = os.path.join(self.basedir, "introducer.furl").encode(get_filesystem_encoding())
- private_fn = os.path.join(self.basedir, "private", "introducer.furl").encode(get_filesystem_encoding())
+ old_public_fn = os.path.join(self.basedir, u"introducer.furl")
+ private_fn = os.path.join(self.basedir, u"private", u"introducer.furl")
if os.path.exists(old_public_fn):
if os.path.exists(private_fn):
if os.path.exists(old_public_fn):
if os.path.exists(private_fn):
self.log("init_web(webport=%s)", args=(webport,), umid="2bUygA")
from allmydata.webish import IntroducerWebishServer
self.log("init_web(webport=%s)", args=(webport,), umid="2bUygA")
from allmydata.webish import IntroducerWebishServer
- nodeurl_path = os.path.join(self.basedir, "node.url")
- staticdir = self.get_config("node", "web.static", "public_html")
- staticdir = os.path.expanduser(staticdir)
+ nodeurl_path = os.path.join(self.basedir, u"node.url")
+ config_staticdir = self.get_config("node", "web.static", "public_html").decode('utf-8')
+ staticdir = abspath_expanduser_unicode(config_staticdir, base=self.basedir)
ws = IntroducerWebishServer(self, webport, nodeurl_path, staticdir)
self.add_service(ws)
ws = IntroducerWebishServer(self, webport, nodeurl_path, staticdir)
self.add_service(ws)
# this is adapted from my code in Buildbot -warner
# this is adapted from my code in Buildbot -warner
from twisted.python import log
from twisted.application import service, strports
from twisted.cred import checkers, portal
from twisted.python import log
from twisted.application import service, strports
from twisted.cred import checkers, portal
from zope.interface import implements
from zope.interface import implements
+from allmydata.util.fileutil import precondition_abspath
+
# makeTelnetProtocol and _TelnetRealm are for the TelnetManhole
class makeTelnetProtocol:
# makeTelnetProtocol and _TelnetRealm are for the TelnetManhole
class makeTelnetProtocol:
"""
def __init__(self, authorized_keys_file):
"""
def __init__(self, authorized_keys_file):
- self.authorized_keys_file = os.path.expanduser(authorized_keys_file)
+ precondition_abspath(authorized_keys_file)
+ self.authorized_keys_file = authorized_keys_file
def checkKey(self, credentials):
f = open(self.authorized_keys_file)
def checkKey(self, credentials):
f = open(self.authorized_keys_file)
'tcp:12345:interface=127.0.0.1'. Bare integers are treated as a
simple tcp port.
'tcp:12345:interface=127.0.0.1'. Bare integers are treated as a
simple tcp port.
- @param keyfile: the name of a file (relative to the buildmaster's
- basedir) that contains SSH public keys of authorized
- users, one per line. This is the exact same format
- as used by sshd in ~/.ssh/authorized_keys .
+ @param keyfile: the path of a file that contains SSH public keys of
+ authorized users, one per line. This is the exact
+ same format as used by sshd in ~/.ssh/authorized_keys .
+ The path should be absolute.
- # TODO: expanduser this, and make it relative to the buildmaster's
- # basedir
self.keyfile = keyfile
c = AuthorizedKeysChecker(keyfile)
_BaseManhole.__init__(self, port, c)
self.keyfile = keyfile
c = AuthorizedKeysChecker(keyfile)
_BaseManhole.__init__(self, port, c)
iputil.increase_rlimits()
def init_tempdir(self):
iputil.increase_rlimits()
def init_tempdir(self):
- local_tempdir_utf8 = "tmp" # default is NODEDIR/tmp/
- tempdir = self.get_config("node", "tempdir", local_tempdir_utf8).decode('utf-8')
- tempdir = os.path.join(self.basedir, tempdir)
+ tempdir_config = self.get_config("node", "tempdir", "tmp").decode('utf-8')
+ tempdir = abspath_expanduser_unicode(tempdir_config, base=self.basedir)
if not os.path.exists(tempdir):
fileutil.make_dirs(tempdir)
if not os.path.exists(tempdir):
fileutil.make_dirs(tempdir)
- tempfile.tempdir = abspath_expanduser_unicode(tempdir)
+ tempfile.tempdir = tempdir
# this should cause twisted.web.http (which uses
# tempfile.TemporaryFile) to put large request bodies in the given
# directory. Without this, the default temp dir is usually /tmp/,
# this should cause twisted.web.http (which uses
# tempfile.TemporaryFile) to put large request bodies in the given
# directory. Without this, the default temp dir is usually /tmp/,
def setup_ssh(self):
ssh_port = self.get_config("node", "ssh.port", "")
if ssh_port:
def setup_ssh(self):
ssh_port = self.get_config("node", "ssh.port", "")
if ssh_port:
- ssh_keyfile = self.get_config("node", "ssh.authorized_keys_file").decode('utf-8')
+ ssh_keyfile_config = self.get_config("node", "ssh.authorized_keys_file").decode('utf-8')
+ ssh_keyfile = abspath_expanduser_unicode(ssh_keyfile_config, base=self.basedir)
from allmydata import manhole
from allmydata import manhole
- m = manhole.AuthorizedKeysManhole(ssh_port, ssh_keyfile.encode(get_filesystem_encoding()))
+ m = manhole.AuthorizedKeysManhole(ssh_port, ssh_keyfile)
- self.log("AuthorizedKeysManhole listening on %s" % ssh_port)
+ self.log("AuthorizedKeysManhole listening on %s" % (ssh_port,))
def get_app_versions(self):
# TODO: merge this with allmydata.get_package_versions
def get_app_versions(self):
# TODO: merge this with allmydata.get_package_versions
# tahoe get FOO bar # write to local file
# tahoe get tahoe:FOO bar # same
# tahoe get FOO bar # write to local file
# tahoe get tahoe:FOO bar # same
- self.from_file = argv_to_unicode(arg1)
-
- if arg2:
- self.to_file = argv_to_unicode(arg2)
- else:
- self.to_file = None
+ if arg2 == "-":
+ arg2 = None
- if self.to_file == "-":
- self.to_file = None
+ self.from_file = argv_to_unicode(arg1)
+ self.to_file = None if arg2 is None else argv_to_abspath(arg2)
def getSynopsis(self):
return "Usage: %s [global-opts] get [options] REMOTE_FILE LOCAL_FILE" % (self.command_name,)
def getSynopsis(self):
return "Usage: %s [global-opts] get [options] REMOTE_FILE LOCAL_FILE" % (self.command_name,)
def parseArgs(self, arg1=None, arg2=None):
# see Examples below
def parseArgs(self, arg1=None, arg2=None):
# see Examples below
- if arg1 is not None and arg2 is not None:
- self.from_file = argv_to_unicode(arg1)
- self.to_file = argv_to_unicode(arg2)
- elif arg1 is not None and arg2 is None:
- self.from_file = argv_to_unicode(arg1) # might be "-"
- self.to_file = None
- else:
- self.from_file = None
- self.to_file = None
- if self.from_file == u"-":
- self.from_file = None
+ if arg1 == "-":
+ arg1 = None
+
+ self.from_file = None if arg1 is None else argv_to_abspath(arg1)
+ self.to_file = None if arg2 is None else argv_to_unicode(arg2)
if self['format']:
if self['format'].upper() not in ("SDMF", "MDMF", "CHK"):
if self['format']:
if self['format'].upper() not in ("SDMF", "MDMF", "CHK"):
from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
UnknownAliasError
from allmydata.scripts.common_http import do_http, format_http_error
from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
UnknownAliasError
from allmydata.scripts.common_http import do_http, format_http_error
resp = do_http("GET", url)
if resp.status in (200, 201,):
if to_file:
resp = do_http("GET", url)
if resp.status in (200, 201,):
if to_file:
- outf = open(os.path.expanduser(to_file), "wb")
+ outf = open(to_file, "wb")
else:
outf = stdout
while True:
else:
outf = stdout
while True:
from cStringIO import StringIO
import urllib
from cStringIO import StringIO
import urllib
from allmydata.scripts.common_http import do_http, format_http_success, format_http_error
from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
UnknownAliasError
from allmydata.scripts.common_http import do_http, format_http_success, format_http_error
from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
UnknownAliasError
url += "?" + "&".join(queryargs)
if from_file:
url += "?" + "&".join(queryargs)
if from_file:
- infileobj = open(os.path.expanduser(from_file), "rb")
+ infileobj = open(from_file, "rb")
else:
# do_http() can't use stdin directly: for one thing, we need a
# Content-Length field. So we currently must copy it.
else:
# do_http() can't use stdin directly: for one thing, we need a
# Content-Length field. So we currently must copy it.
from zope.interface import implements
from foolscap.api import eventually, DeadReferenceError, Referenceable, Tub
from zope.interface import implements
from foolscap.api import eventually, DeadReferenceError, Referenceable, Tub
-from allmydata.util import log
-from allmydata.util.encodingutil import quote_output
+from allmydata.util import log, fileutil
+from allmydata.util.encodingutil import quote_local_unicode_path
from allmydata.interfaces import RIStatsProvider, RIStatsGatherer, IStatsProducer
class LoadMonitor(service.MultiService):
from allmydata.interfaces import RIStatsProvider, RIStatsGatherer, IStatsProducer
class LoadMonitor(service.MultiService):
class PickleStatsGatherer(StdOutStatsGatherer):
# inherit from StdOutStatsGatherer for connect/disconnect notifications
class PickleStatsGatherer(StdOutStatsGatherer):
# inherit from StdOutStatsGatherer for connect/disconnect notifications
- def __init__(self, basedir=".", verbose=True):
+ def __init__(self, basedir=u".", verbose=True):
self.verbose = verbose
StatsGatherer.__init__(self, basedir)
self.picklefile = os.path.join(basedir, "stats.pickle")
self.verbose = verbose
StatsGatherer.__init__(self, basedir)
self.picklefile = os.path.join(basedir, "stats.pickle")
except Exception:
print ("Error while attempting to load pickle file %s.\n"
"You may need to restore this file from a backup, or delete it if no backup is available.\n" %
except Exception:
print ("Error while attempting to load pickle file %s.\n"
"You may need to restore this file from a backup, or delete it if no backup is available.\n" %
- quote_output(os.path.abspath(self.picklefile)))
+ quote_local_unicode_path(self.picklefile))
def save_portnum(self, junk):
portnum = self.listener.getPortnum()
portnumfile = os.path.join(self.basedir, 'portnum')
def save_portnum(self, junk):
portnum = self.listener.getPortnum()
portnumfile = os.path.join(self.basedir, 'portnum')
- open(portnumfile, 'wb').write('%d\n' % (portnum,))
+ fileutil.write(portnumfile, '%d\n' % (portnum,))
def tub_ready(self, ignored):
ff = os.path.join(self.basedir, self.furl_file)
def tub_ready(self, ignored):
ff = os.path.join(self.basedir, self.furl_file)
from twisted.conch.ssh import keys
from allmydata.frontends import auth
from twisted.conch.ssh import keys
from allmydata.frontends import auth
+from allmydata.util.fileutil import abspath_expanduser_unicode
+
DUMMY_KEY = keys.Key.fromString("""\
-----BEGIN RSA PRIVATE KEY-----
DUMMY_KEY = keys.Key.fromString("""\
-----BEGIN RSA PRIVATE KEY-----
def setUp(self):
self.account_file = filepath.FilePath(self.mktemp())
self.account_file.setContent(DUMMY_ACCOUNTS)
def setUp(self):
self.account_file = filepath.FilePath(self.mktemp())
self.account_file.setContent(DUMMY_ACCOUNTS)
- self.checker = auth.AccountFileChecker(None, self.account_file.path)
+ abspath = abspath_expanduser_unicode(unicode(self.account_file.path))
+ self.checker = auth.AccountFileChecker(None, abspath)
def test_unknown_user(self):
"""
def test_unknown_user(self):
"""
from allmydata.util.assertutil import precondition
from allmydata.util.encodingutil import listdir_unicode, unicode_platform, \
from allmydata.util.assertutil import precondition
from allmydata.util.encodingutil import listdir_unicode, unicode_platform, \
- quote_output, quote_local_unicode_path, get_io_encoding, get_filesystem_encoding, \
+ quote_output, get_io_encoding, get_filesystem_encoding, \
unicode_to_output, unicode_to_argv, to_str
from allmydata.util.fileutil import abspath_expanduser_unicode
unicode_to_output, unicode_to_argv, to_str
from allmydata.util.fileutil import abspath_expanduser_unicode
import os, sys, locale
from allmydata.test.common_util import ReallyEqualMixin
import os, sys, locale
from allmydata.test.common_util import ReallyEqualMixin
-from allmydata.util import encodingutil
+from allmydata.util import encodingutil, fileutil
from allmydata.util.encodingutil import argv_to_unicode, unicode_to_url, \
unicode_to_output, quote_output, quote_path, quote_local_unicode_path, \
unicode_platform, listdir_unicode, FilenameEncodingError, get_io_encoding, \
from allmydata.util.encodingutil import argv_to_unicode, unicode_to_url, \
unicode_to_output, quote_output, quote_path, quote_local_unicode_path, \
unicode_platform, listdir_unicode, FilenameEncodingError, get_io_encoding, \
# to lumiere_nfc (on Mac OS X, it will be the NFD equivalent).
self.failUnlessIn(lumiere_nfc + ".txt", set([normalize(fname) for fname in filenames]))
# to lumiere_nfc (on Mac OS X, it will be the NFD equivalent).
self.failUnlessIn(lumiere_nfc + ".txt", set([normalize(fname) for fname in filenames]))
- expanded = os.path.expanduser("~/" + lumiere_nfc)
- self.failIfIn("~", expanded)
+ expanded = fileutil.expanduser(u"~/" + lumiere_nfc)
+ self.failIfIn(u"~", expanded)
self.failUnless(expanded.endswith(lumiere_nfc), expanded)
def test_open_unrepresentable(self):
self.failUnless(expanded.endswith(lumiere_nfc), expanded)
def test_open_unrepresentable(self):
import os, re, base64
from cStringIO import StringIO
import os, re, base64
from cStringIO import StringIO
from twisted.trial import unittest
from twisted.internet import defer, reactor
from twisted.trial import unittest
from twisted.internet import defer, reactor
from allmydata import uri, client
from allmydata.nodemaker import NodeMaker
from allmydata.util import base32, consumer, fileutil, mathutil
from allmydata import uri, client
from allmydata.nodemaker import NodeMaker
from allmydata.util import base32, consumer, fileutil, mathutil
+from allmydata.util.fileutil import abspath_expanduser_unicode
from allmydata.util.hashutil import tagged_hash, ssk_writekey_hash, \
ssk_pubkey_fingerprint_hash
from allmydata.util.consumer import MemoryConsumer
from allmydata.util.hashutil import tagged_hash, ssk_writekey_hash, \
ssk_pubkey_fingerprint_hash
from allmydata.util.consumer import MemoryConsumer
fso = debug.FindSharesOptions()
storage_index = base32.b2a(n.get_storage_index())
fso.si_s = storage_index
fso = debug.FindSharesOptions()
storage_index = base32.b2a(n.get_storage_index())
fso.si_s = storage_index
- fso.nodedirs = [unicode(os.path.dirname(os.path.abspath(storedir)))
+ fso.nodedirs = [os.path.dirname(abspath_expanduser_unicode(unicode(storedir)))
for (i,ss,storedir)
in self.iterate_servers()]
fso.stdout = StringIO()
for (i,ss,storedir)
in self.iterate_servers()]
fso.stdout = StringIO()
-def put_file(pathname, inf):
+def put_file(path, inf):
+ precondition_abspath(path)
+
# TODO: create temporary file and move into place?
# TODO: create temporary file and move into place?
- outf = open(os.path.expanduser(pathname), "wb")
+ outf = open(path, "wb")
try:
while True:
data = inf.read(32768)
try:
while True:
data = inf.read(32768)