Skip to content

Commit fa97b88

Browse files
Luca LiechtiLuca Liechti
authored andcommitted
Banning and deleting users
1 parent be12fb9 commit fa97b88

File tree

10 files changed

+111
-8
lines changed

10 files changed

+111
-8
lines changed

src/main/java/radius/config/MultiHttpSecurityConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ protected void configure(HttpSecurity http) throws Exception {
4040
.authorizeRequests()
4141
.antMatchers("/profile", "/answers", "/status", "/toggleStatus").authenticated()
4242
.antMatchers("/admin/**", "/updateConfiguration/**", "/contactUsers/**",
43-
"/sendNewsletter/**", "/actuator/**", "/health/**").hasRole("ADMIN")
43+
"/sendNewsletter/**", "/banUser**", "/deleteUser**", "/unsubscribeNewsletter**",
44+
"/actuator/**", "/health/**").hasRole("ADMIN")
4445
.anyRequest().permitAll();
4546

4647
http

src/main/java/radius/data/dto/EmailSourceDto.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,7 @@ public class EmailSourceDto {
1515
@NotEmpty
1616
private String source;
1717

18+
@NotEmpty
19+
private String uuid;
20+
1821
}

src/main/java/radius/data/repository/JDBCNewsletterRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ private static final class NewsletterDtoRowMapper implements RowMapper<EmailSour
6060
public EmailSourceDto mapRow(ResultSet rs, int rowNum) throws SQLException {
6161
return new EmailSourceDto(
6262
rs.getString("email"),
63-
rs.getString("source")
63+
rs.getString("source"),
64+
rs.getString("uuid")
6465
);
6566
}
6667
}

src/main/java/radius/data/repository/JDBCUserRepository.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.springframework.stereotype.Repository;
88
import radius.User;
99
import radius.exceptions.EmailAlreadyExistsException;
10+
import radius.exceptions.UserHasMatchesException;
1011
import radius.web.service.ConfigService;
1112

