Search in sources :

Example 81 with Account

use of com.fsck.k9.Account in project k-9 by k9mail.

the class NotificationIdsTest method getAuthenticationErrorNotificationId_forIncomingServerWithDefaultAccount.

@Test
public void getAuthenticationErrorNotificationId_forIncomingServerWithDefaultAccount() throws Exception {
    Account account = createMockAccountWithAccountNumber(0);
    int notificationId = NotificationIds.getAuthenticationErrorNotificationId(account, INCOMING);
    assertEquals(3, notificationId);
}
Also used : Account(com.fsck.k9.Account) Test(org.junit.Test)

Example 82 with Account

use of com.fsck.k9.Account in project k-9 by k9mail.

the class NotificationIdsTest method getFetchingMailNotificationId_withDefaultAccount.

@Test
public void getFetchingMailNotificationId_withDefaultAccount() throws Exception {
    Account account = createMockAccountWithAccountNumber(0);
    int notificationId = NotificationIds.getFetchingMailNotificationId(account);
    assertEquals(5, notificationId);
}
Also used : Account(com.fsck.k9.Account) Test(org.junit.Test)

Example 83 with Account

use of com.fsck.k9.Account in project k-9 by k9mail.

the class NotificationIdsTest method getSendFailedNotificationId_withSecondAccount.

@Test
public void getSendFailedNotificationId_withSecondAccount() throws Exception {
    Account account = createMockAccountWithAccountNumber(1);
    int notificationId = NotificationIds.getSendFailedNotificationId(account);
    assertEquals(15, notificationId);
}
Also used : Account(com.fsck.k9.Account) Test(org.junit.Test)

Example 84 with Account

use of com.fsck.k9.Account in project k-9 by k9mail.

the class WearNotificationsTest method testAddSummaryActions.

@Test
public void testAddSummaryActions() throws Exception {
    disableOptionalSummaryActions();
    int notificationId = NotificationIds.getNewMailSummaryNotificationId(account);
    ArrayList<MessageReference> messageReferences = createMessageReferenceList();
    NotificationData notificationData = createNotificationData(messageReferences);
    PendingIntent markAllAsReadPendingIntent = createFakePendingIntent(1);
    when(actionCreator.getMarkAllAsReadPendingIntent(account, messageReferences, notificationId)).thenReturn(markAllAsReadPendingIntent);
    wearNotifications.addSummaryActions(builder, notificationData);
    verifyExtendWasOnlyCalledOnce();
    verifyAddAction(R.drawable.ic_action_mark_as_read_dark, "Mark All Read", markAllAsReadPendingIntent);
    verifyNumberOfActions(1);
}
Also used : PendingIntent(android.app.PendingIntent) MessageReference(com.fsck.k9.activity.MessageReference) Test(org.junit.Test)

Example 85 with Account

use of com.fsck.k9.Account in project k-9 by k9mail.

the class SmtpTransport method open.

