From fc8a941055e700bb6e05c4ae55dd8a76128a8dad Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 16 Apr 2014 21:53:57 -0500 Subject: [PATCH 1/6] IDEMPIERE-1903 Error save new user if "Password Policies" enabled --- org.adempiere.base/src/org/compiere/model/MUser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.adempiere.base/src/org/compiere/model/MUser.java b/org.adempiere.base/src/org/compiere/model/MUser.java index e4fbf1fb01..fc1518a3d4 100644 --- a/org.adempiere.base/src/org/compiere/model/MUser.java +++ b/org.adempiere.base/src/org/compiere/model/MUser.java @@ -926,7 +926,7 @@ public class MUser extends X_AD_User } } - if (newRecord || is_ValueChanged("Password")) { + if (getPassword() != null && getPassword().length() > 0 && (newRecord || is_ValueChanged("Password"))) { // Validate password policies / IDEMPIERE-221 if (get_ValueOld("Salt") == null && get_Value("Salt") != null) { // being hashed ; From d614c55eec6e2578906c8605523102ab8bdb3bda Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Sun, 20 Apr 2014 14:49:03 -0500 Subject: [PATCH 2/6] IDEMPIERE-1908 Product cant be imported when ProductType is Asset --- .../src/org/compiere/process/ImportProduct.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.adempiere.base.process/src/org/compiere/process/ImportProduct.java b/org.adempiere.base.process/src/org/compiere/process/ImportProduct.java index 27fbbababf..dd77a7e8b9 100644 --- a/org.adempiere.base.process/src/org/compiere/process/ImportProduct.java +++ b/org.adempiere.base.process/src/org/compiere/process/ImportProduct.java @@ -326,7 +326,7 @@ public class ImportProduct extends SvrProcess implements ImportProcess // Verify ProductType sql = new StringBuilder ("UPDATE I_Product ") .append("SET I_IsImported='E', I_ErrorMsg=I_ErrorMsg||'ERR=Invalid ProductType,' ") - .append("WHERE ProductType NOT IN ('E','I','R','S')") + .append("WHERE ProductType NOT IN ('E','I','R','S','A')") .append(" AND I_IsImported<>'Y'").append(clientCheck); no = DB.executeUpdate(sql.toString(), get_TrxName()); if (no != 0) From 840abd46ee0e9d298f5388d5b40fe84c52ae1163 Mon Sep 17 00:00:00 2001 From: Nicolas Micoud Date: Sun, 20 Apr 2014 14:54:52 -0500 Subject: [PATCH 3/6] IDEMPIERE-1891 Cannot access Process message is hardcoded --- migration/i2.0/oracle/201404081520_IDEMPIERE-1891.sql | 10 ++++++++++ .../i2.0/postgresql/201404081520_IDEMPIERE-1891.sql | 7 +++++++ .../src/org/compiere/model/MPInstance.java | 4 ++-- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 migration/i2.0/oracle/201404081520_IDEMPIERE-1891.sql create mode 100644 migration/i2.0/postgresql/201404081520_IDEMPIERE-1891.sql diff --git a/migration/i2.0/oracle/201404081520_IDEMPIERE-1891.sql b/migration/i2.0/oracle/201404081520_IDEMPIERE-1891.sql new file mode 100644 index 0000000000..7eba276e24 --- /dev/null +++ b/migration/i2.0/oracle/201404081520_IDEMPIERE-1891.sql @@ -0,0 +1,10 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- Apr 8, 2014 3:18:45 PM CEST +-- IDEMPIERE-1891 +INSERT INTO AD_Message (AD_Client_ID,AD_Message_ID,AD_Message_UU,AD_Org_ID,Created,CreatedBy,EntityType,IsActive,MsgText,MsgType,Updated,UpdatedBy,Value) VALUES (0,200269,'0b36ffa9-8364-4d93-8d9a-1e3eae4aa81b',0,TO_DATE('2014-04-08 15:18:44','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','You cannot access process {0} with your role : {1}','I',TO_DATE('2014-04-08 15:18:44','YYYY-MM-DD HH24:MI:SS'),100,'CannotAccessProcess') +; + +SELECT register_migration_script('201404081520_IDEMPIERE-1891.sql') FROM dual +; diff --git a/migration/i2.0/postgresql/201404081520_IDEMPIERE-1891.sql b/migration/i2.0/postgresql/201404081520_IDEMPIERE-1891.sql new file mode 100644 index 0000000000..e3920d4303 --- /dev/null +++ b/migration/i2.0/postgresql/201404081520_IDEMPIERE-1891.sql @@ -0,0 +1,7 @@ +-- Apr 8, 2014 3:18:45 PM CEST +-- IDEMPIERE-1891 +INSERT INTO AD_Message (AD_Client_ID,AD_Message_ID,AD_Message_UU,AD_Org_ID,Created,CreatedBy,EntityType,IsActive,MsgText,MsgType,Updated,UpdatedBy,Value) VALUES (0,200269,'0b36ffa9-8364-4d93-8d9a-1e3eae4aa81b',0,TO_TIMESTAMP('2014-04-08 15:18:44','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','You cannot access process {0} with your role : {1}','I',TO_TIMESTAMP('2014-04-08 15:18:44','YYYY-MM-DD HH24:MI:SS'),100,'CannotAccessProcess') +; + +SELECT register_migration_script('201404081520_IDEMPIERE-1891.sql') FROM dual +; diff --git a/org.adempiere.base/src/org/compiere/model/MPInstance.java b/org.adempiere.base/src/org/compiere/model/MPInstance.java index 6909333f64..1aa488042e 100644 --- a/org.adempiere.base/src/org/compiere/model/MPInstance.java +++ b/org.adempiere.base/src/org/compiere/model/MPInstance.java @@ -27,6 +27,7 @@ import java.util.logging.Level; import org.compiere.util.DB; import org.compiere.util.Env; +import org.compiere.util.Msg; /** * Process Instance Model @@ -207,8 +208,7 @@ public class MPInstance extends X_AD_PInstance MRole role = MRole.get(getCtx(), AD_Role_ID); Boolean access = role.getProcessAccess(AD_Process_ID); if (access == null || !access.booleanValue()) - throw new IllegalAccessError("Cannot access Process " + AD_Process_ID - + " with role: " + role.getName()); + throw new IllegalAccessError(Msg.getMsg(getCtx(), "CannotAccessProcess", new Object[] {AD_Process_ID, role.getName()})); } super.setAD_Process_ID (AD_Process_ID); } // setAD_Process_ID From e36156fb615b54dc176897b164815d720df81217 Mon Sep 17 00:00:00 2001 From: hieplq Date: Mon, 17 Mar 2014 20:17:36 +0700 Subject: [PATCH 4/6] IDEMPIERE-1822:RequestEmailProcessor is not compatible with gmail --- .../process/RequestEMailProcessor.java | 67 +++++++++++++------ 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/org.adempiere.base.process/src/org/compiere/process/RequestEMailProcessor.java b/org.adempiere.base.process/src/org/compiere/process/RequestEMailProcessor.java index bd962b132b..f6ac500331 100644 --- a/org.adempiere.base.process/src/org/compiere/process/RequestEMailProcessor.java +++ b/org.adempiere.base.process/src/org/compiere/process/RequestEMailProcessor.java @@ -19,6 +19,7 @@ package org.compiere.process; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.net.UnknownHostException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -37,7 +38,9 @@ import javax.mail.Multipart; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; +import javax.swing.text.html.HTMLDocument.HTMLReader.IsindexAction; +import org.adempiere.exceptions.AdempiereException; import org.compiere.model.MAttachment; import org.compiere.model.MRequest; import org.compiere.model.MUser; @@ -54,6 +57,7 @@ import org.compiere.util.EMailAuthenticator; public class RequestEMailProcessor extends SvrProcess { protected String p_IMAPHost = null; + protected int p_IMAPPort = 143; protected String p_IMAPUser = null; protected String p_IMAPPwd = null; protected String p_RequestFolder = null; @@ -133,7 +137,20 @@ public class RequestEMailProcessor extends SvrProcess */ protected String doIt() throws Exception { + int portStartIndex = p_IMAPHost.lastIndexOf(":"); + if (portStartIndex > 0){ + String strPort = p_IMAPHost.substring(portStartIndex + 1, p_IMAPHost.length()); + p_IMAPHost = p_IMAPHost.substring(0, portStartIndex); + try{ + p_IMAPPort = Integer.parseInt(strPort); + }catch (Exception ex){ + throw new AdempiereException("Error format port : " + strPort); + } + }else if (p_IMAPHost.startsWith("imap.gmail.com")){ + p_IMAPPort = 993; + } if (log.isLoggable(Level.INFO)) log.info("doIt - IMAPHost=" + p_IMAPHost + + " IMAPPort=" + p_IMAPPort + " IMAPUser=" + p_IMAPUser + // " IMAPPwd=" + p_IMAPPwd + " RequestFolder=" + p_RequestFolder + @@ -145,21 +162,27 @@ public class RequestEMailProcessor extends SvrProcess getSession(); getStore(); processInBox(); + } catch (MessagingException mailEx) { + if (mailEx.getNextException() != null && mailEx.getNextException() instanceof UnknownHostException){ + throw new AdempiereException("Error host : " + mailEx.getMessage()); + } else { + throw new AdempiereException("Error when make connect to email server : " + mailEx.getMessage()); + } + } catch (AdempiereException ae) { + throw ae; } - catch (Exception e) - { + catch (Exception e) { log.log(Level.SEVERE, "processInBox", e); + throw e; + }finally { +// Cleanup + try + { + if ( m_store != null && m_store.isConnected()) + m_store.close(); + } catch(Exception ex) {} } - // Cleanup - try - { - if (m_store.isConnected()) - m_store.close(); - } - catch (Exception e) - { - } - + StringBuilder msgreturn = new StringBuilder("processInBox - Total=").append(noProcessed) .append(" - Requests=").append(noRequest) .append(" - Errors=").append(noError); @@ -178,13 +201,14 @@ public class RequestEMailProcessor extends SvrProcess // Session Properties props = System.getProperties(); - props.put("mail.store.protocol", "smtp"); - props.put("mail.transport.protocol", "smtp"); + props.put("mail.store.protocol", "imap"); + props.put("mail.transport.protocol", "imap"); props.put("mail.host", p_IMAPHost); - props.put("mail.smtp.auth","true"); + props.put("mail.imap.port", p_IMAPPort); + EMailAuthenticator auth = new EMailAuthenticator (p_IMAPUser, p_IMAPPwd); // - m_session = Session.getDefaultInstance(props, auth); + m_session = Session.getInstance(props, auth); m_session.setDebug(CLogMgt.isLevelFinest()); if (log.isLoggable(Level.FINE)) log.fine("getSession - " + m_session); return m_session; @@ -204,7 +228,10 @@ public class RequestEMailProcessor extends SvrProcess throw new IllegalStateException("No Session"); // Get IMAP Store - m_store = m_session.getStore("imap"); + if (p_IMAPHost.startsWith("imap.gmail.com")) + m_store = m_session.getStore("imaps"); + else + m_store = m_session.getStore("imap"); // Connect m_store.connect(); // @@ -227,7 +254,7 @@ public class RequestEMailProcessor extends SvrProcess // Open Inbox Folder inbox = folder.getFolder(p_InboxFolder); if (!inbox.exists()) - throw new IllegalStateException("No Inbox"); + throw new AdempiereException ("Wrong inbox name : " + p_InboxFolder); inbox.open(Folder.READ_WRITE); if (log.isLoggable(Level.FINE)) log.fine("processInBox - " + inbox.getName() + "; Messages Total=" + inbox.getMessageCount() @@ -236,7 +263,7 @@ public class RequestEMailProcessor extends SvrProcess // Open Request Folder requestFolder = folder.getFolder(p_RequestFolder); if (!requestFolder.exists() && !requestFolder.create(Folder.HOLDS_MESSAGES)) - throw new IllegalStateException("Cannot create Request Folder"); + throw new AdempiereException ("Cannot create request folder : " + p_RequestFolder); requestFolder.open(Folder.READ_WRITE); // Open Workflow @@ -248,7 +275,7 @@ public class RequestEMailProcessor extends SvrProcess // Open Error Folder errorFolder = folder.getFolder(p_ErrorFolder); if (!errorFolder.exists() && !errorFolder.create(Folder.HOLDS_MESSAGES)) - throw new IllegalStateException("Cannot create Error Folder"); + throw new AdempiereException ("Cannot create Error Folder : " + p_ErrorFolder); errorFolder.open(Folder.READ_WRITE); // Messages From 9cf721e1ad3c5c411025c89274be48805bbe676f Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Sun, 20 Apr 2014 17:31:43 -0500 Subject: [PATCH 5/6] IDEMPIERE-1822 RequestEmailProcessor is not compatible with gmail / peer review and text - add some additional fixes for problems found on test --- .../process/RequestEMailProcessor.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/org.adempiere.base.process/src/org/compiere/process/RequestEMailProcessor.java b/org.adempiere.base.process/src/org/compiere/process/RequestEMailProcessor.java index f6ac500331..fc47d96420 100644 --- a/org.adempiere.base.process/src/org/compiere/process/RequestEMailProcessor.java +++ b/org.adempiere.base.process/src/org/compiere/process/RequestEMailProcessor.java @@ -38,10 +38,10 @@ import javax.mail.Multipart; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; -import javax.swing.text.html.HTMLDocument.HTMLReader.IsindexAction; import org.adempiere.exceptions.AdempiereException; import org.compiere.model.MAttachment; +import org.compiere.model.MColumn; import org.compiere.model.MRequest; import org.compiere.model.MUser; import org.compiere.util.CLogMgt; @@ -311,6 +311,8 @@ public class RequestEMailProcessor extends SvrProcess Message[] deleted = inbox.expunge(); noRequest++; + } else { + noError++; } } catch (Exception e) { if (log.isLoggable(Level.INFO)) log.info("message " + hdrs[0] + " threw error"); @@ -371,20 +373,27 @@ public class RequestEMailProcessor extends SvrProcess } // Message-ID as documentNo String[] hdrs = msg.getHeader("Message-ID"); + // set DocumentNo + int maxlen = MColumn.get(getCtx(), MRequest.Table_Name, MRequest.COLUMNNAME_DocumentNo).getFieldLength(); + String documentNo = hdrs[0]; + if (documentNo.startsWith("<") && documentNo.endsWith(">")) + documentNo = documentNo.substring(1, documentNo.length()-1); + if (documentNo.length() > maxlen) + documentNo = documentNo.substring(0,30); // Review if the e-mail was already created, comparing Message-ID+From+body int retValuedup = 0; - String sqldup = "select r_request_id from r_request " - + "where ad_client_id = ? " - + "and documentno = ? " - + "and startdate = ?"; + String sqldup = "SELECT R_Request_ID FROM R_Request " + + "WHERE AD_Client_ID = ? " + + "AND DocumentNo = ? " + + "AND StartDate = ?"; PreparedStatement pstmtdup = null; ResultSet rsdup = null; try { pstmtdup = DB.prepareStatement (sqldup, null); pstmtdup.setInt(1, getAD_Client_ID()); - pstmtdup.setString(2, hdrs[0].substring(0,30)); + pstmtdup.setString(2, documentNo); pstmtdup.setTimestamp(3, new Timestamp(msg.getSentDate().getTime())); rsdup = pstmtdup.executeQuery (); if (rsdup.next ()) @@ -463,8 +472,7 @@ public class RequestEMailProcessor extends SvrProcess msgreq = new StringBuilder("FROM: ") .append(from[0].toString()).append("\n").append(getMessage(msg)); req.setResult(msgreq.toString()); // Message-ID as documentNo - if (hdrs != null) - req.setDocumentNo(hdrs[0].substring(0,30)); + req.setDocumentNo(documentNo); // Default request type for this process if (R_RequestType_ID > 0) @@ -555,9 +563,8 @@ public class RequestEMailProcessor extends SvrProcess String disposition = part.getDisposition(); - if ((disposition != null) && - ((disposition.equals(Part.ATTACHMENT) || - (disposition.equals(Part.INLINE))))) { + if ( disposition != null + && (disposition.equalsIgnoreCase(Part.ATTACHMENT) || disposition.equalsIgnoreCase(Part.INLINE))) { MAttachment attach = req.createAttachment(); From af43f27785d75c99d5b35f078d1112f0dbf96358 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 23 Apr 2014 18:18:58 -0500 Subject: [PATCH 6/6] IDEMPIERE-1912 Document Action Access bug / thanks to hieplq --- .../src/org/compiere/model/MRole.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MRole.java b/org.adempiere.base/src/org/compiere/model/MRole.java index 93a8ee1f4d..9a19c7c78c 100644 --- a/org.adempiere.base/src/org/compiere/model/MRole.java +++ b/org.adempiere.base/src/org/compiere/model/MRole.java @@ -2581,12 +2581,15 @@ public final class MRole extends X_AD_Role while (rs.next()) { String op = rs.getString(1); String active=rs.getString(2); - if ("N".equals(active) && validOptions.contains(op)) { - validOptions.remove(op); + if ("N".equals(active)) { + if (validOptions.contains(op)) { + validOptions.remove(op); + } } else { - if (!validOptions.contains(op)) - validOptions.add(op); - } + if (!validOptions.contains(op)) { + validOptions.add(op); + } + } } }