Portál AbcLinuxu, 7. prosince 2025 02:18
cat binc_ldapauth/src/binc_ldapauth.py
#!/usr/bin/python
'''
Created on Feb 12, 2010
@author: bartmann
'''
import os;
import string;
import sys;
import ldap;
import ldap.sasl;
class binc_ldapauth:
def __init__(self):
self.gssapi_auth=True;
def get_creds(self):
fd=os.fdopen(3,"r");
ncreds=os.read(3, 128);
creds=ncreds;
while(ncreds!=""):
ncreds=os.read(3, 128);
creds+=ncreds;
creds=creds.split("\0");
self.username=creds[0];
self.password=creds[1];
def auth(self):
ds = ldap.initialize("ldap://joomladev.dyndns.org");
ds.protocol_version=3;
if self.gssapi_auth==False:
try:
ds.simple_bind_s("uid="+self.username+",ou=people,dc=joomladev.dyndns,dc=org",self.password);
dn=string.replace(ds.whoami_s(),"dn:","");
except ldap.INVALID_CREDENTIALS:
return 1;
else:
try:
auth=ldap.sasl.gssapi();
ds.sasl_interactive_bind_s("",auth);
dn=string.replace(ds.whoami_s(),"dn:","");
if(ds.compare_s(dn,'uid',self.username)):
pass;
else:
return 1;
except ldap.INVALID_CREDENTIALS:
return 1;
os.environ["USER"]=self.username;
home=ds.search_s(dn,ldap.SCOPE_BASE,'(objectclass=person)',['homeDirectory']);
os.environ["HOME"]=home[0][1]["homeDirectory"][0];
shell=home=ds.search_s(dn,ldap.SCOPE_BASE,'(objectclass=person)',['loginShell']);
os.environ["SHELL"]=shell[0][1]["loginShell"][0];
gid=home=ds.search_s(dn,ldap.SCOPE_BASE,'(objectclass=person)',['gidNumber']);
os.setgid(int(gid[0][1]["gidNumber"][0]));
uid=home=ds.search_s(dn,ldap.SCOPE_BASE,'(objectclass=person)',['uidNumber']);
os.setuid(int(uid[0][1]["uidNumber"][0]));
os.chdir(os.environ["HOME"]);
os.execlp(sys.argv[1],sys.argv[1]);
if __name__ == '__main__':
lauth=binc_ldapauth();
lauth.get_creds();
lauth.auth();
a ten druhý autentifikuje přes PAM - k jeho funkci je nutné mít nainstalovaný PyPAM:
cat binc_pamauth/src/binc_pamauth.py
#!/usr/bin/python
'''
Created on Feb 12, 2010
@author: bartmann
'''
import os;
import sys;
import PAM;
import pwd;
class binc_pamauth:
def __init__(self):
self.gssapi_auth=True;
def get_creds(self):
fd=os.fdopen(3,"r");
ncreds=os.read(3, 128);
creds=ncreds;
while(ncreds!=""):
ncreds=os.read(3, 128);
creds+=ncreds;
creds=creds.split("\0");
self.username=creds[0];
self.password=creds[1];
def pam_conv(self,auth, query_list):
resp=[];
for (q, qtype) in query_list:
if qtype==PAM.PAM_PROMPT_ECHO_OFF :
resp.append((self.password,0));
else:
resp.append(('',0));
return resp;
def auth(self):
pam_auth = PAM.pam();
pam_auth.start("imap");
pam_auth.set_item(PAM.PAM_USER,self.username);
pam_auth.set_item(PAM.PAM_CONV,self.pam_conv);
try:
pam_auth.authenticate();
pam_auth.acct_mgmt();
except PAM.error:
return 1;
pw=pwd.getpwnam(self.username);
os.environ["USER"]=self.username;
os.environ["HOME"]=pw[5];
os.environ["SHELL"]=pw[6];
os.setgid(int(pw[3]));
os.setuid(int(pw[2]));
os.chdir(os.environ["HOME"]);
os.execlp(sys.argv[1],sys.argv[1]);
if __name__ == '__main__':
pauth=binc_pamauth();
pauth.get_creds();
pauth.auth();
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.