diff --git a/.azure-pipelines/Release Build.yml b/.azure-pipelines/Release Build.yml
new file mode 100644
index 000000000..abc064506
--- /dev/null
+++ b/.azure-pipelines/Release Build.yml
@@ -0,0 +1,132 @@
+trigger:
+- master
+
+pr:
+- master
+
+jobs:
+- job: Windows_Build
+ displayName: Windows Build
+ timeoutInMinutes: 360
+ pool:
+ vmImage: windows-latest
+
+ steps:
+ - task: InstallSSHKey@0
+ inputs:
+ knownHostsEntry: |
+ github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl
+ github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+ github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=
+ sshKeySecureFile: 'pipelines_rsa'
+
+ - checkout: self
+ submodules: recursive
+ clean: true
+ fetchTags: false
+
+ - task: VisualStudioTestPlatformInstaller@1
+ displayName: Visual Studio Test Platform Installer
+
+ - task: PowerShell@2
+ displayName: Add CurrentVersion Variable
+ inputs:
+ targetType: inline
+ script: |
+ $VersionString = git show -s --format=%ci $(Build.SourceVersion)
+ $VersionDate = [DateTimeOffset]::Parse($VersionString)
+ $CurrentVersion = $VersionDate.ToString("yyyy.MM.dd.HHmm")
+
+ [System.Console]::WriteLine("##vso[task.setvariable variable=CurrentVersion]$CurrentVersion")
+
+ Write-Host "Setting current version to $CurrentVersion."
+
+ - task: NuGetToolInstaller@1
+ displayName: 'Use NuGet'
+
+ - task: UseDotNet@2
+ displayName: Use .NET SDK
+ inputs:
+ version: 8.x
+
+ - task: DotNetCoreCLI@2
+ displayName: dotnet restore
+ inputs:
+ command: restore
+ projects: '**/*.csproj'
+
+ - task: DotNetCoreCLI@2
+ displayName: dotnet test
+ inputs:
+ command: 'test'
+ projects: |
+ **\Server.Tests.csproj
+ **\Shared.Tests.csproj
+
+ - task: PowerShell@2
+ displayName: Create Code Signing Cert
+ env:
+ SigningCertBase64: $(CODE_SIGNING_CERT_BASE64)
+ inputs:
+ targetType: inline
+ script: |
+ if (!$env:SigningCertBase64) {
+ Write-Host "CODE_SIGNING_CERT_BASE64 variable is empty. Skipping cert creation."
+ return
+ }
+ $CertBytes = [System.Convert]::FromBase64String($env:SigningCertBase64)
+ [System.IO.File]::WriteAllBytes("$(Build.SourcesDirectory)\Utilities\CodeSigningCert.pfx", $CertBytes)
+
+ - task: PowerShell@2
+ displayName: Publish.ps1
+ inputs:
+ filePath: Utilities/Publish.ps1
+ arguments: -CertificatePath "$(Build.SourcesDirectory)\Utilities\CodeSigningCert.pfx" -CertificatePassword "$(SIGNING_CERT_PASSWORD)" -CurrentVersion "$(CurrentVersion)"
+ failOnStderr: true
+ workingDirectory: Utilities
+
+ # The MSBuild TypeScript task doesn't compiled the TS
+ # files without this build step before publishing.
+ - task: DotNetCoreCLI@2
+ displayName: Build Server
+ inputs:
+ command: 'build'
+ projects: '$(Build.SourcesDirectory)/Server/Server.csproj'
+ arguments: '-r linux-x64 -c Release --self-contained'
+
+ - task: DotNetCoreCLI@2
+ displayName: Publish Server (linux-x64)
+ inputs:
+ command: publish
+ publishWebProjects: false
+ projects: '$(Build.SourcesDirectory)/Server/Server.csproj'
+ arguments: /p:Version=$(CurrentVersion) /p:FileVersion=$(CurrentVersion) --configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)\linux-x64 --runtime linux-x64 --self-contained
+
+
+ - task: PowerShell@2
+ displayName: Write Version File
+ inputs:
+ targetType: inline
+ script: |
+ Write-Host "Adding Version to File: $(CurrentVersion)"
+ # This is used in the Release.
+ New-Item -ItemType File -Value "$(CurrentVersion)" -Path "$(build.artifactstagingdirectory)\Version.txt" -Force
+
+ - task: PowerShell@2
+ displayName: Copy Docker Files
+ inputs:
+ targetType: inline
+ script: |
+ Copy-Item -Path "$(Build.SourcesDirectory)\Server\Dockerfile.pipelines" -Destination "$(build.artifactstagingdirectory)\Dockerfile"
+ Copy-Item -Path "$(Build.SourcesDirectory)\docker-compose\docker-compose.yml" -Destination "$(build.artifactstagingdirectory)\docker-compose.yml"
+
+ - task: PublishBuildArtifacts@1
+ displayName: Publish Artifact
+ condition: succeededOrFailed()
+ inputs:
+ PathtoPublish: $(build.artifactstagingdirectory)
+ ArtifactName: Server
+ TargetPath: '\\my\share\$(Build.DefinitionName)\$(Build.BuildNumber)'
+
+ - task: PostBuildCleanup@3
+ displayName: Clean Agent Directories
diff --git a/.editorconfig b/.editorconfig
index a78c12e30..85d0d498b 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,4 +1,4 @@
-[*.cs]
+[ "*.cs" ]
# CA1416: Validate platform compatibility
dotnet_diagnostic.CA1416.severity = none
@@ -7,4 +7,172 @@ dotnet_diagnostic.CA1416.severity = none
dotnet_diagnostic.CS1591.severity = none
csharp_style_var_for_built_in_types=true:silent
csharp_style_var_when_type_is_apparent=true:silent
-csharp_style_var_elsewhere=true:silent
\ No newline at end of file
+csharp_style_var_elsewhere=true:silent
+
+# CA1822: Mark members as static
+dotnet_diagnostic.CA1822.severity = none
+csharp_using_directive_placement = outside_namespace:silent
+csharp_prefer_simple_using_statement = true:suggestion
+csharp_prefer_braces = true:silent
+csharp_style_namespace_declarations = block_scoped:silent
+csharp_style_prefer_method_group_conversion = true:silent
+csharp_style_prefer_top_level_statements = true:silent
+csharp_style_expression_bodied_methods = false:silent
+csharp_style_expression_bodied_constructors = false:silent
+csharp_style_expression_bodied_operators = false:silent
+csharp_style_expression_bodied_properties = true:silent
+csharp_style_expression_bodied_indexers = true:silent
+csharp_style_expression_bodied_accessors = true:silent
+csharp_style_expression_bodied_lambdas = true:silent
+csharp_style_expression_bodied_local_functions = false:silent
+csharp_indent_labels = one_less_than_current
+
+[*.{cs,vb}]
+#### Naming styles ####
+
+# Naming rules
+
+dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
+dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
+dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
+
+dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.types_should_be_pascal_case.symbols = types
+dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
+
+dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
+dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
+
+# Symbol specifications
+
+dotnet_naming_symbols.interface.applicable_kinds = interface
+dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.interface.required_modifiers =
+
+dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
+dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.types.required_modifiers =
+
+dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
+dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.non_field_members.required_modifiers =
+
+# Naming styles
+
+dotnet_naming_style.begins_with_i.required_prefix = I
+dotnet_naming_style.begins_with_i.required_suffix =
+dotnet_naming_style.begins_with_i.word_separator =
+dotnet_naming_style.begins_with_i.capitalization = pascal_case
+
+dotnet_naming_style.pascal_case.required_prefix =
+dotnet_naming_style.pascal_case.required_suffix =
+dotnet_naming_style.pascal_case.word_separator =
+dotnet_naming_style.pascal_case.capitalization = pascal_case
+
+dotnet_naming_style.pascal_case.required_prefix =
+dotnet_naming_style.pascal_case.required_suffix =
+dotnet_naming_style.pascal_case.word_separator =
+dotnet_naming_style.pascal_case.capitalization = pascal_case
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_auto_properties = true:silent
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:silent
+dotnet_style_prefer_conditional_expression_over_return = true:silent
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_compound_assignment = true:suggestion
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+tab_width = 4
+indent_size = 4
+end_of_line = crlf
+dotnet_style_prefer_simplified_interpolation = true:suggestion
+
+# CA1822: Mark members as static
+dotnet_diagnostic.CA1822.severity = silent
+dotnet_style_namespace_match_folder = true:error
+dotnet_style_predefined_type_for_locals_parameters_members = true:silent
+dotnet_style_readonly_field = true:suggestion
+dotnet_code_quality_unused_parameters = all:suggestion
+dotnet_style_allow_statement_immediately_after_block_experimental = true:silent
+dotnet_style_allow_multiple_blank_lines_experimental = true:silent
+dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
+dotnet_style_predefined_type_for_member_access = true:silent
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
+dotnet_style_qualification_for_event = false:silent
+dotnet_style_qualification_for_method = false:silent
+dotnet_style_qualification_for_property = false:silent
+dotnet_style_qualification_for_field = false:silent
+
+# IDE0130: Namespace does not match folder structure
+dotnet_diagnostic.IDE0130.severity = error
+dotnet_diagnostic.CA1416.severity = error
+
+[*.cs]
+csharp_indent_labels = one_less_than_current
+csharp_using_directive_placement = outside_namespace:silent
+csharp_prefer_simple_using_statement = true:suggestion
+csharp_prefer_braces = true:silent
+csharp_style_namespace_declarations = file_scoped:error
+csharp_style_prefer_method_group_conversion = true:silent
+csharp_style_prefer_top_level_statements = true:silent
+csharp_style_expression_bodied_methods = false:silent
+csharp_style_expression_bodied_constructors = false:silent
+csharp_style_expression_bodied_operators = false:silent
+csharp_style_expression_bodied_properties = true:silent
+csharp_style_expression_bodied_indexers = true:silent
+csharp_style_expression_bodied_accessors = true:silent
+csharp_style_expression_bodied_lambdas = true:silent
+csharp_style_expression_bodied_local_functions = false:silent
+csharp_prefer_static_local_function = true:suggestion
+csharp_style_throw_expression = true:suggestion
+csharp_style_unused_value_expression_statement_preference = discard_variable:silent
+csharp_style_unused_value_assignment_preference = discard_variable:suggestion
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+csharp_style_prefer_utf8_string_literals = true:suggestion
+csharp_style_prefer_tuple_swap = true:suggestion
+csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
+csharp_style_prefer_range_operator = true:suggestion
+csharp_style_prefer_index_operator = true:suggestion
+csharp_style_prefer_local_over_anonymous_function = true:suggestion
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_prefer_null_check_over_type_check = true:suggestion
+csharp_style_conditional_delegate_call = true:suggestion
+csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent
+csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent
+csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent
+csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent
+csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent
+csharp_style_prefer_readonly_struct_member = true:suggestion
+csharp_style_prefer_readonly_struct = true:suggestion
+csharp_style_prefer_pattern_matching = true:silent
+csharp_style_prefer_switch_expression = true:suggestion
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_prefer_extended_property_pattern = true:suggestion
+csharp_style_prefer_not_pattern = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+csharp_style_var_elsewhere = false:silent
+csharp_style_var_when_type_is_apparent = false:silent
+csharp_style_var_for_built_in_types = false:silent
+
+# CS8604: Possible null reference argument.
+dotnet_diagnostic.CS8604.severity = error
+
+# CS8600: Converting null literal or possible null value to non-nullable type.
+dotnet_diagnostic.CS8600.severity = error
+
+# CS8602: Dereference of a possibly null reference.
+dotnet_diagnostic.CS8602.severity = error
+
+# CS8631: The type cannot be used as type parameter in the generic type or method. Nullability of type argument doesn't match constraint type.
+dotnet_diagnostic.CS8631.severity = error
+csharp_style_prefer_primary_constructors = true:suggestion
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index c8abb83f7..000000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-# These are supported funding model platforms
-
-github: [immense]
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 089733958..b86c5f5d7 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -1,38 +1,30 @@
---
name: Bug report
about: Create a report to help us improve
-title: ''
-labels: ''
-assignees: ''
-
+title: ""
+labels: ""
+assignees: ""
---
**Describe the bug**
-A clear and concise description of what the bug is.
+A clear and concise description of what the bug is. Ideally with a screenshot if applicable.
**To Reproduce**
Steps to reproduce the behavior:
+
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
@@ -49,15 +41,17 @@ A clear and concise description of what you expected to happen.
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- - OS: [e.g. iOS]
- - Browser [e.g. chrome, safari]
- - Version [e.g. 22]
+
+- OS: [e.g. iOS]
+- Browser [e.g. chrome, safari]
+- Version [e.g. 22]
**Smartphone (please complete the following information):**
- - Device: [e.g. iPhone6]
- - OS: [e.g. iOS8.1]
- - Browser [e.g. stock browser, safari]
- - Version [e.g. 22]
+
+- Device: [e.g. iPhone13]
+- OS: [e.g. iOS8.1]
+- Browser [e.g. stock browser, safari]
+- Version [e.g. 22]
**Additional Context**
Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index bbcbbe7d6..6296598e3 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -17,4 +17,4 @@ A clear and concise description of what you want to happen.
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
-Add any other context or screenshots about the feature request here.
+Add any other context, mockups or screenshots about the feature request here.
diff --git a/.github/media/ask-remote.png b/.github/media/ask-remote.png
new file mode 100644
index 000000000..29b844c9b
Binary files /dev/null and b/.github/media/ask-remote.png differ
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index f90e03106..82438ab68 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1,7 +1,5 @@
# IMPORTANT:
-# 1. The Server URL must include the scheme (e.g. https://app.remotely.one).
-
-# 2. The Server Runtime Identifier determines the target operating system
+# 1. The Server Runtime Identifier determines the target operating system
# for which to build the server. The default "linux-x64" will usually work
# for most Linux-based operating systems. You can see a full list at
# https://docs.microsoft.com/en-us/dotnet/core/rid-catalog.
@@ -23,9 +21,6 @@ name: Build
on:
workflow_dispatch:
inputs:
- serverUrl:
- description: 'Server URL'
- required: true
rid:
description: 'Server Runtime Identifier'
required: false
@@ -39,15 +34,17 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v2
+ uses: actions/checkout@v3.5.2
+ with:
+ submodules: recursive
- name: Install .NET Core
- uses: actions/setup-dotnet@v1.9.0
+ uses: actions/setup-dotnet@v3.0.3
with:
- dotnet-version: 6.0.x
+ dotnet-version: 7
- name: Setup NuGet.exe for use with actions
- uses: NuGet/setup-nuget@v1.0.5
+ uses: NuGet/setup-nuget@v1.2.0
- name: Set current version
shell: pwsh
@@ -55,12 +52,7 @@ jobs:
$VersionString = git show -s --format=%ci
$VersionDate = [DateTimeOffset]::Parse($VersionString)
- $Year = $VersionDate.Year.ToString()
- $Month = $VersionDate.Month.ToString().PadLeft(2, "0")
- $Day = $VersionDate.Day.ToString().PadLeft(2, "0")
- $Hour = $VersionDate.Hour.ToString().PadLeft(2, "0")
- $Minute = $VersionDate.Minute.ToString().PadLeft(2, "0")
- $CurrentVersion = "$Year.$Month.$Day.$Hour$Minute"
+ $CurrentVersion = $VersionDate.ToString("yyyy.MM.dd.HHmm")
echo "CurrentVersion=$CurrentVersion" >> $env:GITHUB_ENV
@@ -72,15 +64,10 @@ jobs:
$VersionString = git show -s --format=%ci
$VersionDate = [DateTimeOffset]::Parse($VersionString)
- $Year = $VersionDate.Year.ToString()
- $Month = $VersionDate.Month.ToString().PadLeft(2, "0")
- $Day = $VersionDate.Day.ToString().PadLeft(2, "0")
- $Hour = $VersionDate.Hour.ToString().PadLeft(2, "0")
- $Minute = $VersionDate.Minute.ToString().PadLeft(2, "0")
- $CurrentVersion = "$Year.$Month.$Day.$Hour$Minute"
+ $CurrentVersion = $VersionDate.ToString("yyyy.MM.dd.HHmm")
Write-Host "Publishing agent with version $CurrentVersion"
- dotnet publish /p:Version=$CurrentVersion /p:FileVersion=$CurrentVersion --runtime osx-x64 --configuration Release --output "./Agent/bin/publish/" "./Agent/"
+ dotnet publish /p:Version=$CurrentVersion /p:FileVersion=$CurrentVersion --runtime osx-x64 --self-contained --configuration Release --output "./Agent/bin/publish/" "./Agent/"
Compress-Archive -Path "./Agent/bin/publish/*" -DestinationPath "./Agent/bin/Remotely-MacOS-x64.zip" -Force
- name: Upload build artifact
@@ -105,27 +92,19 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v2
+ uses: actions/checkout@v3.5.2
with:
# Comment out the below 'repository' line if you want to build from
# your fork instead of the author's.
- repository: lucent-sea/Remotely
+ repository: immense/Remotely
+ submodules: recursive
fetch-depth: 0
-
- # Test the Server URL to make sure it's valid
- - name: Check Server URL Format
- run: |
- $Result = ""
- if (![System.Uri]::TryCreate($env:ServerUrl, [System.UriKind]::Absolute, [ref] $Result)) {
- throw "Server URL is not in the correct format. It should be fully qualified with scheme and host (e.g. https://app.remotely.one)."
- }
-
# Install the .NET Core workload
- name: Install .NET Core
- uses: actions/setup-dotnet@v1.9.0
+ uses: actions/setup-dotnet@v3.0.3
with:
- dotnet-version: 6.0.x
+ dotnet-version: 7
# Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild
- name: Setup MSBuild.exe
@@ -160,13 +139,8 @@ jobs:
run: |
$VersionString = git show -s --format=%ci
$VersionDate = [DateTimeOffset]::Parse($VersionString)
-
- $Year = $VersionDate.Year.ToString()
- $Month = $VersionDate.Month.ToString().PadLeft(2, "0")
- $Day = $VersionDate.Day.ToString().PadLeft(2, "0")
- $Hour = $VersionDate.Hour.ToString().PadLeft(2, "0")
- $Minute = $VersionDate.Minute.ToString().PadLeft(2, "0")
- $CurrentVersion = "$Year.$Month.$Day.$Hour$Minute"
+
+ $CurrentVersion = $VersionDate.ToString("yyyy.MM.dd.HHmm")
echo "CurrentVersion=$CurrentVersion" >> $env:GITHUB_ENV
@@ -174,7 +148,7 @@ jobs:
- name: Download macOS x64 Agent
- uses: actions/download-artifact@v2
+ uses: actions/download-artifact@v2.1.1
with:
name: Mac-Agent-x64
path: ./Server/wwwroot/Content/
@@ -183,11 +157,11 @@ jobs:
- name: Run Publish script
shell: powershell
run: |
- .\Utilities\Publish.ps1 -CertificatePath "$env:GITHUB_WORKSPACE\GitHubActionsWorkflow.pfx" -CertificatePassword $env:PfxKey -Hostname $env:ServerUrl -CurrentVersion $env:CurrentVersion -RID ${{ github.event.inputs.rid }} -OutDir "$env:GITHUB_WORKSPACE\publish"
+ .\Utilities\Publish.ps1 -CertificatePath "$env:GITHUB_WORKSPACE\GitHubActionsWorkflow.pfx" -CertificatePassword $env:PfxKey -CurrentVersion $env:CurrentVersion -RID ${{ github.event.inputs.rid }} -OutDir "$env:GITHUB_WORKSPACE\publish"
# Upload build artifact to be deployed from Ubuntu runner
- name: Upload build artifact
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v3.1.2
with:
path: ./publish/
name: Server
diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml
index 0ad5c1e88..ec1d3d5a7 100644
--- a/.github/workflows/run_tests.yml
+++ b/.github/workflows/run_tests.yml
@@ -1,4 +1,4 @@
-name: Run Tests
+name: Tests
on:
push:
@@ -25,15 +25,16 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v2
+ uses: actions/checkout@v3.5.2
with:
+ submodules: recursive
fetch-depth: 0
# Install the .NET Core workload
- name: Install .NET Core
- uses: actions/setup-dotnet@v1.9.0
+ uses: actions/setup-dotnet@v3.0.3
with:
- dotnet-version: 6.0.x
+ dotnet-version: 7
# Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild
- name: Setup MSBuild.exe
diff --git a/.gitignore b/.gitignore
index d8b8da9a5..93d822baf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -293,3 +293,7 @@ Server/.config/dotnet-tools.json
Server.Installer/Properties/launchSettings.json
.DS_Store
/Server/wwwroot/Content/Linux-x64/Remotely_Desktop
+!/.vscode/launch.json
+!/.vscode/tasks.json
+/Server/appsettings.Development.json
+/Server/AppData
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000..e69de29bb
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 000000000..2ca12ba14
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,24 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Linux Desktop",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build",
+ "program": "${workspaceFolder}/Desktop.Linux/bin/Debug/.net8.0/Remotely_Desktop.dll",
+ "args": [],
+ "cwd": "${workspaceFolder}/Desktop.Linux",
+ "console": "internalConsole",
+ "stopAtEntry": false
+ },
+ {
+ "name": ".NET Core Attach",
+ "type": "coreclr",
+ "request": "attach"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 000000000..aecf4a764
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,41 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "build",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/Desktop.Linux/Desktop.Linux.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "publish",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/Desktop.Linux/Desktop.Linux.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "watch",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "watch",
+ "run",
+ "--project",
+ "${workspaceFolder}/Desktop.Linux/Desktop.Linux.csproj"
+ ],
+ "problemMatcher": "$msCompile"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Agent.Installer.Win/Agent.Installer.Win.csproj b/Agent.Installer.Win/Agent.Installer.Win.csproj
deleted file mode 100644
index d843a0b30..000000000
--- a/Agent.Installer.Win/Agent.Installer.Win.csproj
+++ /dev/null
@@ -1,205 +0,0 @@
-
-
-
-
- Debug
- AnyCPU
- {A3D0368C-0850-4614-B5B5-41B9D5135AA9}
- WinExe
- Remotely.Agent.Installer.Win
- Remotely_Installer
- v4.8
- 512
- {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
- 4
- true
- true
-
-
-
- win;win-x64;win10-x64;win-x64;win10-x86;
-
-
- AnyCPU
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- AnyCPU
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
- Assets\favicon.ico
-
-
- app.manifest
-
-
- true
- bin\x64\Debug\
- DEBUG;TRACE
- full
- x64
- 7.3
- prompt
- MinimumRecommendedRules.ruleset
- true
-
-
- bin\x64\Release\
- TRACE
- true
- pdbonly
- x64
- 7.3
- prompt
- MinimumRecommendedRules.ruleset
- true
-
-
- true
- bin\x86\Debug\
- DEBUG;TRACE
- full
- x86
- 7.3
- prompt
- MinimumRecommendedRules.ruleset
- true
-
-
- bin\x86\Release\
- TRACE
- true
- pdbonly
- x86
- 7.3
- prompt
- MinimumRecommendedRules.ruleset
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
- C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2\System.Runtime.Serialization.dll
-
-
-
-
-
-
-
-
-
-
- 4.0
-
-
-
-
-
-
-
- MSBuild:Compile
- Designer
-
-
- Models\ConnectionInfo.cs
-
-
- Models\DeviceSetupOptions.cs
-
-
- Utilities\AppConstants.cs
-
-
-
-
-
-
-
-
-
-
-
- MSBuild:Compile
- Designer
-
-
- App.xaml
- Code
-
-
- MainWindow.xaml
- Code
-
-
-
-
- Code
-
-
- True
- True
- Resources.resx
-
-
- True
- Settings.settings
- True
-
-
- ResXFileCodeGenerator
- Resources.Designer.cs
-
-
-
- SettingsSingleFileGenerator
- Settings.Designer.cs
-
-
-
-
-
-
-
-
-
-
-
-
-
- {F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}
- 1
- 0
- 0
- tlbimp
- False
- True
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Agent.Installer.Win/App.config b/Agent.Installer.Win/App.config
deleted file mode 100644
index 4bfa00561..000000000
--- a/Agent.Installer.Win/App.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/Agent.Installer.Win/App.xaml b/Agent.Installer.Win/App.xaml
deleted file mode 100644
index aa4b0db2f..000000000
--- a/Agent.Installer.Win/App.xaml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
diff --git a/Agent.Installer.Win/App.xaml.cs b/Agent.Installer.Win/App.xaml.cs
deleted file mode 100644
index 7a71daee4..000000000
--- a/Agent.Installer.Win/App.xaml.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System.Windows;
-
-namespace Remotely.Agent.Installer.Win
-{
- ///
- /// Interaction logic for App.xaml
- ///
- public partial class App : Application
- {
-
- }
-}
diff --git a/Agent.Installer.Win/MainWindow.xaml b/Agent.Installer.Win/MainWindow.xaml
deleted file mode 100644
index 3f1b45207..000000000
--- a/Agent.Installer.Win/MainWindow.xaml
+++ /dev/null
@@ -1,160 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Server URL:
-
-
-
-
-
-
-
-
- Organization ID
-
-
-
-
-
-
-
- Support Shortcut
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Agent.Installer.Win/MainWindow.xaml.cs b/Agent.Installer.Win/MainWindow.xaml.cs
deleted file mode 100644
index 665e15ba5..000000000
--- a/Agent.Installer.Win/MainWindow.xaml.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-using Remotely.Agent.Installer.Win.Utilities;
-using Remotely.Agent.Installer.Win.ViewModels;
-using System;
-using System.Windows;
-using System.Windows.Documents;
-using System.Windows.Input;
-
-namespace Remotely.Agent.Installer.Win
-{
- ///
- /// Interaction logic for MainWindow.xaml
- ///
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- if (CommandLineParser.CommandLineArgs.ContainsKey("quiet"))
- {
- Hide();
- ShowInTaskbar = false;
- _ = new MainWindowViewModel().Init();
- }
- InitializeComponent();
- }
-
- private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
- {
- DragMove();
- }
-
- private async void Window_Loaded(object sender, RoutedEventArgs e)
- {
- await (DataContext as MainWindowViewModel).Init();
- }
-
- private void CloseButton_Click(object sender, RoutedEventArgs e)
- {
- App.Current.Shutdown();
- }
-
- private void MinimizeButton_Click(object sender, RoutedEventArgs e)
- {
- this.WindowState = WindowState.Minimized;
- }
-
- private void ShowServerUrlHelp(object sender, RoutedEventArgs e)
- {
- MessageBox.Show(
- "This is the URL of the Remotely server that you're hosting. The device will connect to this URL.",
- "Server URL",
- MessageBoxButton.OK,
- MessageBoxImage.Information);
- }
-
- private void ShowOrganizationIdHelp(object sender, RoutedEventArgs e)
- {
- MessageBox.Show(
- "This is your organization ID on the Remotely server. Since Remotely supports multi-tenancy, " +
- "this ID needs to be provided to determine who should have access."
- + Environment.NewLine + Environment.NewLine +
- "You can find this ID on the Organization tab on the web app.",
- "Organization ID",
- MessageBoxButton.OK,
- MessageBoxImage.Information);
- }
- private void ShowSupportShortcutHelp(object sender, RoutedEventArgs e)
- {
- MessageBox.Show("If selected, the installer will create a desktop shortcut to the Get Support page for this device.",
- "Support Shortcut",
- MessageBoxButton.OK,
- MessageBoxImage.Information);
- }
- }
-}
diff --git a/Agent.Installer.Win/Models/BrandingInfo.cs b/Agent.Installer.Win/Models/BrandingInfo.cs
deleted file mode 100644
index 5e9a24688..000000000
--- a/Agent.Installer.Win/Models/BrandingInfo.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Remotely.Agent.Installer.Win.Models
-{
- public class BrandingInfo
- {
- public string Product { get; set; } = "Remotely";
-
- public string Icon { get; set; }
-
- public byte TitleForegroundRed { get; set; } = 29;
-
- public byte TitleForegroundGreen { get; set; } = 144;
-
- public byte TitleForegroundBlue { get; set; } = 241;
-
- public byte TitleBackgroundRed { get; set; } = 70;
-
- public byte TitleBackgroundGreen { get; set; } = 70;
-
- public byte TitleBackgroundBlue { get; set; } = 70;
-
- public byte ButtonForegroundRed { get; set; } = 255;
-
- public byte ButtonForegroundGreen { get; set; } = 255;
-
- public byte ButtonForegroundBlue { get; set; } = 255;
- }
-}
diff --git a/Agent.Installer.Win/Properties/AssemblyInfo.cs b/Agent.Installer.Win/Properties/AssemblyInfo.cs
deleted file mode 100644
index d8aa9c65e..000000000
--- a/Agent.Installer.Win/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-using System.Reflection;
-using System.Runtime.InteropServices;
-using System.Windows;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Remotely Installer")]
-[assembly: AssemblyDescription("An installer for the Remotely service, which provides unattended remote access and remote scripting.")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Translucency Software")]
-[assembly: AssemblyProduct("Remotely Installer")]
-[assembly: AssemblyCopyright("Copyright © 2020 Translucency Software")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-//In order to begin building localizable applications, set
-//CultureYouAreCodingWith in your .csproj file
-//inside a . For example, if you are using US english
-//in your source files, set the to en-US. Then uncomment
-//the NeutralResourceLanguage attribute below. Update the "en-US" in
-//the line below to match the UICulture setting in the project file.
-
-//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
-
-
-[assembly: ThemeInfo(
- ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
- //(used if a resource is not found in the page,
- // or application resource dictionaries)
- ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
- //(used if a resource is not found in the page,
- // app, or any theme specific resource dictionaries)
-)]
-
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Agent.Installer.Win/Properties/Resources.Designer.cs b/Agent.Installer.Win/Properties/Resources.Designer.cs
deleted file mode 100644
index 369f86202..000000000
--- a/Agent.Installer.Win/Properties/Resources.Designer.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// This code was generated by a tool.
-// Runtime Version:4.0.30319.42000
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-//
-//------------------------------------------------------------------------------
-
-namespace Remotely.Agent.Installer.Win.Properties {
- using System;
-
-
- ///
- /// A strongly-typed resource class, for looking up localized strings, etc.
- ///
- // This class was auto-generated by the StronglyTypedResourceBuilder
- // class via a tool like ResGen or Visual Studio.
- // To add or remove a member, edit your .ResX file then rerun ResGen
- // with the /str option, or rebuild your VS project.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- internal class Resources {
-
- private static global::System.Resources.ResourceManager resourceMan;
-
- private static global::System.Globalization.CultureInfo resourceCulture;
-
- [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
- internal Resources() {
- }
-
- ///
- /// Returns the cached ResourceManager instance used by this class.
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Resources.ResourceManager ResourceManager {
- get {
- if (object.ReferenceEquals(resourceMan, null)) {
- global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Remotely.Agent.Installer.Win.Properties.Resources", typeof(Resources).Assembly);
- resourceMan = temp;
- }
- return resourceMan;
- }
- }
-
- ///
- /// Overrides the current thread's CurrentUICulture property for all
- /// resource lookups using this strongly typed resource class.
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Globalization.CultureInfo Culture {
- get {
- return resourceCulture;
- }
- set {
- resourceCulture = value;
- }
- }
- }
-}
diff --git a/Agent.Installer.Win/Properties/Resources.resx b/Agent.Installer.Win/Properties/Resources.resx
deleted file mode 100644
index af7dbebba..000000000
--- a/Agent.Installer.Win/Properties/Resources.resx
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
\ No newline at end of file
diff --git a/Agent.Installer.Win/Properties/Settings.Designer.cs b/Agent.Installer.Win/Properties/Settings.Designer.cs
deleted file mode 100644
index 760c1573f..000000000
--- a/Agent.Installer.Win/Properties/Settings.Designer.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// This code was generated by a tool.
-// Runtime Version:4.0.30319.42000
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-//
-//------------------------------------------------------------------------------
-
-namespace Remotely.Agent.Installer.Win.Properties {
-
-
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")]
- internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
-
- private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
-
- public static Settings Default {
- get {
- return defaultInstance;
- }
- }
- }
-}
diff --git a/Agent.Installer.Win/Properties/Settings.settings b/Agent.Installer.Win/Properties/Settings.settings
deleted file mode 100644
index 033d7a5e9..000000000
--- a/Agent.Installer.Win/Properties/Settings.settings
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Agent.Installer.Win/Services/Executor.cs b/Agent.Installer.Win/Services/Executor.cs
deleted file mode 100644
index 33d39bf2e..000000000
--- a/Agent.Installer.Win/Services/Executor.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using System.Windows.Input;
-
-namespace Remotely.Agent.Installer.Win.Services
-{
- public class Executor : ICommand
- {
- public Executor(Action