コード例 #1
0
        private void executeAsyncEvent(AsyncEventDetail aeDetail)
        {
            switch (aeDetail.eventType)
            {
            case AsyncEventDetail.EventType.NEEDSTR:
                ProcessAsyncEventNeedStr(aeDetail);
                break;

            // a password is requested
            case AsyncEventDetail.EventType.PASSWORD:
                ProcessAsyncEventPassword(aeDetail);
                break;

            // a hold state is signalized
            case AsyncEventDetail.EventType.HOLD:
                ProcessAsyncEventHold(aeDetail);
                break;

            case AsyncEventDetail.EventType.INFO:
                break;

            // the internal state changed
            case AsyncEventDetail.EventType.STATE:
                ProcessAsyncEventState(aeDetail);
                break;

            // we got a "log"
            case AsyncEventDetail.EventType.LOG:
                ProcessAsyncEventLog(aeDetail);
                break;
            }
        }
コード例 #2
0
        private void ProcessAsyncEventState(AsyncEventDetail aeDetail)
        {
            string[] details = aeDetail.getInfos();

            // otherwise, we automatically reconnect
            m_ovpn.State.ChangeVPNState(details);

            m_logs.logLine(LogType.State,
                           aeDetail.getInfos()[1]);
        }
コード例 #3
0
        private void ProcessAsyncEventNeedStr(AsyncEventDetail aeDetail)
        {
            switch (aeDetail.getInfos()[0])
            {
            // A SmartCard ID is requested
            case "pkcs11-id-request":
                m_logs.logDebugLine(3,"Got Request for pkcs11-id");

                setLock(WaitState.PKCS11_GET_COUNT);
                m_ovpnComm.send("pkcs11-id-count");
                break;
            }
        }
コード例 #4
0
        /// <summary>
        /// We got an asynchronous event (e.g. a log message).
        /// </summary>
        /// <param name="aeDetail">details about the event</param>
        public void got_asyncEvent(AsyncEventDetail aeDetail)
        {
            m_logs.logDebugLine(4,"Extracted async event: " +
                                aeDetail.eventType.ToString() + ": " + aeDetail.message);

            // if we can't execute just queue it
            try
            {
                Monitor.Enter(m_todo);
                if (m_state != WaitState.NULL)
                {
                    m_todo.Add(aeDetail);
                    return;
                }
            }
            finally
            {
                Monitor.Exit(m_todo);
            }
            executeAsyncEvent(aeDetail);
        }
コード例 #5
0
        private void ProcessAsyncEventHold(AsyncEventDetail aeDetail)
        {
            // it is released
            if (aeDetail.message.Contains("Waiting") && m_releaselock)
            {
                /*
                 * enable logging
                 * (this is a trick to get all logs, because at the
                 * beginning, the hold state is set)
                 */

                if (m_receiveOldLogs)
                {
                    setLock(WaitState.LOG_ON_ALL_1);
                    m_ovpnComm.send("log on all");
                    m_receiveOldLogs = false;
                }
                else
                {
                    setLock(WaitState.LOG_ON_ALL_2);
                    m_ovpnComm.send("log on");
                }
            }
        }
