mirror of
https://github.com/Garmelon/PFERD.git
synced 2026-04-12 15:35:05 +02:00
add pass authenticator
This commit is contained in:
parent
ad3f4955f7
commit
52649ca5f3
2 changed files with 41 additions and 0 deletions
|
|
@ -5,6 +5,7 @@ from ..config import Config
|
||||||
from .authenticator import Authenticator, AuthError, AuthLoadError, AuthSection # noqa: F401
|
from .authenticator import Authenticator, AuthError, AuthLoadError, AuthSection # noqa: F401
|
||||||
from .credential_file import CredentialFileAuthenticator, CredentialFileAuthSection
|
from .credential_file import CredentialFileAuthenticator, CredentialFileAuthSection
|
||||||
from .keyring import KeyringAuthenticator, KeyringAuthSection
|
from .keyring import KeyringAuthenticator, KeyringAuthSection
|
||||||
|
from .passauth import PassAuthenticator, PassAuthSection
|
||||||
from .simple import SimpleAuthenticator, SimpleAuthSection
|
from .simple import SimpleAuthenticator, SimpleAuthSection
|
||||||
from .tfa import TfaAuthenticator
|
from .tfa import TfaAuthenticator
|
||||||
|
|
||||||
|
|
@ -21,6 +22,8 @@ AUTHENTICATORS: Dict[str, AuthConstructor] = {
|
||||||
KeyringAuthenticator(n, KeyringAuthSection(s)),
|
KeyringAuthenticator(n, KeyringAuthSection(s)),
|
||||||
"simple": lambda n, s, c:
|
"simple": lambda n, s, c:
|
||||||
SimpleAuthenticator(n, SimpleAuthSection(s)),
|
SimpleAuthenticator(n, SimpleAuthSection(s)),
|
||||||
|
"pass": lambda n, s, c:
|
||||||
|
PassAuthenticator(n, PassAuthSection(s), c),
|
||||||
"tfa": lambda n, s, c:
|
"tfa": lambda n, s, c:
|
||||||
TfaAuthenticator(n),
|
TfaAuthenticator(n),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
38
PFERD/auth/passauth.py
Normal file
38
PFERD/auth/passauth.py
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
import subprocess
|
||||||
|
from typing import Tuple
|
||||||
|
|
||||||
|
from ..config import Config
|
||||||
|
from .authenticator import Authenticator, AuthLoadError, AuthSection
|
||||||
|
|
||||||
|
|
||||||
|
class PassAuthSection(AuthSection):
|
||||||
|
def name(self) -> str:
|
||||||
|
value = self.s.get("name")
|
||||||
|
if value is None:
|
||||||
|
self.missing_value("name")
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
class PassAuthenticator(Authenticator):
|
||||||
|
def __init__(self, name: str, section: PassAuthSection, config: Config) -> None:
|
||||||
|
super().__init__(name)
|
||||||
|
|
||||||
|
try:
|
||||||
|
passcontent = subprocess.run(["pass", "show", section.name()],
|
||||||
|
text=True, capture_output=True, check=True).stdout
|
||||||
|
except (OSError, subprocess.CalledProcessError) as e:
|
||||||
|
raise AuthLoadError("Error calling pass") from e
|
||||||
|
|
||||||
|
lines = passcontent.splitlines()
|
||||||
|
self._password = lines[0]
|
||||||
|
self._username = ""
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
if line.startswith('login:'):
|
||||||
|
self._username = line.split(':')[1].strip()
|
||||||
|
|
||||||
|
if not self._username:
|
||||||
|
raise AuthLoadError("No username in pass")
|
||||||
|
|
||||||
|
async def credentials(self) -> Tuple[str, str]:
|
||||||
|
return self._username, self._password
|
||||||
Loading…
Add table
Add a link
Reference in a new issue