2011年11月4日金曜日

パスワードの生成

#! /usr/bin/env python
# -*- coding: utf-8 -*-

try     :import pswd_cfg
except  :pass


class Pswdgen( object ):
    """
        パスワード生成クラス
    """

    def get_pswd( self, myname, usrname, url, length ):
        """
            パスワードの取得
        """

        netloc  = self.get_netloc( url )
        hexpswd = self.get_hexpswd( ( myname, usrname, netloc ), length )
        return    self.hexstr2word( hexpswd )

    def hexstr2word( self, hexstr ):
        """
            16進数表示の文字列からその番号に対応する文字列を取得
        """

        import string
        words = string.digits + string.ascii_letters
        words_len = len( words )

        rstr = ''
        for ii in range( 0, len( hexstr ), 2 ):
            num = int( '0x' + hexstr[ ii:ii+2], 16 )
            rstr += words[ num % words_len ]

        return rstr

    def get_hexpswd( self, datas, length ):
        """please orver ride"""
        pass
 
    def get_netloc( self, url ):
        """
            urlからノード名を取得
        """
        import urlparse
        return urlparse.urlparse( url )[1]


class Finished( Exception ):pass

class UI_console( Pswdgen ):
    def __init__( self ):
        print 'please input date; myname, usrname, url, length'
        self.exqt()
    def exqt( self ):
        myname  = raw_input( 'myname    :%12s :'%( pswd_cfg.DFLT_MYNAME     ) )
        usrname = raw_input( 'usrname   :%12s :'%( pswd_cfg.DFLT_USRNAME    ) )
        url     = raw_input( 'url       :%12s :'%( pswd_cfg.DFLT_URL        ) )
        length  = input(     'length    :%12s :'%( pswd_cfg.DFLT_LENGTH     ) )

        pswd = self.get_pswd( myname, usrname, url, length )
        while True:raw_input( pswd )


try:
    import Tkinter as TK
    class UI_Tkinter( TK.Frame, Pswdgen ):
        def __init__( self ):
            TK.Frame.__init__( self, master=None )
            self.pack()
            self.master.title( 'pswdgen' )
            self.entries  = {}
            self.mk_widgets()

        def labeled_entry( self, name ):
            frame = TK.Frame()
            TK.Label( frame, text=name, width=10 ).pack( side='left' )
            self.entries[name] = TK.Entry( frame )
            self.entries[name].pack( side='right' )
            return frame

        def mk_widgets( self ):
            self.labeled_entry( 'myname'    ).pack()
            self.labeled_entry( 'usrname'   ).pack()
            self.labeled_entry( 'url'       ).pack()
            self.labeled_entry( 'length'    ).pack()

            frame = TK.Frame()
            self.EXQT = TK.Button( frame, text='EXQT', command=self.exqt )
            self.EXQT.pack( side='left', fill=TK.X, expand=1 )
        
            self.QUIT = TK.Button( frame, text='QUIT', command=self.quit )
            self.QUIT.pack( side='left', fill=TK.X, expand=1 )

            frame.pack( fill=TK.X )

            self.labeled_entry( 'password' ).pack()

            #default value
            self.entries[ 'myname'  ].insert( 0, pswd_cfg.DFLT_MYNAME   )
            self.entries[ 'usrname' ].insert( 0, pswd_cfg.DFLT_USRNAME  )
            self.entries[ 'url'     ].insert( 0, pswd_cfg.DFLT_URL      )
            self.entries[ 'length'  ].insert( 0, pswd_cfg.DFLT_LENGTH   )

        def exqt( self ):
            myname  = self.entries[ 'myname'    ].get()
            usrname = self.entries[ 'usrname'   ].get()
            url     = self.entries[ 'url'       ].get()
            length  = int( self.entries['length'].get() )

            pswd = self.get_pswd( myname, usrname, url, length )

            self.entries[ 'password' ].delete( 0, TK.END )
            self.entries[ 'password' ].insert( 0, pswd )
except ImportError:pass

class Main( object ):
    def __init__( self ):
        self.choiseUI()

    def choiseUI( self ):
        try:
            try:TK
            except NameError:pass
            else:
                runner = UI_Tkinter()
                runner.mainloop()
                runner.destroy()
                raise Finished
            UI_console()
        except Finished:pass

if __name__ == '__main__':
    Main()

0 件のコメント:

コメントを投稿