PHP 8.5.2
Preview: tap.py Size: 2.61 KB
//lib/python3/dist-packages/twisted/words/tap.py

# -*- test-case-name: twisted.words.test.test_tap -*-
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
"""
Shiny new words service maker
"""

import socket
import sys
from typing import List, Optional, Sequence

from twisted import plugin
from twisted.application import strports
from twisted.application.service import MultiService
from twisted.cred import checkers, credentials, portal, strcred
from twisted.python import usage
from twisted.words import iwords, service


class Options(usage.Options, strcred.AuthOptionMixin):
    supportedInterfaces = [credentials.IUsernamePassword]
    optParameters: List[Sequence[Optional[str]]] = [
        (
            "hostname",
            None,
            socket.gethostname(),
            "Name of this server; purely an informative",
        )
    ]

    compData = usage.Completions(multiUse=["group"])

    interfacePlugins = {}
    plg = None
    for plg in plugin.getPlugins(iwords.IProtocolPlugin):
        assert plg.name not in interfacePlugins
        interfacePlugins[plg.name] = plg
        optParameters.append(
            (
                plg.name + "-port",
                None,
                None,
                "strports description of the port to bind for the  "
                + plg.name
                + " server",
            )
        )
    del plg

    def __init__(self, *a, **kw):
        usage.Options.__init__(self, *a, **kw)
        self["groups"] = []

    def opt_group(self, name):
        """Specify a group which should exist"""
        self["groups"].append(name.decode(sys.stdin.encoding))

    def opt_passwd(self, filename):
        """
        Name of a passwd-style file. (This is for
        backwards-compatibility only; you should use the --auth
        command instead.)
        """
        self.addChecker(checkers.FilePasswordDB(filename))


def makeService(config):
    credCheckers = config.get("credCheckers", [])
    wordsRealm = service.InMemoryWordsRealm(config["hostname"])
    wordsPortal = portal.Portal(wordsRealm, credCheckers)

    msvc = MultiService()

    # XXX Attribute lookup on config is kind of bad - hrm.
    for plgName in config.interfacePlugins:
        port = config.get(plgName + "-port")
        if port is not None:
            factory = config.interfacePlugins[plgName].getFactory(
                wordsRealm, wordsPortal
            )
            svc = strports.service(port, factory)
            svc.setServiceParent(msvc)

    # This is bogus.  createGroup is async.  makeService must be
    # allowed to return a Deferred or some crap.
    for g in config["groups"]:
        wordsRealm.createGroup(g)

    return msvc

Directory Contents

Dirs: 6 × Files: 6

Name Size Perms Modified Actions
im DIR
- drwxr-xr-x 2026-01-08 12:56:22
Edit Download
- drwxr-xr-x 2026-01-08 12:55:41
Edit Download
protocols DIR
- drwxr-xr-x 2026-01-08 12:56:22
Edit Download
test DIR
- drwxr-xr-x 2026-01-08 12:56:22
Edit Download
xish DIR
- drwxr-xr-x 2026-01-08 12:56:22
Edit Download
- drwxr-xr-x 2026-01-08 12:56:24
Edit Download
645 B lrw-r--r-- 2024-08-27 10:30:39
Edit Download
8.41 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
37.88 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
2.61 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
781 B lrw-r--r-- 2024-08-27 10:30:39
Edit Download
215 B lrw-r--r-- 2024-08-27 10:30:39
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).