[Improve password change component
clinton@unknownlamer.org**20080227191036] {
hunk ./src/web-admin.lisp 69
-    ((title (string-field :input-size 80))
+    ((title (string-field :input-size 80
+			  :validators (make-validators 'not-empty-validator)))
hunk ./src/web-admin.lisp 122
-   (<:li (<ucw:a :href "" "Manage Users"))))
+   (<:li (<ucw:a :action-body (call 'user-list) "Manage Users"))))
+
+(defclass fields-not-equal (form-validator)
+  ((field-1 :initarg :field-1)
+   (field-2 :initarg :field-2)
+   (equal-predicate :initarg :equalp :initform #'equalp)))
+
+(defmethod ucw::validate ((form simple-form) (validator fields-not-equal))
+  (with-slots (field-1 field-2 equal-predicate) validator
+    (funcall equal-predicate
+	     (value (slot-value form field-1))
+	     (value (slot-value form field-2)))))
hunk ./src/web-admin.lisp 144
-    ((user :initarg :user)))
+    ((user :initarg :user))
+    (:validators (fields-not-equal
+		  :field-1 'new-password-1
+		  :field-2 'new-password-2
+		  :message "New passwords do not match")
+		 (user-password-correct
+		  :field 'current-password
+		  :message "Current password is incorrect")))
hunk ./src/web-admin.lisp 153
-(defun check-passwords-equal (password-change-tool)
-  (with-slots (new-password-1 new-password-2)
-	password-change-tool
-      (let ((password-1 (value new-password-1))
-	    (password-2 (value new-password-2)))
-	(if (and password-1 password-2)
-	    (string= password-1 password-2)
-	    t))))
+(defclass user-password-correct (form-validator)
+  ())
hunk ./src/web-admin.lisp 156
-(defmethod validp ((field password-change-tool))
-  (multiple-value-bind (valid failed) (call-next-method)
-    (with-slots (user current-password new-password-1 new-password-2)
-	field
-      (cond ((not (check-passwords-equal field))
-	     ;; fixme: should at least be a validator class
-	     (push (cons new-password-1 "not equal") failed)
-	     (push (cons new-password-2 "not equal") failed)))
-      (if (and (value current-password)
-	       (not (golf-auth:check-password user (value current-password))))
-	  (push (cons current-password
-		      (make-instance 'password-incorrect-validator))
-		failed))
-      (values (null failed) failed))))
+(defmethod ucw::validate ((form password-change-tool)
+			  (validator user-password-correct))
+  (with-slots (user) form
+    (golf-auth:check-password user (client-value
+				    (slot-value form
+						(slot-value validator 'field))))))
hunk ./src/web-admin.lisp 165
-		 (golf-auth:username (slot-value self 'user))))
-  (if (not (check-passwords-equal self))
-      (<:h2 :class "error" (<:as-html "New Passwords Do Not Match"))))
+		 (golf-auth:username (slot-value self 'user)))))
}