@ -39,6 +39,7 @@ public class Rest extends HttpServlet {
@@ -39,6 +39,7 @@ public class Rest extends HttpServlet {
private static final String LIST_SHOW = "list/show" ;
private static final String LIST_TEST = "list/test" ;
private static final String LIST_SUBSCRIBABLE = "list/subscribable" ;
private static final String MAIL_DROP = "mail/drop" ;
private static final String USER_ADD_PERMISSION = "user/addpermission" ;
private static final String USER_DROP_PERMISSION = "user/droppermission" ;
private static final String USER_LIST = "user/list" ;
@ -61,27 +62,29 @@ public class Rest extends HttpServlet {
@@ -61,27 +62,29 @@ public class Rest extends HttpServlet {
return Map . of ( SUCCESS , "Updated user permissions" ) ;
}
private Map < String , Object > archive ( HttpServletRequest req ) {
private Map < String , Object > archive ( HttpServletRequest req , User user ) throws SQLException {
var list = Util . getMailingList ( req ) ;
if ( list ! = null ) {
try {
var month = req . getParameter ( MONTH ) ;
if ( month = = null | | month . isBlank ( ) ) {
return Map . of ( LIST , list . email ( ) , "summary" , Post . summarize ( list ) ) ;
} else {
return Map . of ( LIST , list . email ( ) , "posts" , Post . find ( list , month ) . stream ( ) . map ( Post : : safeMap ) . toList ( ) ) ;
}
} catch ( SQLException e ) {
e . printStackTrace ( ) ;
}
}
LOG . debug ( "list: {}" , list . email ( ) ) ;
return Map . of ( ) ;
if ( list = = null ) throw new IllegalArgumentException ( t ( "You are trying to access a non-existing list!" ) ) ;
var allowed = list . hasPublicArchive ( ) | | list . mayBeAlteredBy ( user ) ;
if ( ! allowed ) throw new IllegalAccessError ( t ( "You are not allowed to access the archive of this list!" ) ) ;
var allEmails = user ! = null | | list . hasState ( STATE_OPEN_FOR_SUBSCRIBERS ) | | list . hasState ( STATE_OPEN_FOR_GUESTS ) ;
var limitedSenders = allEmails ? null : list . moderators ( ) . map ( ListMember : : user ) . map ( User : : email ) . toList ( ) ;
boolean userIsMod = list . mayBeAlteredBy ( user ) ;
String month = req . getParameter ( MONTH ) ;
if ( month = = null | | month . isBlank ( ) ) return Map . of ( LIST , list . email ( ) , MODERATOR , userIsMod , "summary" , Post . summarize ( list , limitedSenders ) ) ;
return Map . of ( LIST , list . email ( ) , MODERATOR , userIsMod , "posts" , Post . find ( list , month , limitedSenders ) . stream ( ) . map ( Post : : safeMap ) . toList ( ) ) ;
}
@Override
protected void doGet ( HttpServletRequest req , HttpServletResponse resp ) throws ServletException , IOException {
String error = handleGet ( req , resp ) ;
String error ;
try {
error = handleGet ( req , resp ) ;
} catch ( SQLException e ) {
error = e . getMessage ( ) ;
}
if ( error ! = null ) resp . sendError ( 400 , error ) ;
}
@ -118,6 +121,21 @@ public class Rest extends HttpServlet {
@@ -118,6 +121,21 @@ public class Rest extends HttpServlet {
if ( error ! = null ) resp . sendError ( 400 , error ) ;
}
private Map dropMail ( String messageId , User user ) {
try {
var message = Post . load ( messageId ) ;
if ( message = = null ) return Map . of ( ERROR , t ( "Cannot remove: unknown message id" ) ) ;
var allowed = message . list ( ) . mayBeAlteredBy ( user ) ;
if ( allowed ) {
message . remove ( ) ;
return Map . of ( SUCCESS , t ( "Message deleted" ) ) ;
}
return Map . of ( ERROR , t ( "You are not allowed to remove messages from this list!" ) ) ;
} catch ( SQLException e ) {
throw new RuntimeException ( e ) ;
}
}
private Map dropPermission ( String userEmail , String permissions ) {
if ( userEmail = = null | | userEmail . isBlank ( ) ) return Map . of ( ERROR , "missing user email address!" ) ;
try {
@ -131,7 +149,7 @@ public class Rest extends HttpServlet {
@@ -131,7 +149,7 @@ public class Rest extends HttpServlet {
LOG . debug ( "Failed to load user for address {}" , userEmail , e ) ;
return Map . of ( ERROR , t ( "Failed to load user for address {}" , userEmail ) ) ;
}
return Map . of ( SUCCESS , "Updated user permissions" ) ;
return Map . of ( SUCCESS , t ( "Updated user permissions" ) ) ;
}
private Map enableList ( MailingList list , User user , boolean enable ) {
@ -146,7 +164,7 @@ public class Rest extends HttpServlet {
@@ -146,7 +164,7 @@ public class Rest extends HttpServlet {
}
}
public String handleGet ( HttpServletRequest req , HttpServletResponse resp ) {
public String handleGet ( HttpServletRequest req , HttpServletResponse resp ) throws SQLException {
var user = Util . getUser ( req ) ;
var path = Util . getPath ( req ) ;
@ -156,7 +174,7 @@ public class Rest extends HttpServlet {
@@ -156,7 +174,7 @@ public class Rest extends HttpServlet {
json . put ( USER , user . safeMap ( ) ) ;
switch ( path ) {
case LIST_ARCHIVE :
json . put ( "archive" , archive ( req ) ) ;
json . put ( "archive" , archive ( req , user ) ) ;
break ;
case USER_LIST :
try {
@ -179,7 +197,7 @@ public class Rest extends HttpServlet {
@@ -179,7 +197,7 @@ public class Rest extends HttpServlet {
} else {
switch ( path ) {
case LIST_ARCHIVE :
json . put ( "archive" , archive ( req ) ) ;
json . put ( "archive" , archive ( req , null ) ) ;
break ;
case LIST_SUBSCRIBABLE :
json . put ( "lists" , MailingList . subscribable ( ) . stream ( ) . map ( MailingList : : minimalMap ) . toList ( ) ) ;
@ -245,6 +263,10 @@ public class Rest extends HttpServlet {
@@ -245,6 +263,10 @@ public class Rest extends HttpServlet {
case LIST_TEST :
json . putAll ( testList ( list , user ) ) ;
break ;
case MAIL_DROP :
var messageId = req . getParameter ( MESSAGE_ID ) ;
json . putAll ( dropMail ( messageId , user ) ) ;
break ;
case USER_ADD_PERMISSION :
if ( user . hashPermission ( User . PERMISSION_ADMIN ) ) {
json . putAll ( addPermission ( userEmail , permissions ) ) ;
@ -307,7 +329,7 @@ public class Rest extends HttpServlet {
@@ -307,7 +329,7 @@ public class Rest extends HttpServlet {
if ( list . hasState ( MailingList . STATE_REPLY_TO_LIST ) ) map . put ( KEY_REPLY_TO_LIST , true ) ;
if ( list . isOpenForGuests ( ) ) map . put ( KEY_OPEN_FOR_GUESTS , true ) ;
if ( list . isOpenForSubscribers ( ) ) map . put ( KEY_OPEN_FOR_SUBSCRIBERS , true ) ;
if ( list . hasState ( MailingList . STATE_PUBLIC_ARCHIVE ) ) map . put ( KEY_ARCHIVE , true ) ;
if ( list . hasPublicArchive ( ) ) map . put ( KEY_ARCHIVE , true ) ;
if ( list . hasState ( STATE_MODS_CAN_EDIT_MODS ) ) map . put ( KEY_MODS_CAN_EDIT_MODS , true ) ;
if ( list . holdTime ( ) ! = null ) map . put ( KEY_DELETE_MESSAGES , list . holdTime ( ) ) ;
return map ;