core/modules/monkeyhtml/private/Navbar/New-HTMLNavBar.ps1
# Monkey365 - the PowerShell Cloud Security Tool for Azure and Microsoft 365 (copyright 2022) by Juan Garrido # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. function New-HTMLNavBar{ <# .SYNOPSIS .DESCRIPTION .INPUTS .OUTPUTS .EXAMPLE .NOTES Author : Juan Garrido Twitter : @tr1ana File Name : New-HTMLNavBar Version : 1.0 .LINK https://github.com/silverhack/monkey365 #> [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "", Scope="Function")] [CmdletBinding()] [OutputType([System.Xml.XmlDocument])] Param ( [parameter(Mandatory= $false, HelpMessage= "Repository Url")] [String]$Url = "https://github.com/silverhack/monkey365", [parameter(Mandatory= $false, HelpMessage= "Template")] [System.Xml.XmlDocument]$Template ) Begin{ If($PSBoundParameters.ContainsKey('Template') -and $PSBoundParameters['Template']){ $TemplateObject = $PSBoundParameters['Template'] } ElseIf($null -ne (Get-Variable -Name Template -Scope Script -ErrorAction Ignore)){ $TemplateObject = $script:Template } Else{ [xml]$TemplateObject = "<html></html>" } #Set nulls $b64Pic = $account = $null #Default image $defaultImg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNy4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiBoZWlnaHQ9IjUwcHgiIHdpZHRoPSI1MHB4IiB2aWV3Qm94PSIwIDAgNTAgNTAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUwIDUwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwb2x5Z29uIG9wYWNpdHk9IjAuMSIgZmlsbD0iI0ZGRkZGRiIgcG9pbnRzPSIwLDAgNTAsMCA1MCw1MCAwLDUwICIvPg0KPHBvbHlnb24gb3BhY2l0eT0iMC4xIiBmaWxsPSIjMkIzMTM3IiBwb2ludHM9IjAsMCA1MCwwIDUwLDUwIDAsNTAgIi8+DQo8Zz4NCgk8cGF0aCBmaWxsPSIjNTlCNEQ5IiBkPSJNMzEuOSwxNS4xYzAsMy43LTMuMSw2LjktNi45LDYuOXMtNi45LTMuMS02LjktNi45czMuMS02LjksNi45LTYuOUMyOC43LDguMiwzMS45LDExLjQsMzEuOSwxNS4xIi8+DQoJPHBvbHlnb24gZmlsbD0iIzU5QjREOSIgcG9pbnRzPSIzMCwyNC40IDI1LDMxLjQgMjAsMjQuNCAxMi43LDI0LjQgMTIuNyw0MS44IDM3LjIsNDEuOCAzNy4yLDI0LjQgCSIvPg0KCTxwYXRoIG9wYWNpdHk9IjAuMiIgZmlsbD0iI0ZGRkZGRiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAgICAiIGQ9Ik0xOC4xLDE1LjFjMCwzLjcsMyw2LjgsNi44LDYuOWwxLjYtMTMuNQ0KCQljLTAuNS0wLjEtMS0wLjEtMS41LTAuMUMyMS4xLDguMiwxOC4xLDExLjQsMTguMSwxNS4xIi8+DQoJPHBvbHlnb24gb3BhY2l0eT0iMC4yIiBmaWxsPSIjRkZGRkZGIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3ICAgICIgcG9pbnRzPSIyMCwyNC40IDEyLjcsMjQuNCAxMi43LDQxLjggMjIuNCw0MS44IDIzLjksMjkuOSAJIi8+DQo8L2c+DQo8L3N2Zz4NCg==' #Create array objects $MainArray = [System.Collections.Generic.List[System.Object]]::new() $arrayObjects = [System.Collections.Generic.List[System.Object]]::new() } Process{ Try{ #Create NavBar $navbar = $TemplateObject.CreateNode( [System.Xml.XmlNodeType]::Element, $TemplateObject.Prefix, "nav", $TemplateObject.NamespaceURI ); #Set class [void]$navbar.SetAttribute('class',"navbar navbar-expand") #Create container fluid div $DivElement = @{ Name = 'div'; attributes = @{ class = "container-fluid"; }; Template = $TemplateObject; } $ContainerFluidDiv = New-HtmlTag @DivElement #Create I hamburger object $IElement = @{ Name = 'i'; attributes = @{ class = "hamburger align-self-center"; }; Template = $TemplateObject; } $IObject = New-HtmlTag @IElement #Create span object and append I element $spanElement = @{ Name = 'span'; attributes = @{ class = "navbar-toggle d-flex"; id = "sidebarCollapse"; }; AppendObject = $IObject; Template = $TemplateObject; } $spanObject = New-HtmlTag @spanElement #Add to main array [void]$MainArray.Add($spanObject); #Create I object $IElement = @{ Name = 'i'; attributes = @{ class = "bi bi-search icon input-group-text"; }; Template = $TemplateObject; } $IObject = New-HtmlTag @IElement #Create input object $InputElement = @{ Name = 'input'; attributes = @{ type = "text"; class = "form-control search-filter"; placeholder = "Search"; "aria-label" = "Search"; "aria-describedby" = "monkey-addon1"; }; Template = $TemplateObject; } $_InputObject = New-HtmlTag @InputElement #Add to array [void]$arrayObjects.Add($IObject); [void]$arrayObjects.Add($_InputObject); #Create DIV $DivElement = @{ Name = 'div'; attributes = @{ class = "input-group input-group-navbar mb-3"; }; AppendObject = $arrayObjects; Template = $TemplateObject; } $DivObject = New-HtmlTag @DivElement #Add to array [void]$MainArray.Add($DivObject); #Create DIV for right element $DivElement = @{ Name = 'div'; attributes = @{ class = "navbar-collapse collapse navbar-adjust"; id = "navbar"; }; Template = $TemplateObject; } $NavBarCollapse = New-HtmlTag @DivElement #Create UL $ULElement = @{ Name = 'ul'; attributes = @{ class = "navbar-nav navbar-right d-flex align-items-center"; }; Template = $TemplateObject; } $NavBarRight = New-HtmlTag @ULElement $gitHubInfo = Get-HTMLNavBarGitHubInfo -Template $TemplateObject #Create Nav item $LiElement = @{ Name = 'li'; attributes = @{ class = "nav-item"; }; Template = $TemplateObject; AppendObject = $gitHubInfo; } $_li = New-HtmlTag @LiElement #Add to navbar right [void]$NavBarRight.AppendChild($_li); #Create theme changer icon $IElement = @{ Name = 'i'; attributes = @{ id = 'toggleTheme'; class = "bi bi-sun"; }; Template = $TemplateObject; } $_i = New-HtmlTag @IElement $DivElement = @{ Name = 'div'; attributes = @{ class = "nav-icon"; }; Template = $TemplateObject; AppendObject = $_i; } $_div = New-HtmlTag @DivElement #Create Nav item $LiElement = @{ Name = 'li'; attributes = @{ class = "nav-item"; }; Template = $TemplateObject; AppendObject = $_div; } $_li = New-HtmlTag @LiElement #Add to navbar right [void]$NavBarRight.AppendChild($_li); #Set Img object for user If($PSBoundParameters.ContainsKey('UserInfo') -and $null -ne $PSBoundParameters['UserInfo']){ $b64Pic = $PSBoundParameters['UserInfo'] | Select-Object -ExpandProperty userpic -ErrorAction Ignore $account = $PSBoundParameters['UserInfo'] | Select-Object -ExpandProperty displayName -ErrorAction Ignore } ElseIf($null -ne (Get-Variable -Name ExecutionInfo -Scope Script -ErrorAction Ignore)){ $b64Pic = $Script:ExecutionInfo | Select-Object -ExpandProperty userpic -ErrorAction Ignore $account = $Script:ExecutionInfo | Select-Object -ExpandProperty displayName -ErrorAction Ignore } Else{ $b64Pic = $defaultImg; $account = "Unknown"; } If($null -eq $b64Pic){$b64Pic = $defaultImg;} If($null -eq $account){$account = "Unknown";} #Create Img object $ImgElement = @{ Name = 'img'; attributes = @{ src = $b64Pic; class = "rounded-circle"; alt = $account; }; Template = $TemplateObject; } $ImgObject = New-HtmlTag @ImgElement #Set Username object $SpanElement = @{ Name = 'span'; attributes = @{ class = "monkey-username"; id = "username"; }; Text = $account; Template = $TemplateObject; } $SpanObject = New-HtmlTag @SpanElement #Create DIV and add img and span objects $DIVElement = @{ Name = 'div'; Attributes = @{ class = "avatar"; }; Template = $TemplateObject; } $DIVObject = New-HtmlTag @DIVElement #Add img and span [void]$DivObject.AppendChild($ImgObject); [void]$DivObject.AppendChild($SpanObject); #Append to nav-item $LiElement = @{ Name = 'li'; attributes = @{ class = "nav-item"; }; Template = $TemplateObject; AppendObject = $DivObject; } $_li = New-HtmlTag @LiElement #Add to navbar right [void]$NavBarRight.AppendChild($_li); #Add to navbarCollapse [void]$NavBarCollapse.AppendChild($NavBarRight); #Add to main array [void]$MainArray.Add($NavBarCollapse); #Populate objects Foreach($obj in $MainArray){ [void]$ContainerFluidDiv.AppendChild($obj); } #Add to navbar [void]$navbar.AppendChild($ContainerFluidDiv); #Close i tags $all_i = $navbar.SelectNodes("//i") ForEach($i in $all_i){ [void]$i.AppendChild($TemplateObject.CreateWhitespace("")) } #Close input tags $all_inputs = $navbar.SelectNodes("//input") ForEach($_input in $all_inputs){ [void]$_input.AppendChild($TemplateObject.CreateWhitespace("")) } #Return object return $navbar } Catch{ Write-Warning "Unable to create NavBar" Write-Error $_.Exception } } End{ #Nothing to do here } } |