1213
import javax.sql.DataSource;
@@ -39,6 +40,7 @@ public class JDBCUserRepository implements UserRepository {
3940
private static final String DELETE_USER = "DELETE FROM users WHERE email = ?";
4041
private static final String UPDATE_LAST_LOGIN = "UPDATE users SET lastlogin = ? WHERE email = ?";
4142
private static final String REGION_DENSITY = "SELECT locations FROM users";
43+
private static final String BAN_USER = "UPDATE users SET banned = TRUE WHERE email = ?";
4244

4345
@Autowired
4446
public void init(DataSource jdbcdatasource, ConfigService configService) {
@@ -153,9 +155,13 @@ private boolean userExists(String email) {
153155
}
154156

155157
@Override
156-
public void deleteUser(String email) {
157-
jdbcTemplate.update(DELETE_AUTHORITIES, email);
158-
jdbcTemplate.update(DELETE_USER, email);
158+
public void deleteUser(String email) throws UserHasMatchesException {
159+
try {
160+
jdbcTemplate.update(DELETE_AUTHORITIES, email);
161+
jdbcTemplate.update(DELETE_USER, email);
162+
} catch (Exception e) {
163+
throw new UserHasMatchesException();
164+
}
159165
}
160166

161167
@Override
@@ -178,6 +184,11 @@ public List<String> regionDensity() {
178184
List<Map<String, Object>> locations = jdbcTemplate.queryForList(REGION_DENSITY);
179185
return locations.stream().map(map -> (String) map.get("locations")).collect(Collectors.toList());
180186
}
187+
188+
@Override
189+
public void banUser(String email) {
190+
jdbcTemplate.update(BAN_USER, email);
191+
}
181192
}
182193

183194

src/main/java/radius/data/repository/UserRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ public interface UserRepository {
3434
void updateLastLogin(String name);
3535

3636
List<String> regionDensity();
37+
38+
void banUser(String username);
3739
}

src/main/java/radius/web/controller/AdminController.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.springframework.validation.BindingResult;
66
import org.springframework.web.bind.annotation.ModelAttribute;
77
import org.springframework.web.bind.annotation.RequestMapping;
8+
import org.springframework.web.bind.annotation.RequestParam;
89
import radius.data.form.ConfigurationForm;
910
import radius.data.form.NewsletterForm;
1011
import radius.web.service.*;
@@ -13,6 +14,7 @@
1314
import java.util.Arrays;
1415
import java.util.List;
1516
import java.util.Locale;
17+
import java.util.Optional;
1618
import java.util.stream.Collectors;
1719

1820
import static org.springframework.web.bind.annotation.RequestMethod.GET;
@@ -41,6 +43,45 @@ public String admin() {
4143
return "admin";
4244
}
4345

46+
@RequestMapping(path="/banUser", method=GET)
47+
public String banUser(@RequestParam(value = "uuid") String uuid, Model model) {
48+
Optional<String> optionalUser = userService.findEmailByUuid(uuid);
49+
if(optionalUser.isPresent()) {
50+
if(userService.banUser(optionalUser.get())) {
51+
model.addAttribute("success", Boolean.TRUE);
52+
} else {
53+
model.addAttribute("failure", Boolean.TRUE);
54+
}
55+
}
56+
model.addAttribute("users", userService.allUsers());
57+
return "admin";
58+
}
59+
60+
@RequestMapping(path="/deleteUser", method=GET)
61+
public String deleteUser(@RequestParam(value = "uuid") String uuid, Model model) {
62+
Optional<String> optionalUser = userService.findEmailByUuid(uuid);
63+
if(optionalUser.isPresent()) {
64+
if(userService.deleteUser(optionalUser.get())) {
65+
model.addAttribute("success", Boolean.TRUE);
66+
} else {
67+
model.addAttribute("failure", Boolean.TRUE);
68+
}
69+
}
70+
model.addAttribute("users", userService.allUsers());
71+
return "admin";
72+
}
73+
74+
@RequestMapping(path="/unsubscribeNewsletter", method=GET)
75+
public String unsubscribeNewsletter(@RequestParam(value = "uuid") String uuid, Model model) {
76+
if(newsletterservice.unsubscribe(uuid)){
77+
model.addAttribute("success", Boolean.TRUE);
78+
} else {
79+
model.addAttribute("failure", Boolean.TRUE);
80+
}
81+
model.addAttribute("newsletterRecipients", newsletterservice.allRecipients());
82+
return "admin";
83+
}
84+
4485
@RequestMapping(path="/updateConfiguration", method=POST)
4586
public String updateConfiguration(@ModelAttribute("configurationForm") @Valid ConfigurationForm form, Model model,
4687
BindingResult result) {

src/main/java/radius/web/service/UserService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,15 @@ public boolean deleteUser(String username) {
189189
return true;
190190
}
191191

192+
public boolean banUser(String username) {
193+
try {
194+
userRepo.banUser(username);
195+
} catch (Exception e) {
196+
return false;
197+
}
198+
return true;
199+
}
200+
192201
public List<User> matchableUsers() {
193202
try {
194203
return userRepo.matchableUsers();

src/main/webapp/WEB-INF/views/admin.jsp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,18 @@
143143
<main class="firstcontainer container">
144144
<section id="leftsection" style="max-width: 1140px;margin: 0 auto;margin-bottom: 20px;">
145145

146+
<c:if test="${success != null}">
147+
<p class="result success">
148+
Aktion erfolgreich ausgeführt.<br>
149+
</p>
150+
</c:if>
151+
152+
<c:if test="${failure != null}">
153+
<p class="result error">
154+
Ein Fehler ist aufgetreten. Versuchen Sie es nochmal.<br>
155+
</p>
156+
</c:if>
157+
146158
<c:if test="${successfullySent != null}">
147159
<p class="result success">
148160
${successfullySent} Mails wurden erfolgreich gesendet.<br>
@@ -200,6 +212,7 @@
200212
<th></th>
201213
<th>Email</th>
202214
<th>Source</th>
215+
<th>Delete</th>
203216
</tr>
204217
</thead>
205218
<tbody>
@@ -208,6 +221,9 @@
208221
<td></td>
209222
<td>${recipient.email}</td>
210223
<td>${recipient.source}</td>
224+
<td>
225+
<a href="<c:url value='/unsubscribeNewsletter?uuid=${recipient.uuid}'/>" class="adminbutton delete" onClick="return confirm('Diese Aktion kann nicht rückgängig gemacht werden. Sicher?');">delete</a>
226+
</td>
211227
</tr>
212228
</c:forEach>
213229
</tbody>
@@ -266,9 +282,11 @@
266282
<th>Vorname</th>
267283
<th>Name</th>
268284
<th>Email</th>
269-
<th>Email bestätigt</th>
285+
<!--<th>Email bestätigt</th>-->
270286
<th>Status</th>
271287
<th>Letzte Änderung</th>
288+
<th>Sperren</th>
289+
<th>Löschen</th>
272290
</tr>
273291
</thead>
274292
<tbody>
@@ -278,9 +296,15 @@
278296
<td>${user.firstname}</td>
279297
<td>${user.lastname}</td>
280298
<td>${user.email}</td>
281-
<td><spring:message code="question.${user.enabled}"/></td>
299+
<!--<td><spring:message code="question.${user.enabled}"/></td>-->
282300
<td><spring:message code="status.${user.status}"/></td>
283301
<td><fmt:formatDate value="${user.dateModified}" pattern = "yyyy-MM-dd"/></td>
302+
<td>
303+
<a href="<c:url value='/banUser?uuid=${user.uuid}'/>" class="adminbutton ban" onClick="return confirm('Diese Aktion kann nur manuell rückgängig gemacht werden. Sicher?');">sperren</a>
304+
</td>
305+
<td>
306+
<a href="<c:url value='/deleteUser?uuid=${user.uuid}'/>" class="adminbutton delete" onClick="return confirm('Diese Aktion kann nicht rückgängig gemacht werden. Sicher?');">löschen</a>
307+
</td>
284308
</tr>
285309
</c:forEach>
286310
</tbody>

src/main/webapp/css/admin.css

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,14 @@ figure {
104104
margin-right: 8px;
105105
opacity: 0.7;
106106
}
107+
.adminbutton,
108+
.adminbutton:visited {
109+
color: white;
110+
text-decoration: none;
111+
}
112+
.ban {
113+
background-color: #D02643;
114+
}
115+
.delete {
116+
background-color: #000;
117+
}

src/main/webapp/js/admin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ $(document).ready(function() {
4040
});
4141

4242
var USER_EMAIL_COLUMN = 3;
43-
var USER_STATUS_COLUMN = 5;
43+
var USER_STATUS_COLUMN = 4;
4444
var NEWSLETTER_EMAIL_COLUMN = 1;
4545
var NEWSLETTER_SOURCE_COLUMN = 2;
4646

0 commit comments

Comments
 (0)