def _reqValidLink(self): # we use the "host" part as the local name host = self.link[1].get('host') if not host: raise s_common.BadUrl('local://<name>/<path>') self.link[1]['sockpath'] = self._getTempPath()
def evalurl(url, **opts): ''' Construct either a local object or a telepath proxy. Args: url (str): URL to evaluate **opts: Additional options. Notes: This API enables the ctor:// protocol which uses ``eval()``. It should **only** be used with trusted inputs! Examples: Get a remote object over a TCP connection: item0 = evalurl('tcp://1.2.3.4:90/foo') Get a local object via ctor: item1 = evalurl('ctor://foo.bar.baz("woot",y=20)') Returns: object: A python object ''' if url.find('://') == -1: raise s_common.BadUrl(url) scheme, therest = url.split('://', 1) if scheme == 'ctor': locs = opts.get('locs') return s_dyndeps.runDynEval(therest, locs=locs) return openurl(url, **opts)
def evalurl(url, **opts): ''' Construct either a local object or a telepath proxy. WARNING: this API enables ctor:// proto which uses eval! ( trusted inputs only ) Example: item0 = evalurl('tcp://1.2.3.4:90/foo') item1 = evalurl('ctor://foo.bar.baz("woot",y=20)') ''' if url.find('://') == -1: raise s_common.BadUrl(url) scheme, therest = url.split('://', 1) if scheme == 'ctor': locs = opts.get('locs') return s_dyndeps.runDynEval(therest, locs=locs) return openurl(url, **opts)
def chopurl(url): ''' A sane "stand alone" url parser. Example: info = chopurl(url) ''' ret = {} if url.find('://') == -1: raise s_common.BadUrl(':// not found in [{}]!'.format(url)) scheme, remain = url.split('://', 1) ret['scheme'] = scheme.lower() # carve query params from the end if remain.find('?') != -1: query = {} remain, queryrem = remain.split('?', 1) for qkey in queryrem.split('&'): qval = None if qkey.find('=') != -1: qkey, qval = qkey.split('=', 1) query[qkey] = qval ret['query'] = query pathrem = '' slashoff = remain.find('/') if slashoff != -1: pathrem = remain[slashoff:] remain = remain[:slashoff] # detect user[:passwd]@netloc syntax if remain.find('@') != -1: user, remain = remain.rsplit('@', 1) if user.find(':') != -1: user, passwd = user.split(':', 1) ret['passwd'] = passwd ret['user'] = user # remain should be down to host[:port] # detect ipv6 [addr]:port syntax if remain.startswith('['): hostrem, portstr = remain.rsplit(':', 1) ret['port'] = int(portstr) ret['host'] = hostrem[1:-1] # detect ipv6 without port syntax elif remain.count(':') > 1: ret['host'] = remain # regular old host or host:port syntax else: if remain.find(':') != -1: remain, portstr = remain.split(':', 1) ret['port'] = int(portstr) ret['host'] = remain ret['path'] = pathrem return ret