1 44 package com.ivata.groupware.business.mail.server; 45 46 import java.util.Properties ; 47 48 import javax.mail.AuthenticationFailedException ; 49 import javax.mail.Folder ; 50 import javax.mail.MessagingException ; 51 import javax.mail.NoSuchProviderException ; 52 import javax.mail.Session ; 53 import javax.mail.Store ; 54 55 import org.apache.log4j.Logger; 56 import org.picocontainer.MutablePicoContainer; 57 import org.picocontainer.PicoContainer; 58 import org.picocontainer.defaults.DefaultPicoContainer; 59 60 import com.ivata.groupware.admin.security.server.PlainTextSecuritySession; 61 import com.ivata.groupware.admin.security.server.SecuritySession; 62 import com.ivata.groupware.admin.security.user.UserDO; 63 import com.ivata.groupware.admin.setting.Settings; 64 import com.ivata.groupware.business.addressbook.AddressBook; 65 import com.ivata.groupware.business.addressbook.person.PersonDO; 66 import com.ivata.groupware.business.mail.session.MailSession; 67 import com.ivata.groupware.container.PicoContainerFactory; 68 import com.ivata.mask.util.SystemException; 69 70 71 79 public abstract class JavaMailServer implements MailServer { 80 private static Logger log = Logger.getLogger(JavaMailServer.class); 81 private AddressBook addressBook; 82 private Settings settings; 83 public JavaMailServer(final AddressBook addressBookParam, 84 final Settings settingsParam) { 85 this.addressBook = addressBookParam; 86 this.settings = settingsParam; 87 } 88 97 public void checkPassword(final SecuritySession securitySession, 98 final String userName, final String password) throws SystemException { 99 PicoContainer globalContainer = PicoContainerFactory.getInstance() 100 .getGlobalContainer(); 101 MutablePicoContainer sessionContainer = new DefaultPicoContainer(globalContainer); 102 SecuritySession guestSession = loginGuest(); 103 PersonDO person = addressBook.findPersonByUserName(guestSession, userName); 104 UserDO user = person.getUser(); 105 MailSession mailSession = new MailSession(sessionContainer, user); 106 user.setName(user.getName().toLowerCase()); 107 108 Properties mailProperties = new Properties (); 109 String hostName; 110 111 try { 112 mailProperties.setProperty("mail.host", 113 (hostName = settings.getStringSetting(mailSession, 114 "emailHost", null))); 115 mailProperties.setProperty("mail.smtp.host", 116 settings.getStringSetting(mailSession, 117 "emailHostSmtp", null)); 118 } catch (Exception e) { 119 throw new SystemException("ERROR: Exception in ScriptMailServer", 120 e); 121 } 122 mailProperties.setProperty("mail.user", 123 getSystemUserName(securitySession, user.getName())); 124 125 if (user.getName().equals("emergency")) { 126 mailProperties.setProperty("mail.from", "emergency@ivata.com"); 127 } else { 128 mailProperties.setProperty("mail.from", person.getEmailAddress()); 129 } 130 131 132 boolean isConnected = false; 133 try { 134 mailSession.login(password, mailProperties); 135 isConnected = true; 136 } catch (AuthenticationFailedException e) { 137 throw new SystemException(e); 138 } catch (NoSuchProviderException e) { 139 throw new SystemException( 140 "ERROR: " 141 + e.getClass().getName() 142 + " connecting using imap to " 143 + mailProperties.getProperty("mail.host"), 144 e); 145 } catch (MessagingException e) { 146 throw new SystemException( 147 "ERROR: " 148 + e.getClass().getName() 149 + " connecting using imap to " 150 + mailProperties.getProperty("mail.host"), 151 e); 152 } catch (Exception e) { 153 throw new SystemException( 154 "ERROR: " 155 + e.getClass().getName() 156 + " connecting using imap to " 157 + mailProperties.getProperty("mail.host"), 158 e); 159 } 160 } 161 162 165 public Store connectStore(final MailSession mailSession) 166 throws SystemException { 167 try { 168 Session javaMailSession; 169 try { 170 javaMailSession = mailSession.getJavaMailSession(); 171 } catch (java.security.NoSuchProviderException e1) { 172 throw new SystemException(e1); 173 } 174 Store store = javaMailSession.getStore("imap"); 175 if (store == null) { 176 throw new SystemException( 177 "ERROR in MailBean: could not access the mail store"); 178 } 179 if (!store.isConnected()) { 180 store.connect(); 181 } 182 return store; 183 } catch (MessagingException e) { 184 throw new SystemException(e); 185 } 186 } 187 199 public Folder getFolder(final SecuritySession securitySession, 200 final Store store, final String name) 201 throws SystemException { 202 assert (securitySession != null); 203 assert (store != null); 204 assert (store.isConnected()); 205 assert (name != null); 206 String prefix; 207 if ("inbox".equalsIgnoreCase(name)) { 208 prefix = ""; 209 } else { 210 prefix = settings.getStringSetting(securitySession, 211 "emailFolderNamespace", securitySession.getUser()); 212 } 213 String fullFolderName = prefix + name; 214 try { 215 return store.getFolder(fullFolderName); 216 } catch (MessagingException e) { 217 throw new SystemException(e); 218 } 219 } 220 233 public boolean hasNewMessages(final SecuritySession securitySession, 234 final String userName, 235 final String folderName) 236 throws SystemException { 237 assert (securitySession instanceof MailSession); 238 MailSession mailSession = (MailSession) securitySession; 239 240 Store store = connectStore(mailSession); 241 try { 242 String sentFolderName = settings.getStringSetting( 243 mailSession, 244 "emailFolderSent", 245 mailSession.getUser()); 246 Folder folder = getFolder(mailSession, store, folderName); 247 return folder.hasNewMessages(); 248 } catch(MessagingException e) { 249 throw new SystemException(e); 250 } finally { 251 try { 252 store.close(); 253 } catch(MessagingException e) { 254 log.error("Closing store.", e); 255 } 256 } 257 } 258 259 264 public SecuritySession login(final UserDO user, 265 final String password) 266 throws SystemException { 267 PicoContainer globalContainer = PicoContainerFactory.getInstance() 268 .getGlobalContainer(); 269 MutablePicoContainer sessionContainer = new DefaultPicoContainer(globalContainer); 270 MailSession mailSession = new MailSession(sessionContainer, user); 271 sessionContainer.registerComponentInstance(SecuritySession.class, mailSession); 272 273 if (user == null) { 275 throw new SystemException("ERROR in ScriptMailServer: user is null"); 276 } 277 if (user.getName() == null) { 278 throw new SystemException("ERROR in ScriptMailServer: user name is null"); 279 } 280 user.setName(user.getName().toLowerCase()); 281 282 Properties mailProperties = new Properties (); 283 String hostName; 284 285 try { 286 mailProperties.setProperty("mail.host", 287 (hostName = settings.getStringSetting(mailSession, 288 "emailHost", null))); 289 mailProperties.setProperty("mail.smtp.host", 290 settings.getStringSetting(mailSession, 291 "emailHostSmtp", null)); 292 } catch (Exception e) { 293 throw new SystemException("ERROR: Exception in ScriptMailServer", 294 e); 295 } 296 mailProperties.setProperty("mail.user", 297 getSystemUserName(mailSession, user.getName())); 298 299 if (user.getName().equals("emergency")) { 300 mailProperties.setProperty("mail.from", "emergency@ivata.com"); 301 } else { 302 PersonDO person = addressBook.findPersonByUserName(mailSession, 304 user.getName()); 305 mailProperties.setProperty("mail.from", person.getEmailAddress()); 306 } 307 308 309 boolean isConnected = false; 310 try { 311 try { 312 mailSession.login(password, mailProperties); 313 isConnected = true; 314 } catch (AuthenticationFailedException e) { 315 String logPassword = "**********"; 316 Boolean showPassword = settings.getBooleanSetting(mailSession, 317 "siteLoginDebugPassword", null); 318 if ((showPassword != null) 319 && showPassword.booleanValue()) { 320 logPassword = password; 321 } 322 throw new SystemException("Warning: could not connect user '" 323 + mailProperties.getProperty("mail.user") 324 + ", password '" 325 + logPassword 326 + "' to server '" 327 + hostName 328 + "'", 329 e); 330 } 331 } catch (NoSuchProviderException e) { 332 throw new SystemException( 333 "ERROR: " 334 + e.getClass().getName() 335 + " connecting using imap to " 336 + mailProperties.getProperty("mail.host"), 337 e); 338 } catch (MessagingException e) { 339 throw new SystemException( 340 "ERROR: " 341 + e.getClass().getName() 342 + " connecting using imap to " 343 + mailProperties.getProperty("mail.host"), 344 e); 345 } catch (Exception e) { 346 throw new SystemException( 347 "ERROR: " 348 + e.getClass().getName() 349 + " connecting using imap to " 350 + mailProperties.getProperty("mail.host"), 351 e); 352 } 353 mailSession.setPassword(password); 354 return mailSession; 355 } 356 357 360 public SecuritySession loginGuest() throws SystemException { 361 PicoContainer globalContainer = PicoContainerFactory.getInstance() 362 .getGlobalContainer(); 363 UserDO guestUser = new UserDO(); 364 guestUser.setDeleted(false); 365 guestUser.setEnabled(true); 366 guestUser.setName("guest"); 367 MutablePicoContainer sessionContainer = new DefaultPicoContainer(globalContainer); 368 SecuritySession session = new PlainTextSecuritySession(sessionContainer, guestUser); 369 sessionContainer.registerComponentInstance(SecuritySession.class, session); 370 371 return session; 372 } 373 } 374 | Popular Tags |