VMM/Account: s/prefix/mbformat/ and pass the dbh to MailLocation.__init__.
# -*- coding: UTF-8 -*-# Copyright (c) 2010, Pascal Volk# See COPYING for distribution information.""" VirtualMailManager.cli VirtualMailManager's command line interface."""importosfromcStringIOimportStringIOfromgetpassimportgetpassfromtextwrapimportTextWrapperfromVirtualMailManagerimportENCODING__all__=('get_winsize','read_pass','string_io','w_err','w_std')_std_write=os.sys.stdout.write_err_write=os.sys.stderr.writedefw_std(*args):"""Writes a line for each arg of *args*, encoded in the current ENCODING, to stdout. """_std_write('\n'.join(arg.encode(ENCODING,'replace')forarginargs))_std_write('\n')defw_err(code,*args):"""Writes a line for each arg of *args*, encoded in the current ENCODING, to stderr. This function additional interrupts the program execution and uses *code* as the system exit status. """_err_write('\n'.join(arg.encode(ENCODING,'replace')forarginargs))_err_write('\n')os.sys.exit(code)defget_winsize():"""Returns a tuple of integers ``(ws_row, ws_col)`` with the height and width of the terminal."""fd=Nonefordevin(os.sys.stdout,os.sys.stderr,os.sys.stdin):ifhasattr(dev,'fileno')andos.isatty(dev.fileno()):fd=dev.fileno()breakiffdisNone:# everything seems to be redirected# fall back to environment or assume some common defaultsws_row,ws_col=24,80try:ws_col=int(os.environ.get('COLUMNS',80))ws_row=int(os.environ.get('LINES',24))exceptValueError:passreturnws_row,ws_colfromarrayimportarrayfromfcntlimportioctlfromtermiosimportTIOCGWINSZ#"struct winsize" with the ``unsigned short int``s ws_{row,col,{x,y}pixel}ws=array('H',(0,0,0,0))ioctl(fd,TIOCGWINSZ,ws,True)ws_row,ws_col=ws[:2]returnws_row,ws_coldefread_pass():"""Interactive 'password chat', returns the password in plain format. Throws a VMMException after the third failure. """# TP: Please preserve the trailing space.readp_msg0=_(u'Enter new password: ').encode(ENCODING,'replace')# TP: Please preserve the trailing space.readp_msg1=_(u'Retype new password: ').encode(ENCODING,'replace')mismatched=Truefailures=0whilemismatched:iffailures>2:raiseVMMException(_(u'Too many failures - try again later.'),ERR.VMM_TOO_MANY_FAILURES)clear0=getpass(prompt=readp_msg0)clear1=getpass(prompt=readp_msg1)ifclear0!=clear1:failures+=1w_std(_(u'Sorry, passwords do not match'))continueifnotclear0:failures+=1w_std(_(u'Sorry, empty passwords are not permitted'))continuemismatched=Falsereturnclear0defstring_io():"""Returns a new `cStringIO.StringIO` instance."""returnStringIO()