Kawai Wiki

Rev

Rev 8 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6 soliveira 1
package org.menta.action;
2
 
3
import org.menta.dao.UserDAO;
4
import org.menta.model.User;
5
import org.mentawai.core.BaseAction;
6
import org.mentawai.filter.AuthenticationFree;
7
import org.mentawai.filter.RedirectAfterLogin;
8
import org.mentawai.mail.Letter;
9
import org.mentawai.mail.SimpleEmail;
10
import org.mentawai.mail.TextLetter;
11
import org.mentawai.rule.EmailRule;
12
import org.mentawai.rule.EqualRule;
13
import org.mentawai.rule.MethodRule;
14
import org.mentawai.rule.RegexRule;
15
import org.mentawai.validation.Validatable;
16
import org.mentawai.validation.Validator;
17
 
18
public class UserAction extends BaseAction implements Validatable, AuthenticationFree, RedirectAfterLogin {
19
 
20
        private final UserDAO userDAO;
21
 
22
        public UserAction(UserDAO userDAO) {
23
                this.userDAO = userDAO;
24
        }
25
 
26
        // You cannot log to register...
27
        @Override
28
        public boolean bypassAuthentication(String method) {
29
 
30
                if (method == null) return false;
31
 
32
                if (method.equals("add")) return true;
33
                if (method.equals("check")) return true;
34
 
35
                return false;
36
        }
37
 
38
        // Edit will support redirect after login...
39
        @Override
40
        public boolean shouldRedirect(String method) {
41
 
42
                if (method != null && method.equals("edit")) return true;
43
 
44
                return false;
45
        }
46
 
47
        // Validate the fields for the user form...
48
        @Override
49
        public void prepareValidator(Validator val, String method) {
50
 
51
                String username_regex = "^[A-Za-z][A-Za-z0-9\\-\\_\\.]*[A-Za-z0-9]$";
52
 
53
                if (method != null && method.equals("add") && isPost()) {
54
 
55
                        val.requiredFields("required_field", "username", "password", "email", "groupId", "languageId");
56
 
57
                        val.requiredLists("required_field", "groupId", "languageId");
58
 
59
                        val.add("username", RegexRule.getInstance(username_regex), "bad_username");
60
 
61
                        val.add("username", MethodRule.getInstance(this, "checkUsernameAdd"), "username_already_exists");
62
 
63
                        val.add("email", EmailRule.getInstance(), "bad_email");
64
 
65
                        val.add("password", EqualRule.getInstance("password", "passconf"), "pass_no_match");
66
 
67
                } else if (method != null && method.equals("edit") && isPost()) {
68
 
69
                        val.requiredFields("required_field", "username", "email", "groupId");
70
 
71
                        val.requiredLists("required_field", "groupId");
72
 
73
                        val.add("username", RegexRule.getInstance(username_regex), "bad_username");
74
 
75
                        val.add("username", MethodRule.getInstance(this, "checkUsernameEdit"), "username_already_exists");
76
 
77
                        val.add("email", EmailRule.getInstance(), "bad_email");
78
                }
79
 
80
        }
81
 
82
        public boolean checkUsernameAdd(String username) {
83
 
84
                return userDAO.findByUsername(username) == null;
85
        }
86
 
87
        public boolean checkUsernameEdit(String username) {
88
 
89
                User currentUser = getSessionObj();
90
 
91
                // first check if he is actually changing his username...
92
 
93
                if (!currentUser.getUsername().equals(username)) {
94
 
95
                        return userDAO.findByUsername(username) == null;
96
                }
97
 
98
                return true;
99
        }
100
 
101
        public String check() {
102
 
103
                if (!isPost()) return ERROR;
104
 
105
                String username = input.getString("username");
106
 
107
                String sessionUsername = input.getString("sessionUsername");
108
 
109
                if (isEmpty(username)) return ERROR;
110
 
111
                User u = userDAO.findByUsername(username);
112
 
113
                if (u == null) return SUCCESS; // username does not exist
114
 
115
                if (sessionUsername != null && u.getUsername().equals(sessionUsername)) return SUCCESS;
116
 
117
                return ALREADY;
118
        }
119
 
120
        public String add() {
121
 
122
                if (!isPost()) {
123
 
124
                        // we only want to allow post to add an user...
125
 
126
                        return ERROR;
127
 
128
                } else {
129
 
130
                        User u = input.getObject(User.class);
131
 
132
                        userDAO.insert(u);
133
 
134
                        setSessionObj(u);
135
 
136
                        setSessionGroup(u.getGroup());
137
 
138
                        setSessionLocale(u.getLocale());
139
 
140
                        // send email asynchronous to user with password
141
 
142
                        Letter welcome = new TextLetter("welcome.txt");
143
                        welcome.setAttribute("username", u.getUsername());
144
                        welcome.setAttribute("password", u.getPassword());
145
 
146
                        try {
147
 
148
                                String subject = welcome.getSubject(getSessionLocale());
149
                                String body = welcome.getText(getSessionLocale());
150
 
151
                                SimpleEmail.sendLater(u.getUsername(), u.getEmail(), subject, body);
152
 
153
                        } catch(Exception e) {
154
 
155
                                System.err.println("Error sending email to: " + u.getEmail());
156
 
157
                                e.printStackTrace();
158
                        }
159
 
160
                        addMessage("registration_ok");
161
 
162
                        return CREATED;
163
                }
164
        }
165
 
166
        public String edit() {
167
 
168
                if (!isPost()) {
169
 
170
                        // display user for update...
171
 
172
                        User u = getSessionObj();
173
 
174
                        output.setValue("user", u);
175
 
176
                        return SHOW;
177
 
178
                } else {
179
 
180
                        int id = input.getInt("id");
181
 
182
                        User newUser = userDAO.load(id);
183
 
184
                        newUser = input.getObject(newUser);
185
 
186
                        userDAO.update(newUser);
187
 
188
                        replaceSessionObj(newUser);
189
 
190
                        setSessionGroup(newUser.getGroup());
191
 
192
                        setSessionLocale(newUser.getLocale());
193
 
194
                        addMessage("edit_ok");
195
 
196
                        return UPDATED;
197
                }
198
        }
199
}