コード例 #6
0
        /// <summary>
        /// We got an asynchronous event (e.g. a log message).
        /// </summary>
        /// <param name="aeDetail">details about the event</param>
        public void got_asyncEvent(AsyncEventDetail aeDetail)
        {
            m_logs.logDebugLine(4, "Extracted async event: " + 
                aeDetail.eventType.ToString() + ": " + aeDetail.message);

            // if we can't execute just queue it
            if (m_state != WaitState.NULL)
                try
                {
                    Monitor.Enter(m_todo);
                    m_todo.Add(aeDetail);
                    return;
                }
                finally
                {
                    Monitor.Exit(m_todo);
                }
            
            switch (aeDetail.eventType)
            {
                case AsyncEventDetail.EventType.NEEDSTR:

                    switch (aeDetail.getInfos()[0])
                    {

                        // A SmartCard ID is requested
                        case "pkcs11-id-request":
                            m_logs.logDebugLine(3, "Got Request for pkcs11-id");

                            setLock(WaitState.PKCS11_GET_COUNT);
                            m_ovpnComm.send("pkcs11-id-count");
                            break;
                    }
                        
                    break;

                // a password is requested
                case AsyncEventDetail.EventType.PASSWORD:
                    string pwType = aeDetail.getInfos()[0]; // "Auth" or "Private Key", or ...
                    string pwInfo = aeDetail.getInfos()[1]; // "password" or "username/password"
                    string pwMsg = aeDetail.getInfos()[2];  // "Need" or "Verification Failed"

                    if (pwMsg.Equals("Need"))
                    {
                        if (pwType.Equals("Auth") && pwInfo.Equals("username/password"))
                        {
                            // Ask for username/password
                            string[] loginInfo = m_ovpn.getLoginPass(pwType);
                            if (loginInfo != null)
                            {
                                string username = loginInfo[0];
                                string password = loginInfo[1];
                                if (username != null && pwType.Length > 0 &&
                                    password != null && password.Length > 0)
                                {
                                    m_ovpnComm.send("username '" + pwType + "' " +
                                            m_ovpnMParser.encodeMsg(username));
                                    m_ovpnComm.send("password '" + pwType + "' " +
                                            m_ovpnMParser.encodeMsg(password));
                                }
                            }

                        }
                        else
                        {
                            string pw = m_ovpn.getPW(pwType);
                            if (pw != null)
                            {
                                if (pw.Length > 0)
                                {
                                    m_ovpnComm.send("password '" + pwType + "' " +
                                        m_ovpnMParser.encodeMsg(pw));
                                }
                            }
                        }
                    }
                    else if (pwMsg.CompareTo("Verification Failed") == 0)
                    {
                        m_logs.logDebugLine(1, "Authentication Failed said remote server");
                    }
                    else
                    {
                        m_logs.logDebugLine(1, "Unknown 'PASSWORD' reply from remote server: " + pwMsg);
                    }

                    break;

                // a hold state is signalized
                case AsyncEventDetail.EventType.HOLD:
                    // it is released
                    if (aeDetail.message.Contains("Waiting"))
                    {
                        /* 
                         * enable logging
                         * (this is a trick to get all logs, because at the
                         * beginning, the hold state is set)
                         */
                        setLock(WaitState.LOG_ON_ALL_1);
                        m_ovpnComm.send("log on all");
                    }
                    break;

                case AsyncEventDetail.EventType.INFO:
                    break;

                // the internal state changed
                case AsyncEventDetail.EventType.STATE:
                    m_ovpn.changeVPNState(aeDetail.getInfos());
                    m_logs.logLine(OVPNLogEventArgs.LogType.STATE,
                        aeDetail.getInfos()[1]);
                    break;

                // we got a "log"
                case AsyncEventDetail.EventType.LOG:
                    addLog(aeDetail.message);
                    break;
            }
        }
コード例 #7
0
        private void ProcessAsyncEventPassword(AsyncEventDetail aeDetail)
        {
            string pwType = aeDetail.getInfos()[0]; // "Auth" or "Private Key", or ...
            string pwInfo = aeDetail.getInfos()[1]; // "password" or "username/password"
            string pwMsg  = aeDetail.getInfos()[2]; // "Need" or "Verification Failed"

            if (pwMsg.Equals("Need",System.StringComparison.OrdinalIgnoreCase))
            {
                if (pwType.Equals("Auth",
                                  System.StringComparison.OrdinalIgnoreCase) &&
                    pwInfo.Equals("username/password",
                                  System.StringComparison.OrdinalIgnoreCase))
                {
                    // Ask for username/password
                    string[] loginInfo    = m_ovpn.getLoginPass(pwType);
                    bool     sendUserPass = false;
                    if (loginInfo != null)
                    {
                        string username = loginInfo[0];
                        string password = loginInfo[1];
                        if (username != null && pwType.Length > 0 &&
                            password != null && password.Length > 0)
                        {
                            m_ovpnComm.send("username '" + pwType + "' " +
                                            ManagementParser.encodeMsg(username));
                            //wait for processing by OpenVPN or it might not always process the password correctly.
                            m_ovpnComm.processManagementConnectionLine();
                            m_ovpnComm.send("password '" + pwType + "' " +
                                            ManagementParser.encodeMsg(password));
                            sendUserPass = true;
                        }
                    }
                    if (!sendUserPass)
                    {
                        // Send 'bogus' user and pass to keep OpenVPN from quiting on disconnect.. (WORKAROUND)
                        m_ovpnComm.send("username '" + pwType + "' -");
                        m_ovpnComm.send("password '" + pwType + "' -");
                    }
                }
                else
                {
                    string pw = m_ovpn.getPW(pwType);
                    if (pw != null)
                    {
                        if (pw.Length > 0)
                        {
                            m_ovpnComm.send("password '" + pwType + "' " +
                                            ManagementParser.encodeMsg(pw));
                        }
                    }
                }
            }
            else if (pwMsg.Equals("Verification Failed",
                                  System.StringComparison.OrdinalIgnoreCase))
            {
                m_logs.logDebugLine(1,"Authentication Failed said remote server");
            }
            else
            {
                m_logs.logDebugLine(1,"Unknown 'PASSWORD' reply from remote server: " + pwMsg);
            }
        }
コード例 #8
0
 private void ProcessAsyncEventLog(AsyncEventDetail aeDetail)
 {
     addLog(aeDetail.message);
 }