@Override
public void open() throws MessagingException {
    try {
        boolean secureConnection = false;
        InetAddress[] addresses = InetAddress.getAllByName(mHost);
        for (int i = 0; i < addresses.length; i++) {
            try {
                SocketAddress socketAddress = new InetSocketAddress(addresses[i], mPort);
                if (mConnectionSecurity == ConnectionSecurity.SSL_TLS_REQUIRED) {
                    mSocket = mTrustedSocketFactory.createSocket(null, mHost, mPort, mClientCertificateAlias);
                    mSocket.connect(socketAddress, SOCKET_CONNECT_TIMEOUT);
                    secureConnection = true;
                } else {
                    mSocket = new Socket();
                    mSocket.connect(socketAddress, SOCKET_CONNECT_TIMEOUT);
                }
            } catch (SocketException e) {
                if (i < (addresses.length - 1)) {
                    // there are still other addresses for that host to try
                    continue;
                }
                throw new MessagingException("Cannot connect to host", e);
            }
            // connection success
            break;
        }
        // RFC 1047
        mSocket.setSoTimeout(SOCKET_READ_TIMEOUT);
        mIn = new PeekableInputStream(new BufferedInputStream(mSocket.getInputStream(), 1024));
        mOut = new BufferedOutputStream(mSocket.getOutputStream(), 1024);
        // Eat the banner
        executeCommand(null);
        InetAddress localAddress = mSocket.getLocalAddress();
        String localHost = getCanonicalHostName(localAddress);
        String ipAddr = localAddress.getHostAddress();
        if (localHost.equals("") || localHost.equals(ipAddr) || localHost.contains("_")) {
            // characters (see issue 2143), so use IP address.
            if (!ipAddr.equals("")) {
                if (localAddress instanceof Inet6Address) {
                    localHost = "[IPv6:" + ipAddr + "]";
                } else {
                    localHost = "[" + ipAddr + "]";
                }
            } else {
                // If the IP address is no good, set a sane default (see issue 2750).
                localHost = "android";
            }
        }
        Map<String, String> extensions = sendHello(localHost);
        m8bitEncodingAllowed = extensions.containsKey("8BITMIME");
        mEnhancedStatusCodesProvided = extensions.containsKey("ENHANCEDSTATUSCODES");
        if (mConnectionSecurity == ConnectionSecurity.STARTTLS_REQUIRED) {
            if (extensions.containsKey("STARTTLS")) {
                executeCommand("STARTTLS");
                mSocket = mTrustedSocketFactory.createSocket(mSocket, mHost, mPort, mClientCertificateAlias);
                mIn = new PeekableInputStream(new BufferedInputStream(mSocket.getInputStream(), 1024));
                mOut = new BufferedOutputStream(mSocket.getOutputStream(), 1024);
                /*
                     * Now resend the EHLO. Required by RFC2487 Sec. 5.2, and more specifically,
                     * Exim.
                     */
                extensions = sendHello(localHost);
                secureConnection = true;
            } else {
                /*
                     * This exception triggers a "Certificate error"
                     * notification that takes the user to the incoming
                     * server settings for review. This might be needed if
                     * the account was configured with an obsolete
                     * "STARTTLS (if available)" setting.
                     */
                throw new CertificateValidationException("STARTTLS connection security not available");
            }
        }
        boolean authLoginSupported = false;
        boolean authPlainSupported = false;
        boolean authCramMD5Supported = false;
        boolean authExternalSupported = false;
        boolean authXoauth2Supported = false;
        if (extensions.containsKey("AUTH")) {
            List<String> saslMech = Arrays.asList(extensions.get("AUTH").split(" "));
            authLoginSupported = saslMech.contains("LOGIN");
            authPlainSupported = saslMech.contains("PLAIN");
            authCramMD5Supported = saslMech.contains("CRAM-MD5");
            authExternalSupported = saslMech.contains("EXTERNAL");
            authXoauth2Supported = saslMech.contains("XOAUTH2");
        }
        parseOptionalSizeValue(extensions);
        if (!TextUtils.isEmpty(mUsername) && (!TextUtils.isEmpty(mPassword) || AuthType.EXTERNAL == mAuthType || AuthType.XOAUTH2 == mAuthType)) {
            switch(mAuthType) {
                /*
                 * LOGIN is an obsolete option which is unavailable to users,
                 * but it still may exist in a user's settings from a previous
                 * version, or it may have been imported.
                 */
                case LOGIN:
                case PLAIN:
                    // try saslAuthPlain first, because it supports UTF-8 explicitly
                    if (authPlainSupported) {
                        saslAuthPlain(mUsername, mPassword);
                    } else if (authLoginSupported) {
                        saslAuthLogin(mUsername, mPassword);
                    } else {
                        throw new MessagingException("Authentication methods SASL PLAIN and LOGIN are unavailable.");
                    }
                    break;
                case CRAM_MD5:
                    if (authCramMD5Supported) {
                        saslAuthCramMD5(mUsername, mPassword);
                    } else {
                        throw new MessagingException("Authentication method CRAM-MD5 is unavailable.");
                    }
                    break;
                case XOAUTH2:
                    if (authXoauth2Supported && oauthTokenProvider != null) {
                        saslXoauth2(mUsername);
                    } else {
                        throw new MessagingException("Authentication method XOAUTH2 is unavailable.");
                    }
                    break;
                case EXTERNAL:
                    if (authExternalSupported) {
                        saslAuthExternal(mUsername);
                    } else {
                        /*
                         * Some SMTP servers are known to provide no error
                         * indication when a client certificate fails to
                         * validate, other than to not offer the AUTH EXTERNAL
                         * capability.
                         *
                         * So, we treat it is an error to not offer AUTH
                         * EXTERNAL when using client certificates. That way, the
                         * user can be notified of a problem during account setup.
                         */
                        throw new CertificateValidationException(MissingCapability);
                    }
                    break;
                /*
                 * AUTOMATIC is an obsolete option which is unavailable to users,
                 * but it still may exist in a user's settings from a previous
                 * version, or it may have been imported.
                 */
                case AUTOMATIC:
                    if (secureConnection) {
                        // try saslAuthPlain first, because it supports UTF-8 explicitly
                        if (authPlainSupported) {
                            saslAuthPlain(mUsername, mPassword);
                        } else if (authLoginSupported) {
                            saslAuthLogin(mUsername, mPassword);
                        } else if (authCramMD5Supported) {
                            saslAuthCramMD5(mUsername, mPassword);
                        } else {
                            throw new MessagingException("No supported authentication methods available.");
                        }
                    } else {
                        if (authCramMD5Supported) {
                            saslAuthCramMD5(mUsername, mPassword);
                        } else {
                            /*
                             * We refuse to insecurely transmit the password
                             * using the obsolete AUTOMATIC setting because of
                             * the potential for a MITM attack. Affected users
                             * must choose a different setting.
                             */
                            throw new MessagingException("Update your outgoing server authentication setting. AUTOMATIC auth. is unavailable.");
                        }
                    }
                    break;
                default:
                    throw new MessagingException("Unhandled authentication method found in the server settings (bug).");
            }
        }
    } catch (MessagingException e) {
        close();
        throw e;
    } catch (SSLException e) {
        close();
        throw new CertificateValidationException(e.getMessage(), e);
    } catch (GeneralSecurityException gse) {
        close();
        throw new MessagingException("Unable to open connection to SMTP server due to security error.", gse);
    } catch (IOException ioe) {
        close();
        throw new MessagingException("Unable to open connection to SMTP server.", ioe);
    }
}
Also used : SocketException(java.net.SocketException) MessagingException(com.fsck.k9.mail.MessagingException) InetSocketAddress(java.net.InetSocketAddress) GeneralSecurityException(java.security.GeneralSecurityException) PeekableInputStream(com.fsck.k9.mail.filter.PeekableInputStream) Inet6Address(java.net.Inet6Address) IOException(java.io.IOException) SSLException(javax.net.ssl.SSLException) BufferedInputStream(java.io.BufferedInputStream) CertificateValidationException(com.fsck.k9.mail.CertificateValidationException) SocketAddress(java.net.SocketAddress) InetSocketAddress(java.net.InetSocketAddress) InetAddress(java.net.InetAddress) BufferedOutputStream(java.io.BufferedOutputStream) Socket(java.net.Socket)

Aggregations

Account (com.fsck.k9.Account)122 Test (org.junit.Test)81 MessagingException (com.fsck.k9.mail.MessagingException)53 LocalFolder (com.fsck.k9.mailstore.LocalFolder)44 LocalMessage (com.fsck.k9.mailstore.LocalMessage)43 LocalStore (com.fsck.k9.mailstore.LocalStore)42 ArrayList (java.util.ArrayList)34 MessageReference (com.fsck.k9.activity.MessageReference)32 Message (com.fsck.k9.mail.Message)29 Folder (com.fsck.k9.mail.Folder)27 UnavailableStorageException (com.fsck.k9.mailstore.UnavailableStorageException)25 MimeMessage (com.fsck.k9.mail.internet.MimeMessage)22 IOException (java.io.IOException)22 Cursor (android.database.Cursor)21 CertificateValidationException (com.fsck.k9.mail.CertificateValidationException)20 Store (com.fsck.k9.mail.Store)20 SearchAccount (com.fsck.k9.search.SearchAccount)20 PendingIntent (android.app.PendingIntent)19 Pop3Store (com.fsck.k9.mail.store.pop3.Pop3Store)19 AuthenticationFailedException (com.fsck.k9.mail.AuthenticationFailedException)18