[python] Problém s os.read

Filip Bartmann filbar na centrum.cz
Sobota Únor 13 11:36:02 CET 2010


Dne Sat, 13 Feb 2010 02:36:48 +0100 (CET)
Jan Fuchs <fuky na sunstel.asu.cas.cz> napsal(a):

> Zdravím,
> myslíš následující dokumentaci a program checkpassword?
> 
>      http://cr.yp.to/checkpwd/interface.html
> 
> Pokud ano, tak tohle je začátek programu checkpassword:
> 
>      int main(int argc,char* argv[]) {
>        char buf[513];
>        char* last;
>        int len;
>        char *login,*passwd,*ptr;
>        struct passwd *pw;
>        struct spwd *spw;
> 
>        if (!argv[1]) return 2;
>        for (len=0; len<512; ) {
>          int tmp;
>          tmp=read(3,buf+len,512-len);
>          if (tmp==-1) return 111;
>          if (tmp==0) break;
>          len+=tmp;
>        }
>        close(3);
> 
> Ve svém programu tedy nejprve musíš připravit fd 3 pro checkpassword.
> Takže rešení může být např.:
> 
>      import os
> 
>      r_fd, w_fd = os.pipe()
>      os.write(w_fd, "username\0password\0")
> 
>      retcode = os.fork()
> 
>      if (retcode == 0):
>          os.close(w_fd)
>          os.execlp("checkpassword", "checkpassword", "/bin/date")
>      else:
>          os.close(r_fd)
>          os.close(w_fd)
> 
> Jelikoz jsou na zacatku otevreny pouze deskriptory 0, 1, 2 tj. stdin,
> stdout, stderr, tak fce pipe() vrati pro cteci fd 3, takze neni treba
> resit prirazeni pomoci dup(), dup2(). Dulezite je uzavrit zapisovaci
> cast roury, jinak zustane checkpassword "viset" ve fci read().
> 
>             S pozdravem Jan Fuchs
> 
> > Snažím se napsat si autentikační plugin pro BINCimap. V dokumentaci
> > je napsáno, že jméno a heslo je odesíláno na deskriptor 3.
> 
> --
> /**************************************************************
> *   _    Žádný program není bezchybný, dokonalý ani nejlepší, *
> *  °v°   to samé platí i o lidech a nejen o nich.             *
> * /(_)\                                      -- Jan Fuchs --  *
> *  ^ ^                                                        *
> *        http://www.fuky.org   Jabber: jan.fuchs.cz na gmail.com *
> **************************************************************/

Jo, přesně to myslím, jenomže jestli jsem to pochopil správně, tak je
třeba to username a password z toho deskriptoru přečíst a ne ho tam
zapisovat.
Standartní checkpasswd provádí autentifikaci přes /etc/passwd a já
potřebuju autentifikaci přes ldap, takže si musím napsat náhradu toho
checkpasswd - tedy implementovat jeho interface(tzn. přečíst z
deskriptoru 3 to username\0passwd\0timestamp\0.

Filip Bartmann


Další informace o konferenci Python