コード例 #9
0
        /// <summary>
        /// We got an asynchronous event (e.g. a log message).
        /// </summary>
        /// <param name="aeDetail">details about the event</param>
        public void got_asyncEvent(AsyncEventDetail aeDetail)
        {
            m_logs.logDebugLine(4,"Extracted async event: " +
                                aeDetail.eventType.ToString() + ": " + aeDetail.message);

            // if we can't execute just queue it
            if (m_state != WaitState.NULL)
            {
                try
                {
                    Monitor.Enter(m_todo);
                    m_todo.Add(aeDetail);
                    return;
                }
                finally
                {
                    Monitor.Exit(m_todo);
                }
            }

            switch (aeDetail.eventType)
            {
            case AsyncEventDetail.EventType.NEEDSTR:

                switch (aeDetail.getInfos()[0])
                {
                // A SmartCard ID is requested
                case "pkcs11-id-request":
                    m_logs.logDebugLine(3,"Got Request for pkcs11-id");

                    setLock(WaitState.PKCS11_GET_COUNT);
                    m_ovpnComm.send("pkcs11-id-count");
                    break;
                }

                break;

            // a password is requested
            case AsyncEventDetail.EventType.PASSWORD:
                string pwType = aeDetail.getInfos()[0];     // "Auth" or "Private Key", or ...
                string pwInfo = aeDetail.getInfos()[1];     // "password" or "username/password"
                string pwMsg  = aeDetail.getInfos()[2];     // "Need" or "Verification Failed"

                if (pwMsg.Equals("Need"))
                {
                    if (pwType.Equals("Auth") && pwInfo.Equals("username/password"))
                    {
                        // Ask for username/password
                        string[] loginInfo = m_ovpn.getLoginPass(pwType);
                        if (loginInfo != null)
                        {
                            string username = loginInfo[0];
                            string password = loginInfo[1];
                            if (username != null && pwType.Length > 0 &&
                                password != null && password.Length > 0)
                            {
                                m_ovpnComm.send("username '" + pwType + "' " +
                                                m_ovpnMParser.encodeMsg(username));
                                m_ovpnComm.send("password '" + pwType + "' " +
                                                m_ovpnMParser.encodeMsg(password));
                            }
                        }
                    }
                    else
                    {
                        string pw = m_ovpn.getPW(pwType);
                        if (pw != null)
                        {
                            if (pw.Length > 0)
                            {
                                m_ovpnComm.send("password '" + pwType + "' " +
                                                m_ovpnMParser.encodeMsg(pw));
                            }
                        }
                    }
                }
                else if (pwMsg.CompareTo("Verification Failed") == 0)
                {
                    m_logs.logDebugLine(1,"Authentication Failed said remote server");
                }
                else
                {
                    m_logs.logDebugLine(1,"Unknown 'PASSWORD' reply from remote server: " + pwMsg);
                }

                break;

            // a hold state is signalized
            case AsyncEventDetail.EventType.HOLD:
                // it is released
                if (aeDetail.message.Contains("Waiting"))
                {
                    /*
                     * enable logging
                     * (this is a trick to get all logs, because at the
                     * beginning, the hold state is set)
                     */
                    setLock(WaitState.LOG_ON_ALL_1);
                    m_ovpnComm.send("log on all");
                }
                break;

            case AsyncEventDetail.EventType.INFO:
                break;

            // the internal state changed
            case AsyncEventDetail.EventType.STATE:
                m_ovpn.changeVPNState(aeDetail.getInfos());
                m_logs.logLine(OVPNLogEventArgs.LogType.STATE,
                               aeDetail.getInfos()[1]);
                break;

            // we got a "log"
            case AsyncEventDetail.EventType.LOG:
                addLog(aeDetail.message);
                break;
            }
        }
