Example #1
0
        private void initConnection(bool noUI, string path, bool clientNotRequired)
        {
            ID = _id++;

            if (P4.LogFile.ExternalLogFn == null)
            {
                P4.LogFile.LogMessageDelgate logfn = new LogFile.LogMessageDelgate(FileLogger.LogMessage);
                P4.LogFile.SetLoggingFunction(logfn);
            }

            // reset bool on init
            ssoSuccess = true;

            _disconnected = true;

            if (Repository != null)
            {
                Repository.Dispose();
                Repository = null;
            }

            while (Repository == null)
            {
                // Get connection settings from dialog, if UI required
                if (!noUI)
                {
                    // reset the SSO bool, so login will be attempted again
                    ssoSuccess = true;
                    // Open Connection dialog
                    DialogResult result = connectionDialog();
                    if (result == DialogResult.Cancel)
                    {
                        return;
                    }
                }

                // Get the credentials for the Perforce Server
                try
                {
                    // Get configuration
                    getConfiguration(path);

                    // Create repository from server connection
                    Repository = RepositoryFactory.get(Port, User, Workspace);

                    // set Swarm here since Login will check Swarm availability
                    Swarm = new Swarm(Repository, User);
                    if (string.IsNullOrEmpty(Workspace) && !clientNotRequired)
                    {
                        DialogResult res = P4ErrorDlg.Show(Resources.P4ScmProvider_WorkspaceEnvUnset,
                                                           false, false);
                        P4VsProvider.BroadcastNewConnection(null);
                        return;
                    }

                    if (Repository == null ||
                        Repository.Connection.Status == P4.ConnectionStatus.Disconnected)
                    {
                        Repository = null;
                        continue;
                    }

                    // Set configuration
                    setConfiguration();

                    // Check API level of server is greater than 28 (2009.2)
                    checkApiLevel(28);

                    // set Swarm here since Login will check Swarm availability
                    Swarm = new Swarm(Repository, User);

                    // Login if required
                    if (!string.IsNullOrEmpty(User) && !isLoggedIn())
                    {
                        if (!ssoSuccess)
                        {
                            break;
                        }
                        LoginResult loginResult = Login();
                        if (loginResult == LoginResult.HASTimeout)
                        {
                            P4VS.UI.P4VSMessage p4VSMessage = new P4VS.UI.P4VSMessage(Resources.P4VS,
                                                                                      string.Format(Resources.HAS_Auth_Fail,
                                                                                                    Repository.Connection.UserName, Repository.Connection.Server.Address.Uri));
                            p4VSMessage.ShowDialog();
                            return;
                        }
                        if (loginResult == LoginResult.Fail)
                        {
                            Repository = null;
                            continue;
                        }
                    }

                    // Exit if no client defined
                    if (!string.IsNullOrEmpty(User) && !string.IsNullOrEmpty(Workspace))
                    {
                        setWorkspace();

                        // Save Connection as User and Workspace are good
                        saveRecentConnection();
                    }
                    else
                    {
                        logger.Warn("Workspace not initialised.");
                    }

                    if (Repository.Connection.Server.Metadata.UnicodeEnabled)
                    {
                        string cs = Repository.Connection.CharacterSetName;
                        string m  = string.Format(Resources.P4ScmProvider_ConnectingToUnicodeServer, cs);
                        P4VsOutputWindow.AppendMessage(m);
                        FileLogger.LogMessage(3, "P4ScmProvider", m);
                    }

                    // Subscribe to the output events to display results in the command window
                    Repository.Connection.InfoResultsReceived  += CommandLine.InfoResultsCallbackFn;
                    Repository.Connection.ErrorReceived        += CommandLine.ErrorCallbackFn;
                    Repository.Connection.TextResultsReceived  += CommandLine.TextResultsCallbackFn;
                    Repository.Connection.TaggedOutputReceived += CommandLine.TaggedOutputCallbackFn;
                    Repository.Connection.CommandEcho          += CommandLine.CommandEchoCallbackFn;

                    _disconnected = false;

                    // Connection OK, break out of loop
                    break;
                }
                catch (P4Exception ex)
                {
                    if (ex.ErrorCode == P4.P4ClientError.MsgServer_Login2Required)
                    {
                        P4VsProvider.CurrentScm = new P4ScmProvider(null);
                        if (P4VsProvider.CurrentScm.LaunchHelixMFA(User, Port) == 0)
                        {
                            noUI = true;
                            initConnection(noUI, path, clientNotRequired);
                        }
                    }
                    else
                    {
                        logger.Trace("caught an Exception: {0}\r\n{1}", ex.Message, ex.StackTrace);
                        if (Repository != null)
                        {
                            Repository.Dispose();
                            Repository = null;
                        }
                        MessageBox.Show(ex.Message, Resources.P4VS, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        P4VsOutputWindow.AppendMessage(ex.Message);
                    }
                    // If we're not showing the connection dialog return a null
                    if (noUI)
                    {
                        return;
                    }
                }
                catch (Exception ex)
                {
                    logger.Trace("caught an Exception: {0}\r\n{1}", ex.Message, ex.StackTrace);
                    if (Repository != null)
                    {
                        Repository.Dispose();
                        Repository = null;
                    }
                    MessageBox.Show(ex.Message, Resources.P4VS, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    P4VsOutputWindow.AppendMessage(ex.Message);

                    // If we're not showing the login dialog return a null as the credentials are bad
                    if (noUI)
                    {
                        return;
                    }
                }
            }

            Repository.Connection.KeepAlive    = new KeepAliveMonitor();
            JobsToolWindowControl.GotJobFields = false;
        }
Example #2
0
        private bool Login(string password)
        {
            // if Swarm is null, don't attempt to set this
            if (Swarm != null)
            {
                Swarm.SwarmCredential = null;
            }

            // unsure if this currently works with legacy SSO script support, but
            // leaving it in as it is harmless if ssoScript is null and if not,
            // it should be the same as the ssoVar found in Login()
            string ssoScript = Environment.GetEnvironmentVariable("P4LOGINSSO");

            if (ssoScript != null)
            {
                password = "******"; // dummy value server will not prompt for a password when using SSO
                logger.Debug("Using SSO: {0}", ssoScript);
            }

            try
            {
                bool UseAllHostTicket = !Preferences.LocalSettings.GetBool("Use_IP", false);
                if (string.IsNullOrEmpty(password) != true)
                {
                    // always first login on the local machine for an 'all machines token, as we can't read the property
                    // to see if swarm is enabled till we log in
                    logger.Debug("Logging in to local machine");
                    LoginCmdOptions opts       = new LoginCmdOptions(LoginCmdFlags.AllHosts, null);
                    P4.Credential   Credential = Repository.Connection.Login(password, opts);
                    if (Credential != null)
                    {
                        // Now we can see if Swarm is enabled as since we logged in
                        // the property to see if swarm is enabled
                        Swarm.CheckForSwarm();
                        if (Swarm.SwarmEnabled)
                        {
                            Swarm.SwarmCredential = Credential;
                        }
                        if (Credential.Expires != DateTime.MaxValue)
                        {
                            string msg = string.Format(Resources.P4ScmProvider_LoginLoginExpireInfo, Credential.Expires);
                            P4VsOutputWindow.AppendMessage(msg);
                        }
                        return(true);
                    }
                    else if (Repository.Connection.LastResults.ErrorList != null)
                    {
                        // the error code for an SSO login fail will be sent by the trigger
                        // so it will be a trigger failed message.
                        if (Repository.Connection.LastResults.ErrorList[0].ErrorCode == P4.P4ClientError.MsgServer_TriggerFailed)
                        {
                            P4VsOutputWindow.AppendMessage(Repository.Connection.LastResults.ErrorList[0].ErrorMessage);
                            MessageBox.Show(Repository.Connection.LastResults.ErrorList[0].ErrorMessage,
                                            Resources.P4VS, MessageBoxButtons.OK, MessageBoxIcon.Error);
                            ssoSuccess = false;
                            return(true);
                        }
                        // Or if it is a fatal error, display that as well. This can
                        // happen if the P4LOGINSSO is set but the agent does not
                        // exist. Likely an edge case.
                        foreach (P4ClientError e in Repository.Connection.LastResults.ErrorList)
                        {
                            if (e.SeverityLevel == ErrorSeverity.E_FATAL)
                            {
                                P4VsOutputWindow.AppendMessage(Repository.Connection.LastResults.ErrorList[0].ErrorMessage);
                                MessageBox.Show(Repository.Connection.LastResults.ErrorList[0].ErrorMessage,
                                                Resources.P4VS, MessageBoxButtons.OK, MessageBoxIcon.Error);
                                ssoSuccess = false;
                                return(true);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                P4Exception p4ex = ex as P4Exception;
                if (p4ex.ErrorCode == P4.P4ClientError.MsgServer_Login2Required)
                {
                    throw p4ex;
                }
                P4VsOutputWindow.AppendMessage(ex.Message);
                MessageBox.Show(ex.Message, Resources.P4VS, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return(false);
        }