Public/Authentication/Connect-JCOnline.ps1

Function Connect-JCOnline ()
{
    [CmdletBinding(DefaultParameterSetName = 'Interactive')]

    param
    (
        [Parameter(
            ParameterSetName = 'force',
            Mandatory,
            ValueFromPipelineByPropertyName,
            Position = 0)]
        
        [Parameter(Mandatory = $True,
            ParameterSetName = 'Interactive',
            Position = 0,
            HelpMessage = "Please enter your JumpCloud API key. This can be found in the JumpCloud admin console within 'API Settings' accessible from the drop down icon next to the admin email address in the top right corner of the JumpCloud admin console.") ]
        [ValidateScript( {
                If (($_).Length -ne 40)
                {
                    Throw "Please enter your API key. This can be found in the JumpCloud admin console within 'API Settings' accessible from the drop down icon next to the admin email address in the top right corner of the JumpCloud admin console."
                }

                Else {$true}
            })]


        [string]$JumpCloudAPIKey,


        [Parameter(
            ParameterSetName = 'force',
            ValueFromPipelineByPropertyName,
            Position = 1)]
        
        [Parameter(
            ParameterSetName = 'Interactive',
            Position = 1,
            HelpMessage = "Using the JumpCloud multi tenant? Please enter your OrgID") ]

        [string]$JumpCloudOrgID,


        [Parameter(
            ParameterSetName = 'force')]
        [Switch]
        $force
    )

    begin
    {
        [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

        $GitHubModuleInfoURL = 'https://github.com/TheJumpCloud/support/blob/master/PowerShell/ModuleBanner.md'

        $ReleaseNotesURL = 'https://git.io/jc-pwsh-releasenotes'

        $hdrs = @{
            'Content-Type' = 'application/json'
            'Accept'       = 'application/json'
            'X-API-KEY'    = $JumpCloudAPIKey
        }

        $global:JCOrgID = $null
    }

    process
    {

        try
        {
            $ConnectionTestURL = "https://console.jumpcloud.com/api"
            Invoke-RestMethod -Method GET -Uri $ConnectionTestURL -Headers $hdrs -UserAgent 'Pwsh_1.7.0'  | Out-Null
        }
        catch
        {

            if (Test-MultiTenant -JumpCloudAPIKey $JumpCloudAPIKey)
            {

                if (-not $JumpCloudOrgID)
                {

                    Invoke-SetJCOrganization -JumpCloudAPIKey $JumpCloudAPIKey                    
                
                }

                else
                {
                    $global:JCOrgID = $JumpCloudOrgID

                    try
                    {
                        $hdrs.Add('x-org-id', "$($JCOrgID)")
                        $ConnectionTestURL = "https://console.jumpcloud.com/api"
                        Invoke-RestMethod -Method GET -Uri $ConnectionTestURL -Headers $hdrs -UserAgent 'Pwsh_1.7.0'  | Out-Null

                        if (-not $force)
                        {
                            Write-Host -BackgroundColor Green -ForegroundColor Black "Connected to JumpCloud Tenant OrgID: $JCOrgID"
                        }
                    }
                    catch
                    {
    
                        Write-Error "Incorrect OrgID OR no network connectivity. You can obtain your Organization ID below your Organization's Contact Information on the Settings page."
                        $global:JCOrgID = $null
                        break
                        
                    }
                }

        

            }
            
            else
            {
                
                Write-Error "Incorrect API key OR no network connectivity. To locate your JumpCloud API key log into the JumpCloud admin portal. The API key is located with 'API Settings' accessible from the drop down in the top right hand corner of the screen"
                $global:JCAPIKEY = $null
                break
            }
            
        }
    }

    end
    {
        $global:JCAPIKEY = $JumpCloudAPIKey

        if ($PSCmdlet.ParameterSetName -eq 'Interactive')
        {

            Write-Host -BackgroundColor Green -ForegroundColor Black "Successfully connected to JumpCloud"

            $GitHubModuleInfo = Invoke-WebRequest -uri  $GitHubModuleInfoURL -UseBasicParsing | Select-Object RawContent

            $CurrentBanner = ((((($GitHubModuleInfo -split "</a>Banner Current</h4>")[1]) -split "<pre><code>")[1]) -split "`n")[0]

            $OldBanner = ((((($GitHubModuleInfo -split "</a>Banner Old</h4>")[1]) -split "<pre><code>")[1]) -split "`n")[0]

            $LatestVersion = ((((($GitHubModuleInfo -split "</a>Latest Version</h4>")[1]) -split "<pre><code>")[1]) -split "`n")[0]
    
    
            $InstalledModuleVersion = Get-InstalledModule -Name JumpCloud | Select-Object -ExpandProperty Version
    
            if ($InstalledModuleVersion -eq $LatestVersion)
            {
    
                Write-Host -BackgroundColor Green -ForegroundColor Black "$CurrentBanner Module version: $InstalledModuleVersion" 
                
            }
    
            elseif ($InstalledModuleVersion -ne $LatestVersion)
            {
    
                Write-Host "$OldBanner" 
                Write-Host -BackgroundColor Yellow -ForegroundColor Black  "Installed Version: $InstalledModuleVersion " -NoNewline
                Write-Host -BackgroundColor Green -ForegroundColor Black  " Latest Version: $LatestVersion "

                Write-Host  "`nWould you like to upgrade to version: $LatestVersion ?"
                
                $Accept = Read-Host  "`nEnter 'Y' if you wish to update to version $LatestVersion or 'N' to continue using version: $InstalledModuleVersion"


                if ($Accept -eq 'N')
                {

                    return #Exit the function
                }

                While ($Accept -notcontains 'Y')
                {

                    write-warning " Typo? $Accept != 'Y'"

                    $Accept = Read-Host "`nEnter 'Y' if you wish to update to the latest version or 'N' to continue using version: $InstalledModuleVersion `n"

                    if ($Accept -eq 'N')
                    {

                        return # Exist the function
                    }

                }


                if ($PSVersionTable.PSVersion.Major -eq '5')
                {

                    If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
                    {

                        Write-Warning "You must have Administrative rights to update the module! To retry close this PowerShell session and open a new PowerShell session with Administrator permissions (Right click the PowerShell application and select 'Run as Administrator') and run the Connect-JCOnline command."
            
                        Return
            
                    }

                    Uninstall-Module -Name JumpCloud -RequiredVersion $InstalledModuleVersion

                    Install-Module -Name JumpCloud -Scope CurrentUser
                }

                elseif ($PSVersionTable.PSVersion.Major -ge 6)
                {

                    if ($PSVersionTable.Platform -eq 'Unix')
                    {

                        Uninstall-Module -Name JumpCloud -RequiredVersion $InstalledModuleVersion

                        Install-Module -Name JumpCloud -Scope CurrentUser
                                
                    }

                    elseif ($PSVersionTable.Platform -like "*Win*")
                    {

                        If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
                        {

                            Write-Warning "You must have Administrative rights to update the module! To retry close this PowerShell session and open a new PowerShell session with Administrator permissions (Right click the PowerShell application and select 'Run as Administrator') and run the Connect-JCOnline command."
                
                            Return
                
                        }

                        Uninstall-Module -Name JumpCloud -RequiredVersion $InstalledModuleVersion

                        Install-Module -Name JumpCloud -Scope CurrentUser
                                
                    }

                }

                    
                $UpdatedModuleVersion = Get-InstalledModule -Name JumpCloud | Select-Object -ExpandProperty Version

                if ($UpdatedModuleVersion -eq $LatestVersion)
                {

                    Clear-Host
                
                    $ReleaseNotesRaw = Invoke-WebRequest -uri $ReleaseNotesURL -UseBasicParsing #for backwards compatibility

                    $ReleaseNotes = ((((($ReleaseNotesRaw.RawContent -split "</a>$LatestVersion</h2>")[1]) -split "<pre><code>")[1]) -split "</code>")[0]

                    Write-Host "Module updated to version: $LatestVersion`n"

                    Write-Host "Release Notes: `n"

                    Write-Host $ReleaseNotes

                    Write-Host "`nTo see the full release notes navigate to: `n" 
                    Write-Host "$ReleaseNotesURL`n"

                    Pause
    
                }
                
            }



        } #End if

        
    }#End endblock

}