summaryrefslogtreecommitdiff
path: root/pynslcd/pam.py
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2013-07-27 20:17:16 +0200
committerArthur de Jong <arthur@arthurdejong.org>2013-07-28 20:01:06 +0200
commita3acbecc071b4138a36fa2a155f7fab2eb94209b (patch)
treebfc603af3dcd02de6d8301ee9a69e130ec3b2394 /pynslcd/pam.py
parent4031750cbbf7d8c7803ed7379d42c1c1b4805a85 (diff)
Implement PAM session handling in pynslcd
Just like in nslcd this doesn't actually do anything with the session ids except generating them.
Diffstat (limited to 'pynslcd/pam.py')
-rw-r--r--pynslcd/pam.py63
1 files changed, 61 insertions, 2 deletions
diff --git a/pynslcd/pam.py b/pynslcd/pam.py
index 1dbf7e8..483c8d5 100644
--- a/pynslcd/pam.py
+++ b/pynslcd/pam.py
@@ -19,6 +19,7 @@
# 02110-1301 USA
import logging
+import random
import socket
import time
@@ -34,6 +35,9 @@ import search
import shadow
+random = random.SystemRandom()
+
+
def authenticate(binddn, password):
# open a new connection
conn = search.Connection()
@@ -309,5 +313,60 @@ class PAMPasswordModificationRequest(PAMRequest):
self.write()
-#NSLCD_ACTION_PAM_SESS_O
-#NSLCD_ACTION_PAM_SESS_C
+SESSION_ID_LENGTH = 25
+SESSION_ID_ALPHABET = (
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
+ "abcdefghijklmnopqrstuvwxyz" +
+ "01234567890"
+)
+
+
+def generate_session_id():
+ return ''.join(
+ random.choice(SESSION_ID_ALPHABET)
+ for i in range(SESSION_ID_LENGTH)
+ )
+
+
+class PAMSessionOpenRequest(PAMRequest):
+
+ action = constants.NSLCD_ACTION_PAM_SESS_O
+
+ def read_parameters(self, fp):
+ return dict(username=fp.read_string(),
+ service=fp.read_string(),
+ ruser=fp.read_string(),
+ rhost=fp.read_string(),
+ tty=fp.read_string())
+ # TODO: log call with parameters
+
+ def write(self, sessionid):
+ self.fp.write_int32(constants.NSLCD_RESULT_BEGIN)
+ self.fp.write_string(sessionid)
+ self.fp.write_int32(constants.NSLCD_RESULT_END)
+
+ def handle_request(self, parameters):
+ # generate a session id
+ session_id = generate_session_id()
+ self.write(session_id)
+
+
+class PAMSessionCloseRequest(PAMRequest):
+
+ action = constants.NSLCD_ACTION_PAM_SESS_C
+
+ def read_parameters(self, fp):
+ return dict(username=fp.read_string(),
+ service=fp.read_string(),
+ ruser=fp.read_string(),
+ rhost=fp.read_string(),
+ tty=fp.read_string(),
+ session_id=fp.read_string())
+ # TODO: log call with parameters
+
+ def write(self):
+ self.fp.write_int32(constants.NSLCD_RESULT_BEGIN)
+ self.fp.write_int32(constants.NSLCD_RESULT_END)
+
+ def handle_request(self, parameters):
+ self.write()