コード例 #10
0
        private void ProcessAsyncEventPassword(AsyncEventDetail aeDetail)
        {
            string pwType = aeDetail.getInfos()[0]; // "Auth" or "Private Key", or ...
            string pwInfo = aeDetail.getInfos()[1]; // "password" or "username/password"
            string pwMsg = aeDetail.getInfos()[2];  // "Need" or "Verification Failed"

            if (pwMsg.Equals("Need", System.StringComparison.OrdinalIgnoreCase))
            {
                if (pwType.Equals("Auth",
                    System.StringComparison.OrdinalIgnoreCase) &&
                    pwInfo.Equals("username/password",
                    System.StringComparison.OrdinalIgnoreCase))
                {
                    // Ask for username/password
                    string[] loginInfo = m_ovpn.getLoginPass(pwType);
                    bool sendUserPass = false;
                    if (loginInfo != null)
                    {
                        string username = loginInfo[0];
                        string password = loginInfo[1];
                        if (username != null && pwType.Length > 0 &&
                            password != null && password.Length > 0)
                        {
                            m_ovpnComm.send("username '" + pwType + "' " +
                                ManagementParser.encodeMsg(username));
                            //wait for processing by OpenVPN or it might not always process the password correctly.
                            m_ovpnComm.processManagementConnectionLine();
                            m_ovpnComm.send("password '" + pwType + "' " +
                                ManagementParser.encodeMsg(password));
                            sendUserPass = true;
                        }
                    }
                    if (!sendUserPass)
                    {
                        // Send 'bogus' user and pass to keep OpenVPN from quiting on disconnect.. (WORKAROUND)
                        m_ovpnComm.send("username '" + pwType + "' -");
                        m_ovpnComm.send("password '" + pwType + "' -");
                    }

                }
                else
                {
                    string pw = m_ovpn.getPW(pwType);
                    if (pw != null)
                    {
                        if (pw.Length > 0)
                        {
                            m_ovpnComm.send("password '" + pwType + "' " +
                                ManagementParser.encodeMsg(pw));
                        }
                    }
                }
            }
            else if (pwMsg.Equals("Verification Failed",
                System.StringComparison.OrdinalIgnoreCase))
            {
                m_logs.logDebugLine(1, "Authentication Failed said remote server");
            }
            else
            {
                m_logs.logDebugLine(1, "Unknown 'PASSWORD' reply from remote server: " + pwMsg);
            }
        }
コード例 #11
0
        private void ProcessAsyncEventState(AsyncEventDetail aeDetail)
        {
            string[] details = aeDetail.getInfos();

            // otherwise, we automatically reconnect
            m_ovpn.State.ChangeVPNState(details);

            m_logs.logLine(LogType.State,
                aeDetail.getInfos()[1]);
        }
コード例 #12
0
        private void ProcessAsyncEventNeedStr(AsyncEventDetail aeDetail)
        {
            switch (aeDetail.getInfos()[0])
            {
                // A SmartCard ID is requested
                case "pkcs11-id-request":
                    m_logs.logDebugLine(3, "Got Request for pkcs11-id");

                    setLock(WaitState.PKCS11_GET_COUNT);
                    m_ovpnComm.send("pkcs11-id-count");
                    break;
            }
        }
コード例 #13
0
 private void ProcessAsyncEventLog(AsyncEventDetail aeDetail)
 {
     addLog(aeDetail.message);
 }
コード例 #14
0
        private void ProcessAsyncEventHold(AsyncEventDetail aeDetail)
        {
            // it is released
            if (aeDetail.message.Contains("Waiting") && m_releaselock)
            {
                /*
                 * enable logging
                 * (this is a trick to get all logs, because at the
                 * beginning, the hold state is set)
                 */

                if (m_receiveOldLogs)
                {
                    setLock(WaitState.LOG_ON_ALL_1);
                    m_ovpnComm.send("log on all");
                    m_receiveOldLogs = false;
                }
                else
                {
                    setLock(WaitState.LOG_ON_ALL_2);
                    m_ovpnComm.send("log on");
                }
            }
        }
コード例 #15
0
        private void executeAsyncEvent(AsyncEventDetail aeDetail)
        {
            switch (aeDetail.eventType)
            {
                case AsyncEventDetail.EventType.NEEDSTR:
                    ProcessAsyncEventNeedStr(aeDetail);
                    break;

                // a password is requested
                case AsyncEventDetail.EventType.PASSWORD:
                    ProcessAsyncEventPassword(aeDetail);
                    break;

                // a hold state is signalized
                case AsyncEventDetail.EventType.HOLD:
                    ProcessAsyncEventHold(aeDetail);
                    break;

                case AsyncEventDetail.EventType.INFO:
                    break;

                // the internal state changed
                case AsyncEventDetail.EventType.STATE:
                    ProcessAsyncEventState(aeDetail);
                    break;

                // we got a "log"
                case AsyncEventDetail.EventType.LOG:
                    ProcessAsyncEventLog(aeDetail);
                    break;
            }
        }
コード例 #16
0
        /// <summary>
        /// We got an asynchronous event (e.g. a log message).
        /// </summary>
        /// <param name="aeDetail">details about the event</param>
        public void got_asyncEvent(AsyncEventDetail aeDetail)
        {
            m_logs.logDebugLine(4, "Extracted async event: " +
                aeDetail.eventType.ToString() + ": " + aeDetail.message);

            // if we can't execute just queue it
            try
            {
                Monitor.Enter(m_todo);
                if (m_state != WaitState.NULL)
                {
                    m_todo.Add(aeDetail);
                    return;
                }
            }
            finally
            {
                Monitor.Exit(m_todo);
            }
            executeAsyncEvent(aeDetail);
        }