Public/Get-ECKGithubContent.ps1
Function Get-ECKGithubContent { # Script Version 1.1 - 27/06/2022 - Fixed access to Raw Gist param( [Parameter(Mandatory = $true, Position=0, ParameterSetName = 'Public')] [Parameter(Mandatory = $true, Position=0, ParameterSetName = 'Private')] [string]$URI, [Parameter(Mandatory = $true, ParameterSetName = 'Private')] [string]$GithubToken, [Parameter(Mandatory = $true, ParameterSetName = 'Private')] [string]$ScriptName ) If([string]::IsNullOrWhiteSpace($GithubToken)) { ## This a public Repo/Gist If(-not (($URI -like '*//gist.github.com*') -or ($URI -like '*//gist.githubusercontent.com*') -or ($URI -like '*//github.com*'))){Write-ECKlog "[ERROR] Unsupported URI $URI, Aborting !!!" -Type 3 ; Return $false} If($URI -like '*/github.com*'){$URI = $URI -replace "blob/","raw/"} # This is a Github Repo If ($URI -like '*//gist.github.com*') # this is a gist { $Content = Invoke-WebRequest -Uri $URI -UseBasicParsing -ErrorAction Stop $URI = "https://gist.githubusercontent.com" + $($content.Links|Where-Object outerHTML -match "Raw" |Select-Object -ExpandProperty href) } Try { $fileraw = (Invoke-WebRequest -Uri $URI -UseBasicParsing -ErrorAction Stop).Content Return $fileraw } Catch { Write-ECKlog "[ERROR] Unable to grab file from URI $URI, Aborting !!!" -Type 3 Return $false } } Else { ## This a private Repo/Gist # Authenticate $clientID = $URI.split("/")[3] $GistID = $URI.split("/")[4] # Basic Auth $Bytes = [System.Text.Encoding]::utf8.GetBytes("$($clientID):$($GithubToken)") $encodedAuth = [Convert]::ToBase64String($Bytes) $Headers = @{Authorization = "Basic $($encodedAuth)"; Accept = 'application/vnd.github.v3+json'} [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $githubURI = "https://api.github.com/user" $githubBaseURI = "https://api.github.com" $auth = Invoke-RestMethod -Method Get -Uri $githubURI -Headers $Headers -SessionVariable GITHUB -ErrorAction SilentlyContinue if ($auth) { If($URI -like '*/gist.github.com*') { # Get my GISTS $myGists = Invoke-RestMethod -method Get -Uri "$($githubBaseURI)/users/$($clientID)/gists" -Headers $Headers -WebSession $GITHUB $script = $myGists | Select-Object | Where-Object {$_.id -eq $GistID} if ($script) { foreach ($fileObj in ($script.files| Get-Member | Where-Object {$_.memberType -eq "NoteProperty"})) { $File = $fileObj.definition $File = $File -split("@") $File = ($File[1]).replace("{","").replace("}","") $File = ($File.split(";")).trim()|ConvertFrom-StringData # Get File If (($File.Filename).ToUpper() -eq $ScriptName.ToUpper()) { $rawURL = $File.raw_url $fileraw = Invoke-RestMethod -Method Get -Uri $rawURL -WebSession $GITHUB Return $fileraw } } } } ElseIf($URI -like '*/github.com*') { Function Local:Get-RepositoryContent { param ( [Parameter( Position = 0, Mandatory = $True )] [String]$Path ) $myGithubRepos = Invoke-RestMethod -method Get -Uri $path -Headers $Headers -WebSession $GITHUB $files = $myGithubRepos | Where-Object {$_.type -eq "file"} $directories = $myGithubRepos | Where-Object {$_.type -eq "dir"} $directories | ForEach-Object {Get-RepositoryContent -path ($_._links).self} foreach ($file in $files) { If (($File.Name).toUpper() -eq $ScriptName.ToUpper()) { $rawURL = $File.download_url $fileraw = Invoke-RestMethod -Method Get -Uri $rawURL -WebSession $GITHUB $fileraw break } } Return } # Get my GItHub $SelectedFile = Get-RepositoryContent -path "$($githubBaseURI)/repos/$($clientID)/$($GistID)/contents" Return $SelectedFile } Else { Write-ECKlog "[ERROR] Unsupported URI $URI, Aborting !!!" -Type 3 Return $false } } Else { Write-ECKlog "[ERROR] Unable to authenticate to github, Aborting !!!" -Type 3 Write-ECKlog $Error[0].InvocationInfo.PositionMessage.ToString() -Type 3 Write-ECKlog $Error[0].Exception.Message.ToString() -Type 3 Return $false } } } |