>> from jarabe.model.network import GSM_USERNAME_PATH, GSM_PASSWORD_PATH, \ >> GSM_NUMBER_PATH, GSM_APN_PATH, >> GSM_PIN_PATH, \ >> GSM_PUK_PATH >> >> +from cpsection.modemconfiguration.config import PROVIDERS_PATH, \ >> + PROVIDERS_FORMAT_SUPPORTED, \ >> + COUNTRY_CODES_PATH >> + >> def get_username(): >> client =3D gconf.client_get_default() >> return client.get_string(GSM_USERNAME_PATH) or '' >> @@ -68,3 +77,103 @@ def set_puk(puk): >> client =3D gconf.client_get_default() >> client.set_string(GSM_PUK_PATH, puk) >> >> +def has_providers_db(): >> + if not os.path.isfile(COUNTRY_CODES_PATH): >> + return False >> + try: >> + tree = ElementTree(file=PROVIDERS_PATH) >> + elem = tree.getroot() >> + if elem is None or elem.get('format') != PROVIDERS_FORMAT_SUPPORTED: >> + return False >> + return True >> + except IOError: >> + return False > > Consider checking for file existence and readability with > os.access().
As a general safety rule, it's better to open the file, catch any errors, and do any further work via fstat(), openat(), and friends because doing so avoids some annoying "time-of-check-to-time-of-use" (TOCTTOU) races without being any more difficult. However, beware: when designing for a hostile environment, more care is needed [1]. [1]: http://www.usenix.org/events/fast08/tech/tsafrir.html >> +class CountryListStore(gtk.ListStore): >> + COUNTRY_CODE =3D locale.getdefaultlocale()[0][3:5].lower() >> + >> + def __init__(self): >> + gtk.ListStore.__init__(self, str, object) >> + codes =3D {} >> + with open(COUNTRY_CODES_PATH) as codes_file: > > Using 'with' like that makes us depend on Python 2.6. Fortunately, using 'with' with a from __future__ import with_statement import is Python-2.5 compatible. Regards, Michael _______________________________________________ Sugar-devel mailing list Sugar-devel@lists.sugarlabs.org http://lists.sugarlabs.org/listinfo/sugar-devel