Portál AbcLinuxu, 14. května 2024 00:47

Dva autentikátory pro BincIMap a QMail

14.2.2010 15:22 | Přečteno: 865× | Programování | Výběrový blog | poslední úprava: 14.2.2010 15:23

Jelikož jsem v domácí síti přešel na ldap+kerberos autentifikaci, tak jsem potřeboval změnit autentifikátor pro IMAP server, který používám. Výsledkem jsou dva checkpassword kompatibilní autentifikátory. První je pro LDAP autentifikaci - potřebuje balíček python-ldap.
 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();
       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.