Old Password: [ ] New Password: [ ] Confirm New Password: [ ]So that should be a moment’s work to redo, right? Wrong. There is a package of procedures for user maintenance that contains the following 2 procedures that are relevant:
PROCEDURE change_password_validate (p_username IN VARCHAR2, p_old_password IN VARCHAR2, p_new_password IN VARCHAR2, p_confirm_password IN VARCHAR2, p_profile_name IN VARCHAR2, p_mode IN VARCHAR2 DEFAULT 'N', p_mask IN VARCHAR2) ; PROCEDURE change_password_process (p_username IN VARCHAR2, p_new_password IN VARCHAR2, p_confirm_password IN VARCHAR2, p_mask IN VARCHAR2, p_profile_name IN VARCHAR2, p_encrypt_pw IN VARCHAR2, p_admin_mode IN VARCHAR2 DEFAULT NULL) ;Some design flaws are immediately evident:
- Validation is totally separate from processing. If I choose to, I can skip the validate routine altogether and call the process routine to change the password to anything I like, regardless of whether I get the old password right or confirm it correctly. (Actually, this foolish separation of validation from processing is a company standard!)
- I get to choose whether the password is to be stored (in our own application’s USERS table) in encrypted form or not. HTF do I know whether it should be encrypted or not?
- I need to supply something called p_mask, which I think may be something to do with the encryption process, or maybe the validation process – none of this is documented of course, or at least nobody knows where any such documentation may be found. I have tried passing the word ‘mask’ and it seems to work, except that all subsequent attempt to change the password then fail on the validation of the “old” password – perhaps because it has been encrypted in an unexpected manner.
- I also need to supply something called p_profile_name, which I do happen to know is a user attribute something like a role, stored in the USERS table. Well excuse me, but if I’m passing in the username as a parameter, why should I have to go look up the USERS record and obtain the profile_name value just to pass it into this lazy procedure?
- I don’t fully understand p_mode and p_admin_mode either, but at least they have defaults which I assume (for now) I can live with.