moksha/api/errorcodes.py | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+)
New commits: commit 880b9d0a514bc519c2ded8f825a0e2cb4d5fec3e Merge: e613f20... 6d20884... Author: John (J5) Palmieri johnp@redhat.com Date: Tue Mar 3 16:48:12 2009 -0500
Merge branch 'master' of git+ssh://johnp@git.fedorahosted.org/git/moksha
commit e613f2058413b7976e09d9afc102c838299dba35 Author: John (J5) Palmieri johnp@redhat.com Date: Tue Mar 3 16:45:21 2009 -0500
add safe error codes for use with redirects
* during redirects tg.flash does not work so we need to pass it as a get parameter. However if we pass a string then attackers may be able to use it for social engineering (phishing) attacks and it leaves the door open to other security holes. * this allows us to pass error codes and validate them. It also gives a single place for translations to occure
diff --git a/moksha/api/errorcodes.py b/moksha/api/errorcodes.py new file mode 100644 index 0000000..2fbc4bf --- /dev/null +++ b/moksha/api/errorcodes.py @@ -0,0 +1,76 @@ +from paste.response import replace_header + +class ErrObj(dict): + def __init__(self, code, msg): + super(ErrObj, self).__init__(code=code, msg=msg) + + def __getattribute__(self, name): + try: + return super(ErrObj, self).__getattribute__(name) + except AttributeError, e: + if name in self: + return self[name] + + raise e + + def replace_app_header(self, app, header_name): + if app.headers: + headers = list(app.headers) + else: + headers = [] + + replace_header(headers, header_name, self.code) + app.headers = headers + + def __repr__(self): + # act as if the user requested the code + return str(self['code']) + +class ErrEnum(object): + def __init__(self, prefix, *errs): + self._prefix = prefix + self._code_map = {} + + for number, e in enumerate(errs): + # we prefix the code so we can validate + code = '%s_%d' % (prefix, number) + eob = ErrObj(code, e[1]) + setattr(self, e[0], eob) + setattr(self, code, eob) + self._code_map[code] = e[0] + + def is_valid_class(self, err_code): + if err_code.beginswith(self._prefix + '_'): + return True + + return False + + def code_to_attr(self, code): + return self._code_map[code] + + def attr_to_code(self, attr): + return self.__getattribute__(attr).code + + def attr_to_message(self, attr): + return self.__getattribute__(attr).msg + + def get_code(self, attr): + return self.attr_to_code(attr) + + def get_message(self, attr): + return self.attr_to_message(attr) + + def __call__(self, err_code): + return self.get_message(err_code) + +login_err = ErrEnum ('login_err', + ('USERNAME_PASSWORD_ERROR', + ('The username or password you entered is not valid. Please ' + 'try again.') + ), + ('UNKOWN_AUTH_ERROR', + ('An unknown error occurred while trying to log you in. ' + 'Please try again later or notify an admin if the problem ' + 'persists') + ) + ) \ No newline at end of file
moksha-commits@lists.fedorahosted.org