Creating repo
This commit is contained in:
commit
7020042aa0
@ -0,0 +1,9 @@
|
||||
Namespace Encryptors
|
||||
|
||||
Public Interface IPasswordEncryptionMethod
|
||||
|
||||
Function Encode(ByVal username As String, ByVal anOrgPin As String, ByVal aNewPassword As String, ByVal aUserGUID As Guid, aSalt As String) As String
|
||||
|
||||
End Interface
|
||||
|
||||
End Namespace
|
||||
@ -0,0 +1,49 @@
|
||||
Imports System.Configuration
|
||||
Imports Strata.Configuration.Client.Models.Jazz
|
||||
|
||||
Namespace Encryptors
|
||||
|
||||
Public Class UberEncryptionMethod
|
||||
Implements IPasswordEncryptionMethod
|
||||
|
||||
Friend Sub New()
|
||||
|
||||
End Sub
|
||||
|
||||
#Region " Methods "
|
||||
|
||||
Public Shared Function GetUberMonet(ByVal anOrgPin As String) As String
|
||||
Return GetUberMonet(Date.Today, anOrgPin, ConfigurationManager.AppSettings(NameOf(StrataJazzOptions.UberMonetKey)))
|
||||
End Function
|
||||
|
||||
Private Shared Function GetUberMonet(ByVal aDate As Date, ByVal anOrgPIN As String, ByVal aKey As String) As String
|
||||
Dim ha As New EncryptionUtils.Hasher(EncryptionUtils.Hasher.Provider.SHA1)
|
||||
|
||||
Dim lsHashBefore As String
|
||||
Dim lsResult As String
|
||||
|
||||
lsHashBefore = Format(aDate, "dd-MM-yyyy") & "-" & anOrgPIN & "-" & aKey
|
||||
|
||||
Dim d As New EncryptionUtils.Data(lsHashBefore)
|
||||
|
||||
Dim dResult As EncryptionUtils.Data = ha.Calculate(d)
|
||||
lsResult = Left(dResult.Hex, 6)
|
||||
|
||||
ha = Nothing
|
||||
|
||||
Return lsResult
|
||||
End Function
|
||||
|
||||
#End Region
|
||||
|
||||
#Region " IPasswordEncryptionMethod "
|
||||
|
||||
Private Function Encode(ByVal username As String, ByVal anOrgPin As String, ByVal aNewPassword As String, ByVal aUserGUID As System.Guid, aSalt As String) As String Implements IPasswordEncryptionMethod.Encode
|
||||
Return GetUberMonet(anOrgPin)
|
||||
End Function
|
||||
|
||||
#End Region
|
||||
|
||||
End Class
|
||||
|
||||
End Namespace
|
||||
@ -0,0 +1,47 @@
|
||||
Imports System.Configuration
|
||||
Imports System.Security.Cryptography
|
||||
Imports System.Text
|
||||
Imports Strata.Configuration.Client.Models.Jazz
|
||||
|
||||
Namespace Encryptors
|
||||
|
||||
Public Class UserGUIDEncryptionMethod
|
||||
Implements IPasswordEncryptionMethod
|
||||
|
||||
#Region " Declarations "
|
||||
|
||||
Private Const NUMBER_ITERATIONS As Integer = 100000
|
||||
|
||||
#End Region
|
||||
|
||||
#Region " Methods "
|
||||
|
||||
Public Function Encode(ByVal username As String, ByVal anOrgPin As String, ByVal aNewPassword As String, ByVal aUserGUID As System.Guid, aSalt As String) As String Implements IPasswordEncryptionMethod.Encode
|
||||
Dim salt As String = aUserGUID.ToString & ConfigurationManager.AppSettings(NameOf(StrataJazzOptions.UserGuidEncryptionKey))
|
||||
|
||||
Dim result As String = GetHashedValue(aNewPassword, salt)
|
||||
For i As Integer = 1 To NUMBER_ITERATIONS
|
||||
result = GetHashedValue(result)
|
||||
Next
|
||||
|
||||
Return result
|
||||
End Function
|
||||
|
||||
Private Shared Function GetHashedValue(ByVal aValue As String) As String
|
||||
|
||||
'Create an instance of the sha encrypter
|
||||
Using hasher As New SHA1Managed
|
||||
Return Convert.ToBase64String(hasher.ComputeHash(Encoding.UTF8.GetBytes(aValue)))
|
||||
End Using
|
||||
|
||||
End Function
|
||||
|
||||
Private Shared Function GetHashedValue(ByVal aValue As String, ByVal aSalt As String) As String
|
||||
Return GetHashedValue(aValue & aSalt)
|
||||
End Function
|
||||
|
||||
#End Region
|
||||
|
||||
End Class
|
||||
|
||||
End Namespace
|
||||
@ -0,0 +1,34 @@
|
||||
Imports System.Configuration
|
||||
Imports System.Security.Cryptography
|
||||
Imports System.Text
|
||||
Imports Strata.Configuration.Client.Models.Jazz
|
||||
|
||||
Namespace Encryptors
|
||||
|
||||
Public Class UserSaltEncryptionMethod
|
||||
Implements IPasswordEncryptionMethod
|
||||
|
||||
#Region " Declarations "
|
||||
|
||||
Private Const NUMBER_ITERATIONS As Integer = 100000
|
||||
|
||||
#End Region
|
||||
|
||||
#Region " Methods "
|
||||
|
||||
Public Function Encode(ByVal username As String, ByVal anOrgPin As String, ByVal aNewPassword As String, ByVal aUserGUID As System.Guid, aSalt As String) As String Implements IPasswordEncryptionMethod.Encode
|
||||
Dim saltAndPepper As String = aSalt & ConfigurationManager.AppSettings(NameOf(StrataJazzOptions.UserSaltEncryptionKey))
|
||||
|
||||
Using deriveBytes As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(aNewPassword, Encoding.UTF8.GetBytes(saltAndPepper), NUMBER_ITERATIONS)
|
||||
Dim password As Byte() = deriveBytes.GetBytes(24)
|
||||
|
||||
Return Convert.ToBase64String(password)
|
||||
End Using
|
||||
End Function
|
||||
|
||||
|
||||
#End Region
|
||||
|
||||
End Class
|
||||
|
||||
End Namespace
|
||||
6
vb-migration/Strata.Base.Internal/InternalConstants.vb
Normal file
6
vb-migration/Strata.Base.Internal/InternalConstants.vb
Normal file
@ -0,0 +1,6 @@
|
||||
Friend Class InternalConstants
|
||||
|
||||
'WARNING: This should always match the value in Strata.Base.Constants.XConstants.APPLICATION_VERSION
|
||||
Public Const APPLICATION_VERSION As String = "2025.11"
|
||||
|
||||
End Class
|
||||
13
vb-migration/Strata.Base.Internal/My Project/Application.Designer.vb
generated
Normal file
13
vb-migration/Strata.Base.Internal/My Project/Application.Designer.vb
generated
Normal file
@ -0,0 +1,13 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' 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.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<MySubMain>false</MySubMain>
|
||||
<SingleInstance>false</SingleInstance>
|
||||
<ShutdownMode>0</ShutdownMode>
|
||||
<EnableVisualStyles>true</EnableVisualStyles>
|
||||
<AuthenticationMode>0</AuthenticationMode>
|
||||
<ApplicationType>1</ApplicationType>
|
||||
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
|
||||
</MyApplicationData>
|
||||
36
vb-migration/Strata.Base.Internal/My Project/AssemblyInfo.vb
Normal file
36
vb-migration/Strata.Base.Internal/My Project/AssemblyInfo.vb
Normal file
@ -0,0 +1,36 @@
|
||||
Imports System
|
||||
Imports System.Reflection
|
||||
Imports System.Runtime.InteropServices
|
||||
|
||||
' 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.
|
||||
|
||||
' Review the values of the assembly attributes
|
||||
|
||||
<Assembly: AssemblyTitle("Strata.Biz.Internal")>
|
||||
<Assembly: AssemblyDescription("")>
|
||||
<Assembly: AssemblyCompany("Strata Decision Technology, LLC")>
|
||||
<Assembly: AssemblyProduct("Strata.Biz.Internal")>
|
||||
<Assembly: AssemblyCopyright("© 2006-2012 Strata Decision Technology, LLC")>
|
||||
<Assembly: AssemblyTrademark("")>
|
||||
|
||||
<Assembly: ComVisible(False)>
|
||||
|
||||
'The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
<Assembly: Guid("dfd98904-a580-4549-90ea-95c9a5504029")>
|
||||
|
||||
' 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(Strata.Base.Constants.XConstants.APPLICATION_VERSION)>
|
||||
|
||||
<Assembly: AssemblyVersion(InternalConstants.APPLICATION_VERSION)>
|
||||
<Assembly: AssemblyFileVersion(InternalConstants.APPLICATION_VERSION)>
|
||||
|
||||
63
vb-migration/Strata.Base.Internal/My Project/Resources.Designer.vb
generated
Normal file
63
vb-migration/Strata.Base.Internal/My Project/Resources.Designer.vb
generated
Normal file
@ -0,0 +1,63 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' 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.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
Imports System
|
||||
|
||||
Namespace My.Resources
|
||||
|
||||
'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.
|
||||
'''<summary>
|
||||
''' A strongly-typed resource class, for looking up localized strings, etc.
|
||||
'''</summary>
|
||||
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0"), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
|
||||
Friend Module Resources
|
||||
|
||||
Private resourceMan As Global.System.Resources.ResourceManager
|
||||
|
||||
Private resourceCulture As Global.System.Globalization.CultureInfo
|
||||
|
||||
'''<summary>
|
||||
''' Returns the cached ResourceManager instance used by this class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
|
||||
Get
|
||||
If Object.ReferenceEquals(resourceMan, Nothing) Then
|
||||
Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("Strata.Base.Internal.Resources", GetType(Resources).Assembly)
|
||||
resourceMan = temp
|
||||
End If
|
||||
Return resourceMan
|
||||
End Get
|
||||
End Property
|
||||
|
||||
'''<summary>
|
||||
''' Overrides the current thread's CurrentUICulture property for all
|
||||
''' resource lookups using this strongly typed resource class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend Property Culture() As Global.System.Globalization.CultureInfo
|
||||
Get
|
||||
Return resourceCulture
|
||||
End Get
|
||||
Set
|
||||
resourceCulture = value
|
||||
End Set
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
117
vb-migration/Strata.Base.Internal/My Project/Resources.resx
Normal file
117
vb-migration/Strata.Base.Internal/My Project/Resources.resx
Normal file
@ -0,0 +1,117 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
82
vb-migration/Strata.Base.Internal/My Project/Settings.Designer.vb
generated
Normal file
82
vb-migration/Strata.Base.Internal/My Project/Settings.Designer.vb
generated
Normal file
@ -0,0 +1,82 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' 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.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
|
||||
Namespace My
|
||||
|
||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.12.0.0"), _
|
||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Partial Friend NotInheritable Class MySettings
|
||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||
|
||||
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
|
||||
|
||||
#Region "My.Settings Auto-Save Functionality"
|
||||
#If _MyType = "WindowsForms" Then
|
||||
Private Shared addedHandler As Boolean
|
||||
|
||||
Private Shared addedHandlerLockObject As New Object
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs)
|
||||
If My.Application.SaveMySettingsOnExit Then
|
||||
My.Settings.Save()
|
||||
End If
|
||||
End Sub
|
||||
#End If
|
||||
#End Region
|
||||
|
||||
Public Shared ReadOnly Property [Default]() As MySettings
|
||||
Get
|
||||
|
||||
#If _MyType = "WindowsForms" Then
|
||||
If Not addedHandler Then
|
||||
SyncLock addedHandlerLockObject
|
||||
If Not addedHandler Then
|
||||
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
|
||||
addedHandler = True
|
||||
End If
|
||||
End SyncLock
|
||||
End If
|
||||
#End If
|
||||
Return defaultInstance
|
||||
End Get
|
||||
End Property
|
||||
|
||||
<Global.System.Configuration.ApplicationScopedSettingAttribute(), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Configuration.DefaultSettingValueAttribute("Development")> _
|
||||
Public ReadOnly Property Environment() As String
|
||||
Get
|
||||
Return CType(Me("Environment"),String)
|
||||
End Get
|
||||
End Property
|
||||
End Class
|
||||
End Namespace
|
||||
|
||||
Namespace My
|
||||
|
||||
<Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
|
||||
Friend Module MySettingsProperty
|
||||
|
||||
<Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
|
||||
Friend ReadOnly Property Settings() As Global.Strata.Base.Internal.My.MySettings
|
||||
Get
|
||||
Return Global.Strata.Base.Internal.My.MySettings.Default
|
||||
End Get
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
@ -0,0 +1,9 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="true">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="Environment" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">Development</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
719
vb-migration/Strata.Base.Internal/Security/Encryption.vb
Normal file
719
vb-migration/Strata.Base.Internal/Security/Encryption.vb
Normal file
@ -0,0 +1,719 @@
|
||||
Imports System.IO
|
||||
Imports System.Security.Cryptography
|
||||
Imports System.Text
|
||||
|
||||
Namespace EncryptionUtils
|
||||
|
||||
#Region " Hash "
|
||||
|
||||
''' <summary>
|
||||
''' Hash functions are fundamental to modern cryptography. These functions map binary
|
||||
''' strings of an arbitrary length to small binary strings of a fixed length, known as
|
||||
''' hash values. A cryptographic hash function has the property that it is computationally
|
||||
''' infeasible to find two distinct inputs that hash to the same value. Hash functions
|
||||
''' are commonly used with digital signatures and for data integrity.
|
||||
''' </summary>
|
||||
Friend Class Hasher
|
||||
|
||||
''' <summary>
|
||||
''' Type of hash; some are security oriented, others are fast and simple
|
||||
''' </summary>
|
||||
Friend Enum Provider
|
||||
''' <summary>
|
||||
''' Secure Hashing Algorithm provider, SHA-1 variant, 160-bit
|
||||
''' </summary>
|
||||
SHA1
|
||||
''' <summary>
|
||||
''' Secure Hashing Algorithm provider, SHA-2 variant, 256-bit
|
||||
''' </summary>
|
||||
SHA256
|
||||
''' <summary>
|
||||
''' Secure Hashing Algorithm provider, SHA-2 variant, 384-bit
|
||||
''' </summary>
|
||||
SHA384
|
||||
''' <summary>
|
||||
''' Secure Hashing Algorithm provider, SHA-2 variant, 512-bit
|
||||
''' </summary>
|
||||
SHA512
|
||||
''' <summary>
|
||||
''' Message Digest algorithm 5, 128-bit
|
||||
''' </summary>
|
||||
MD5
|
||||
End Enum
|
||||
|
||||
Private _Hash As HashAlgorithm
|
||||
Private _HashValue As New Data
|
||||
|
||||
Private Sub New()
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Instantiate a new hash of the specified type
|
||||
''' </summary>
|
||||
Friend Sub New(ByVal p As Provider)
|
||||
Select Case p
|
||||
Case Provider.MD5
|
||||
_Hash = New MD5CryptoServiceProvider
|
||||
Case Provider.SHA1
|
||||
_Hash = New SHA1Managed
|
||||
Case Provider.SHA256
|
||||
_Hash = New SHA256Managed
|
||||
Case Provider.SHA384
|
||||
_Hash = New SHA384Managed
|
||||
Case Provider.SHA512
|
||||
_Hash = New SHA512Managed
|
||||
End Select
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Returns the previously calculated hash
|
||||
''' </summary>
|
||||
Friend ReadOnly Property Value() As Data
|
||||
Get
|
||||
Return _HashValue
|
||||
End Get
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' Calculates hash on a stream of arbitrary length
|
||||
''' </summary>
|
||||
Friend Function Calculate(ByRef s As System.IO.Stream) As Data
|
||||
_HashValue.Bytes = _Hash.ComputeHash(s)
|
||||
Return _HashValue
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Calculates hash for fixed length <see cref="Data"/>
|
||||
''' </summary>
|
||||
Friend Function Calculate(ByVal d As Data) As Data
|
||||
Return CalculatePrivate(d.Bytes)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Calculates hash for a string with a prefixed salt value.
|
||||
''' A "salt" is random data prefixed to every hashed value to prevent
|
||||
''' common dictionary attacks.
|
||||
''' </summary>
|
||||
Friend Function Calculate(ByVal d As Data, ByVal salt As Data) As Data
|
||||
Dim nb(d.Bytes.Length + salt.Bytes.Length - 1) As Byte
|
||||
salt.Bytes.CopyTo(nb, 0)
|
||||
d.Bytes.CopyTo(nb, salt.Bytes.Length)
|
||||
Return CalculatePrivate(nb)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Calculates hash for an array of bytes
|
||||
''' </summary>
|
||||
Private Function CalculatePrivate(ByVal b() As Byte) As Data
|
||||
_HashValue.Bytes = _Hash.ComputeHash(b)
|
||||
Return _HashValue
|
||||
End Function
|
||||
|
||||
End Class
|
||||
#End Region
|
||||
|
||||
#Region " Symmetric "
|
||||
|
||||
''' <summary>
|
||||
''' Symmetric encryption uses a single key to encrypt and decrypt.
|
||||
''' Both parties (encryptor and decryptor) must share the same secret key.
|
||||
''' </summary>
|
||||
Friend Class SymmetricEncryptor
|
||||
|
||||
Private Const _DefaultIntializationVector As String = "%1Az=-@qT"
|
||||
Private Const _BufferSize As Integer = 2048
|
||||
|
||||
Friend Enum Provider
|
||||
''' <summary>
|
||||
''' The Data Encryption Standard provider supports a 64 bit key only
|
||||
''' </summary>
|
||||
DES
|
||||
''' <summary>
|
||||
''' The Rivest Cipher 2 provider supports keys ranging from 40 to 128 bits, default is 128 bits
|
||||
''' </summary>
|
||||
RC2
|
||||
''' <summary>
|
||||
''' The Rijndael (also known as AES) provider supports keys of 128, 192, or 256 bits with a default of 256 bits
|
||||
''' </summary>
|
||||
Rijndael
|
||||
''' <summary>
|
||||
''' The TripleDES provider (also known as 3DES) supports keys of 128 or 192 bits with a default of 192 bits
|
||||
''' </summary>
|
||||
TripleDES
|
||||
End Enum
|
||||
|
||||
Private _data As Data
|
||||
Private _key As Data
|
||||
Private _iv As Data
|
||||
Private _crypto As SymmetricAlgorithm
|
||||
Private _EncryptedBytes As Byte()
|
||||
Private _UseDefaultInitializationVector As Boolean
|
||||
|
||||
Private Sub New()
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Instantiates a new symmetric encryption object using the specified provider.
|
||||
''' </summary>
|
||||
Friend Sub New(ByVal provider As Provider, Optional ByVal useDefaultInitializationVector As Boolean = True)
|
||||
Select Case provider
|
||||
Case Provider.DES
|
||||
_crypto = New DESCryptoServiceProvider
|
||||
Case Provider.RC2
|
||||
_crypto = New RC2CryptoServiceProvider
|
||||
Case Provider.Rijndael
|
||||
_crypto = New RijndaelManaged
|
||||
Case Provider.TripleDES
|
||||
_crypto = New TripleDESCryptoServiceProvider
|
||||
End Select
|
||||
|
||||
'-- make sure key and IV are always set, no matter what
|
||||
Me.Key = RandomKey()
|
||||
If useDefaultInitializationVector Then
|
||||
Me.IntializationVector = New Data(_DefaultIntializationVector)
|
||||
Else
|
||||
Me.IntializationVector = RandomInitializationVector()
|
||||
End If
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Key size in bytes. We use the default key size for any given provider; if you
|
||||
''' want to force a specific key size, set this property
|
||||
''' </summary>
|
||||
Friend Property KeySizeBytes() As Integer
|
||||
Get
|
||||
Return _crypto.KeySize \ 8
|
||||
End Get
|
||||
Set(ByVal Value As Integer)
|
||||
_crypto.KeySize = Value * 8
|
||||
_key.MaxBytes = Value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' Key size in bits. We use the default key size for any given provider; if you
|
||||
''' want to force a specific key size, set this property
|
||||
''' </summary>
|
||||
Friend Property KeySizeBits() As Integer
|
||||
Get
|
||||
Return _crypto.KeySize
|
||||
End Get
|
||||
Set(ByVal Value As Integer)
|
||||
_crypto.KeySize = Value
|
||||
_key.MaxBits = Value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' The key used to encrypt/decrypt data
|
||||
''' </summary>
|
||||
Friend Property Key() As Data
|
||||
Get
|
||||
Return _key
|
||||
End Get
|
||||
Set(ByVal Value As Data)
|
||||
_key = Value
|
||||
_key.MaxBytes = _crypto.LegalKeySizes(0).MaxSize \ 8
|
||||
_key.MinBytes = _crypto.LegalKeySizes(0).MinSize \ 8
|
||||
_key.StepBytes = _crypto.LegalKeySizes(0).SkipSize \ 8
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' Using the default Cipher Block Chaining (CBC) mode, all data blocks are processed using
|
||||
''' the value derived from the previous block; the first data block has no previous data block
|
||||
''' to use, so it needs an InitializationVector to feed the first block
|
||||
''' </summary>
|
||||
Friend Property IntializationVector() As Data
|
||||
Get
|
||||
Return _iv
|
||||
End Get
|
||||
Set(ByVal Value As Data)
|
||||
_iv = Value
|
||||
_iv.MaxBytes = _crypto.BlockSize \ 8
|
||||
_iv.MinBytes = _crypto.BlockSize \ 8
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' generates a random Initialization Vector, if one was not provided
|
||||
''' </summary>
|
||||
Friend Function RandomInitializationVector() As Data
|
||||
_crypto.GenerateIV()
|
||||
Dim d As New Data(_crypto.IV)
|
||||
Return d
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' generates a random Key, if one was not provided
|
||||
''' </summary>
|
||||
Friend Function RandomKey() As Data
|
||||
_crypto.GenerateKey()
|
||||
Dim d As New Data(_crypto.Key)
|
||||
Return d
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Ensures that _crypto object has valid Key and IV
|
||||
''' prior to any attempt to encrypt/decrypt anything
|
||||
''' </summary>
|
||||
Private Sub ValidateKeyAndIv(ByVal isEncrypting As Boolean)
|
||||
If _key.IsEmpty Then
|
||||
If isEncrypting Then
|
||||
_key = RandomKey()
|
||||
Else
|
||||
Throw New CryptographicException("No key was provided for the decryption operation!")
|
||||
End If
|
||||
End If
|
||||
If _iv.IsEmpty Then
|
||||
If isEncrypting Then
|
||||
_iv = RandomInitializationVector()
|
||||
Else
|
||||
Throw New CryptographicException("No initialization vector was provided for the decryption operation!")
|
||||
End If
|
||||
End If
|
||||
_crypto.Key = _key.Bytes
|
||||
_crypto.IV = _iv.Bytes
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Encrypts the specified Data using provided key
|
||||
''' </summary>
|
||||
Friend Function Encrypt(ByVal d As Data, ByVal key As Data) As Data
|
||||
Me.Key = key
|
||||
Return Encrypt(d)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Encrypts the specified Data using preset key and preset initialization vector
|
||||
''' </summary>
|
||||
Friend Function Encrypt(ByVal d As Data) As Data
|
||||
Dim ms As New IO.MemoryStream
|
||||
|
||||
ValidateKeyAndIv(True)
|
||||
|
||||
Dim cs As New CryptoStream(ms, _crypto.CreateEncryptor(), CryptoStreamMode.Write)
|
||||
cs.Write(d.Bytes, 0, d.Bytes.Length)
|
||||
cs.Close()
|
||||
ms.Close()
|
||||
|
||||
Return New Data(ms.ToArray)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Encrypts the stream to memory using provided key and provided initialization vector
|
||||
''' </summary>
|
||||
Friend Function Encrypt(ByVal s As Stream, ByVal key As Data, ByVal iv As Data) As Data
|
||||
Me.IntializationVector = iv
|
||||
Me.Key = key
|
||||
Return Encrypt(s)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Encrypts the stream to memory using specified key
|
||||
''' </summary>
|
||||
Friend Function Encrypt(ByVal s As Stream, ByVal key As Data) As Data
|
||||
Me.Key = key
|
||||
Return Encrypt(s)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Encrypts the specified stream to memory using preset key and preset initialization vector
|
||||
''' </summary>
|
||||
Friend Function Encrypt(ByVal s As Stream) As Data
|
||||
Dim ms As New IO.MemoryStream
|
||||
Dim b(_BufferSize) As Byte
|
||||
Dim i As Integer
|
||||
|
||||
ValidateKeyAndIv(True)
|
||||
|
||||
Dim cs As New CryptoStream(ms, _crypto.CreateEncryptor(), CryptoStreamMode.Write)
|
||||
i = s.Read(b, 0, _BufferSize)
|
||||
Do While i > 0
|
||||
cs.Write(b, 0, i)
|
||||
i = s.Read(b, 0, _BufferSize)
|
||||
Loop
|
||||
|
||||
cs.Close()
|
||||
ms.Close()
|
||||
|
||||
Return New Data(ms.ToArray)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Decrypts the specified data using provided key and preset initialization vector
|
||||
''' </summary>
|
||||
Friend Function Decrypt(ByVal encryptedData As Data, ByVal key As Data) As Data
|
||||
Me.Key = key
|
||||
Return Decrypt(encryptedData)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Decrypts the specified stream using provided key and preset initialization vector
|
||||
''' </summary>
|
||||
Friend Function Decrypt(ByVal encryptedStream As Stream, ByVal key As Data) As Data
|
||||
Me.Key = key
|
||||
Return Decrypt(encryptedStream)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Decrypts the specified stream using preset key and preset initialization vector
|
||||
''' </summary>
|
||||
Friend Function Decrypt(ByVal encryptedStream As Stream) As Data
|
||||
Dim ms As New System.IO.MemoryStream
|
||||
Dim b(_BufferSize) As Byte
|
||||
|
||||
ValidateKeyAndIv(False)
|
||||
Dim cs As New CryptoStream(encryptedStream,
|
||||
_crypto.CreateDecryptor(), CryptoStreamMode.Read)
|
||||
|
||||
Dim i As Integer
|
||||
i = cs.Read(b, 0, _BufferSize)
|
||||
|
||||
Do While i > 0
|
||||
ms.Write(b, 0, i)
|
||||
i = cs.Read(b, 0, _BufferSize)
|
||||
Loop
|
||||
cs.Close()
|
||||
ms.Close()
|
||||
|
||||
Return New Data(ms.ToArray)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Decrypts the specified data using preset key and preset initialization vector
|
||||
''' </summary>
|
||||
Friend Function Decrypt(ByVal encryptedData As Data) As Data
|
||||
Dim ms As New System.IO.MemoryStream(encryptedData.Bytes, 0, encryptedData.Bytes.Length)
|
||||
Dim b() As Byte = New Byte(encryptedData.Bytes.Length - 1) {}
|
||||
|
||||
ValidateKeyAndIv(False)
|
||||
Dim cs As New CryptoStream(ms, _crypto.CreateDecryptor(), CryptoStreamMode.Read)
|
||||
|
||||
Try
|
||||
cs.Read(b, 0, encryptedData.Bytes.Length - 1)
|
||||
Catch ex As CryptographicException
|
||||
Throw New CryptographicException("Unable to decrypt data. The provided key may be invalid.", ex)
|
||||
Finally
|
||||
cs.Close()
|
||||
End Try
|
||||
Return New Data(b)
|
||||
End Function
|
||||
|
||||
End Class
|
||||
|
||||
#End Region
|
||||
|
||||
#Region " Data "
|
||||
|
||||
''' <summary>
|
||||
''' represents Hex, Byte, Base64, or String data to encrypt/decrypt;
|
||||
''' use the .Text property to set/get a string representation
|
||||
''' use the .Hex property to set/get a string-based Hexadecimal representation
|
||||
''' use the .Base64 to set/get a string-based Base64 representation
|
||||
''' </summary>
|
||||
Friend Class Data
|
||||
Private _b As Byte() = Nothing
|
||||
Private _MaxBytes As Integer = 0
|
||||
Private _MinBytes As Integer = 0
|
||||
Private _StepBytes As Integer = 0
|
||||
|
||||
''' <summary>
|
||||
''' Determines the default text encoding across ALL Data instances
|
||||
''' </summary>
|
||||
Friend Shared DefaultEncoding As Text.Encoding = System.Text.Encoding.GetEncoding("Windows-1252")
|
||||
|
||||
''' <summary>
|
||||
''' Determines the default text encoding for this Data instance
|
||||
''' </summary>
|
||||
Friend Encoding As Text.Encoding = DefaultEncoding
|
||||
|
||||
''' <summary>
|
||||
''' Creates new, empty encryption data
|
||||
''' </summary>
|
||||
Friend Sub New()
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Creates new encryption data with the specified byte array
|
||||
''' </summary>
|
||||
Friend Sub New(ByVal b As Byte())
|
||||
_b = b
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Creates new encryption data with the specified string;
|
||||
''' will be converted to byte array using default encoding
|
||||
''' </summary>
|
||||
Friend Sub New(ByVal s As String)
|
||||
Me.Text = s
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Creates new encryption data using the specified string and the
|
||||
''' specified encoding to convert the string to a byte array.
|
||||
''' </summary>
|
||||
Friend Sub New(ByVal s As String, ByVal encoding As System.Text.Encoding)
|
||||
Me.Encoding = encoding
|
||||
Me.Text = s
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' returns true if no data is present
|
||||
''' </summary>
|
||||
Friend ReadOnly Property IsEmpty() As Boolean
|
||||
Get
|
||||
If _b Is Nothing Then
|
||||
Return True
|
||||
End If
|
||||
If _b.Length = 0 Then
|
||||
Return True
|
||||
End If
|
||||
Return False
|
||||
End Get
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' allowed step interval, in bytes, for this data; if 0, no limit
|
||||
''' </summary>
|
||||
Friend Property StepBytes() As Integer
|
||||
Get
|
||||
Return _StepBytes
|
||||
End Get
|
||||
Set(ByVal Value As Integer)
|
||||
_StepBytes = Value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' allowed step interval, in bits, for this data; if 0, no limit
|
||||
''' </summary>
|
||||
Friend Property StepBits() As Integer
|
||||
Get
|
||||
Return _StepBytes * 8
|
||||
End Get
|
||||
Set(ByVal Value As Integer)
|
||||
_StepBytes = Value \ 8
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' minimum number of bytes allowed for this data; if 0, no limit
|
||||
''' </summary>
|
||||
Friend Property MinBytes() As Integer
|
||||
Get
|
||||
Return _MinBytes
|
||||
End Get
|
||||
Set(ByVal Value As Integer)
|
||||
_MinBytes = Value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' minimum number of bits allowed for this data; if 0, no limit
|
||||
''' </summary>
|
||||
Friend Property MinBits() As Integer
|
||||
Get
|
||||
Return _MinBytes * 8
|
||||
End Get
|
||||
Set(ByVal Value As Integer)
|
||||
_MinBytes = Value \ 8
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' maximum number of bytes allowed for this data; if 0, no limit
|
||||
''' </summary>
|
||||
Friend Property MaxBytes() As Integer
|
||||
Get
|
||||
Return _MaxBytes
|
||||
End Get
|
||||
Set(ByVal Value As Integer)
|
||||
_MaxBytes = Value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' maximum number of bits allowed for this data; if 0, no limit
|
||||
''' </summary>
|
||||
Friend Property MaxBits() As Integer
|
||||
Get
|
||||
Return _MaxBytes * 8
|
||||
End Get
|
||||
Set(ByVal Value As Integer)
|
||||
_MaxBytes = Value \ 8
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' Returns the byte representation of the data;
|
||||
''' This will be padded to MinBytes and trimmed to MaxBytes as necessary!
|
||||
''' </summary>
|
||||
Friend Property Bytes() As Byte()
|
||||
Get
|
||||
If _MaxBytes > 0 Then
|
||||
If _b.Length > _MaxBytes Then
|
||||
Dim b(_MaxBytes - 1) As Byte
|
||||
Array.Copy(_b, b, b.Length)
|
||||
_b = b
|
||||
End If
|
||||
End If
|
||||
If _MinBytes > 0 Then
|
||||
If _b.Length < _MinBytes Then
|
||||
Dim b(_MinBytes - 1) As Byte
|
||||
Array.Copy(_b, b, _b.Length)
|
||||
_b = b
|
||||
End If
|
||||
End If
|
||||
Return _b
|
||||
End Get
|
||||
Set(ByVal Value As Byte())
|
||||
_b = Value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' Sets or returns text representation of bytes using the default text encoding
|
||||
''' </summary>
|
||||
Friend Property Text() As String
|
||||
Get
|
||||
If _b Is Nothing Then
|
||||
Return ""
|
||||
Else
|
||||
'-- need to handle nulls here; oddly, C# will happily convert
|
||||
'-- nulls into the string whereas VB stops converting at the
|
||||
'-- first null!
|
||||
Dim i As Integer = Array.IndexOf(_b, CType(0, Byte))
|
||||
If i >= 0 Then
|
||||
Return Me.Encoding.GetString(_b, 0, i)
|
||||
Else
|
||||
Return Me.Encoding.GetString(_b)
|
||||
End If
|
||||
End If
|
||||
End Get
|
||||
Set(ByVal Value As String)
|
||||
_b = Me.Encoding.GetBytes(Value)
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' Sets or returns Hex string representation of this data
|
||||
''' </summary>
|
||||
Friend Property Hex() As String
|
||||
Get
|
||||
Return Utils.ToHex(_b)
|
||||
End Get
|
||||
Set(ByVal Value As String)
|
||||
_b = Utils.FromHex(Value)
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' Sets or returns Base64 string representation of this data
|
||||
''' </summary>
|
||||
Friend Property Base64() As String
|
||||
Get
|
||||
Return Utils.ToBase64(_b)
|
||||
End Get
|
||||
Set(ByVal Value As String)
|
||||
_b = Utils.FromBase64(Value)
|
||||
End Set
|
||||
End Property
|
||||
|
||||
''' <summary>
|
||||
''' Returns text representation of bytes using the default text encoding
|
||||
''' </summary>
|
||||
Friend Shadows Function ToString() As String
|
||||
Return Me.Text
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' returns Base64 string representation of this data
|
||||
''' </summary>
|
||||
Friend Function ToBase64() As String
|
||||
Return Me.Base64
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' returns Hex string representation of this data
|
||||
''' </summary>
|
||||
Friend Function ToHex() As String
|
||||
Return Me.Hex
|
||||
End Function
|
||||
|
||||
End Class
|
||||
|
||||
#End Region
|
||||
|
||||
#Region " Utils "
|
||||
|
||||
''' <summary>
|
||||
''' Friend class for shared utility methods used by multiple Encryption classes
|
||||
''' </summary>
|
||||
Friend Class Utils
|
||||
|
||||
''' <summary>
|
||||
''' converts an array of bytes to a string Hex representation
|
||||
''' </summary>
|
||||
Friend Shared Function ToHex(ByVal ba() As Byte) As String
|
||||
If ba Is Nothing OrElse ba.Length = 0 Then
|
||||
Return ""
|
||||
End If
|
||||
Const HexFormat As String = "{0:X2}"
|
||||
Dim sb As New StringBuilder
|
||||
For Each b As Byte In ba
|
||||
sb.Append(String.Format(HexFormat, b))
|
||||
Next
|
||||
Return sb.ToString
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' converts from a string Hex representation to an array of bytes
|
||||
''' </summary>
|
||||
Friend Shared Function FromHex(ByVal hexEncoded As String) As Byte()
|
||||
If hexEncoded Is Nothing OrElse hexEncoded.Length = 0 Then
|
||||
Return Nothing
|
||||
End If
|
||||
Try
|
||||
Dim l As Integer = Convert.ToInt32(hexEncoded.Length / 2)
|
||||
Dim b(l - 1) As Byte
|
||||
For i As Integer = 0 To l - 1
|
||||
b(i) = Convert.ToByte(hexEncoded.Substring(i * 2, 2), 16)
|
||||
Next
|
||||
Return b
|
||||
Catch ex As Exception
|
||||
Throw New System.FormatException("The provided string does not appear to be Hex encoded:" &
|
||||
Environment.NewLine & hexEncoded & Environment.NewLine, ex)
|
||||
End Try
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' converts from a string Base64 representation to an array of bytes
|
||||
''' </summary>
|
||||
Friend Shared Function FromBase64(ByVal base64Encoded As String) As Byte()
|
||||
If base64Encoded Is Nothing OrElse base64Encoded.Length = 0 Then
|
||||
Return Nothing
|
||||
End If
|
||||
Try
|
||||
Return Convert.FromBase64String(base64Encoded)
|
||||
Catch ex As System.FormatException
|
||||
Throw New System.FormatException("The provided string does not appear to be Base64 encoded:" &
|
||||
Environment.NewLine & base64Encoded & Environment.NewLine, ex)
|
||||
End Try
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' converts from an array of bytes to a string Base64 representation
|
||||
''' </summary>
|
||||
Friend Shared Function ToBase64(ByVal b() As Byte) As String
|
||||
If b Is Nothing OrElse b.Length = 0 Then
|
||||
Return ""
|
||||
End If
|
||||
Return Convert.ToBase64String(b)
|
||||
End Function
|
||||
|
||||
End Class
|
||||
|
||||
#End Region
|
||||
|
||||
End Namespace
|
||||
28
vb-migration/Strata.Base.Internal/Security/SecurityUtils.vb
Normal file
28
vb-migration/Strata.Base.Internal/Security/SecurityUtils.vb
Normal file
@ -0,0 +1,28 @@
|
||||
Public Class SecurityUtils
|
||||
|
||||
#Region " Declarations "
|
||||
|
||||
Private Const ENCRYPTION_KEY_SUFFIX As String = "SDT"
|
||||
#End Region
|
||||
|
||||
#Region " Methods "
|
||||
|
||||
Public Shared Function EncryptValue(value As String, key As String) As String
|
||||
Dim encryption As New EncryptionUtils.SymmetricEncryptor(EncryptionUtils.SymmetricEncryptor.Provider.Rijndael)
|
||||
|
||||
Return encryption.Encrypt(New EncryptionUtils.Data(value), New EncryptionUtils.Data(key & ENCRYPTION_KEY_SUFFIX)).ToBase64
|
||||
End Function
|
||||
|
||||
Public Shared Function DecryptValue(encryptedValue As String, key As String) As String
|
||||
Dim encryption As New EncryptionUtils.SymmetricEncryptor(EncryptionUtils.SymmetricEncryptor.Provider.Rijndael)
|
||||
|
||||
' note EncryptValue returns Base64 string so we need to initialized encryptedData as Base64
|
||||
Dim encryptedData As EncryptionUtils.Data = New EncryptionUtils.Data()
|
||||
encryptedData.Base64 = encryptedValue
|
||||
|
||||
Return encryption.Decrypt(encryptedData, New EncryptionUtils.Data(key & ENCRYPTION_KEY_SUFFIX)).Text
|
||||
End Function
|
||||
|
||||
#End Region
|
||||
|
||||
End Class
|
||||
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RuleSet Name="SonarQube - StrataJazz Sonar way" ToolsVersion="15.0">
|
||||
<Include Path="..\..\.sonarlint\stratajazzvb.ruleset" Action="Default" />
|
||||
</RuleSet>
|
||||
156
vb-migration/Strata.Base.Internal/Strata.Base.Internal.vbproj
Normal file
156
vb-migration/Strata.Base.Internal/Strata.Base.Internal.vbproj
Normal file
@ -0,0 +1,156 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{1B977903-2BD8-4D33-B9DD-88AAC972CD71}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>Strata.Base.Internal</RootNamespace>
|
||||
<AssemblyName>Strata.Base.Internal</AssemblyName>
|
||||
<MyType>Windows</MyType>
|
||||
<SccProjectName>
|
||||
</SccProjectName>
|
||||
<SccLocalPath>
|
||||
</SccLocalPath>
|
||||
<SccAuxPath>
|
||||
</SccAuxPath>
|
||||
<SccProvider>
|
||||
</SccProvider>
|
||||
<OptionStrict>On</OptionStrict>
|
||||
<SignAssembly>false</SignAssembly>
|
||||
<AssemblyOriginatorKeyFile>
|
||||
</AssemblyOriginatorKeyFile>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<OldToolsVersion>3.5</OldToolsVersion>
|
||||
<UpgradeBackupLocation>
|
||||
</UpgradeBackupLocation>
|
||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<DefineDebug>true</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DocumentationFile>Strata.Base.Internal.xml</DocumentationFile>
|
||||
<NoWarn>42353,42354,42355</NoWarn>
|
||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||
<RunCodeAnalysis>false</RunCodeAnalysis>
|
||||
<CodeAnalysisRules>-Microsoft.Design#CA1012;-Microsoft.Design#CA2210;-Microsoft.Design#CA1040;-Microsoft.Design#CA1005;-Microsoft.Design#CA1020;-Microsoft.Design#CA1021;-Microsoft.Design#CA1010;-Microsoft.Design#CA1011;-Microsoft.Design#CA1009;-Microsoft.Design#CA1050;-Microsoft.Design#CA1026;-Microsoft.Design#CA1019;-Microsoft.Design#CA1031;-Microsoft.Design#CA1047;-Microsoft.Design#CA1000;-Microsoft.Design#CA1048;-Microsoft.Design#CA1051;-Microsoft.Design#CA1002;-Microsoft.Design#CA1061;-Microsoft.Design#CA1006;-Microsoft.Design#CA1046;-Microsoft.Design#CA1045;-Microsoft.Design#CA1065;-Microsoft.Design#CA1038;-Microsoft.Design#CA1008;-Microsoft.Design#CA1028;-Microsoft.Design#CA1064;-Microsoft.Design#CA1004;-Microsoft.Design#CA1035;-Microsoft.Design#CA1063;-Microsoft.Design#CA1032;-Microsoft.Design#CA1023;-Microsoft.Design#CA1033;-Microsoft.Design#CA1039;-Microsoft.Design#CA1016;-Microsoft.Design#CA1014;-Microsoft.Design#CA1017;-Microsoft.Design#CA1018;-Microsoft.Design#CA1027;-Microsoft.Design#CA1059;-Microsoft.Design#CA1060;-Microsoft.Design#CA1034;-Microsoft.Design#CA1013;-Microsoft.Design#CA1036;-Microsoft.Design#CA1044;-Microsoft.Design#CA1041;-Microsoft.Design#CA1025;-Microsoft.Design#CA1052;-Microsoft.Design#CA1053;-Microsoft.Design#CA1057;-Microsoft.Design#CA1058;-Microsoft.Design#CA1001;-Microsoft.Design#CA1049;-Microsoft.Design#CA1054;-Microsoft.Design#CA1056;-Microsoft.Design#CA1055;-Microsoft.Design#CA1030;-Microsoft.Design#CA1003;-Microsoft.Design#CA1007;-Microsoft.Design#CA1043;-Microsoft.Design#CA1024;-Microsoft.Globalization#CA1301;-Microsoft.Globalization#CA1302;-Microsoft.Globalization#CA1308;-Microsoft.Globalization#CA1306;-Microsoft.Globalization#CA1304;-Microsoft.Globalization#CA1305;-Microsoft.Globalization#CA2101;-Microsoft.Globalization#CA1300;-Microsoft.Globalization#CA1307;-Microsoft.Globalization#CA1309;-Microsoft.Interoperability#CA1403;-Microsoft.Interoperability#CA1406;-Microsoft.Interoperability#CA1413;-Microsoft.Interoperability#CA1402;-Microsoft.Interoperability#CA1407;-Microsoft.Interoperability#CA1404;-Microsoft.Interoperability#CA1410;-Microsoft.Interoperability#CA1411;-Microsoft.Interoperability#CA1405;-Microsoft.Interoperability#CA1409;-Microsoft.Interoperability#CA1415;-Microsoft.Interoperability#CA1408;-Microsoft.Interoperability#CA1414;-Microsoft.Interoperability#CA1412;-Microsoft.Interoperability#CA1400;-Microsoft.Interoperability#CA1401;-Microsoft.Maintainability#CA1506;-Microsoft.Maintainability#CA1502;-Microsoft.Maintainability#CA1501;-Microsoft.Maintainability#CA1505;-Microsoft.Maintainability#CA1504;-Microsoft.Maintainability#CA1500;-Microsoft.Mobility#CA1600;-Microsoft.Mobility#CA1601;-Microsoft.Naming#CA1702;-Microsoft.Naming#CA1700;-Microsoft.Naming#CA1712;-Microsoft.Naming#CA1713;-Microsoft.Naming#CA1714;-Microsoft.Naming#CA1709;-Microsoft.Naming#CA1704;-Microsoft.Naming#CA1708;-Microsoft.Naming#CA1715;-Microsoft.Naming#CA1710;-Microsoft.Naming#CA1720;-Microsoft.Naming#CA1707;-Microsoft.Naming#CA1722;-Microsoft.Naming#CA1711;-Microsoft.Naming#CA1716;-Microsoft.Naming#CA1717;-Microsoft.Naming#CA1725;-Microsoft.Naming#CA1719;-Microsoft.Naming#CA1721;-Microsoft.Naming#CA1701;-Microsoft.Naming#CA1703;-Microsoft.Naming#CA1724;-Microsoft.Naming#CA1726;-Microsoft.Performance#CA1809;-Microsoft.Performance#CA1811;-Microsoft.Performance#CA1813;-Microsoft.Performance#CA1816;-Microsoft.Performance#CA1800;-Microsoft.Performance#CA1805;-Microsoft.Performance#CA1810;-Microsoft.Performance#CA1824;-Microsoft.Performance#CA1822;-Microsoft.Performance#CA1814;-Microsoft.Performance#CA1819;-Microsoft.Performance#CA1821;-Microsoft.Performance#CA1820;-Microsoft.Performance#CA1802;-Microsoft.Portability#CA1901;-Microsoft.Portability#CA1900;-Microsoft.Reliability#CA2001;-Microsoft.Reliability#CA2002;-Microsoft.Reliability#CA2003;-Microsoft.Reliability#CA2004;-Microsoft.Reliability#CA2006;-Microsoft.Security#CA2116;-Microsoft.Security#CA2117;-Microsoft.Security#CA2105;-Microsoft.Security#CA2115;-Microsoft.Security#CA2102;-Microsoft.Security#CA2104;-Microsoft.Security#CA2122;-Microsoft.Secu
|
||||
rity#CA2114;-Microsoft.Security#CA2123;-Microsoft.Security#CA2111;-Microsoft.Security#CA2108;-Microsoft.Security#CA2107;-Microsoft.Security#CA2103;-Microsoft.Security#CA2118;-Microsoft.Security#CA2109;-Microsoft.Security#CA2119;-Microsoft.Security#CA2106;-Microsoft.Security#CA2112;-Microsoft.Security#CA2120;-Microsoft.Security#CA2121;-Microsoft.Security#CA2126;-Microsoft.Security#CA2124;-Microsoft.Security#CA2127;-Microsoft.Security#CA2128;-Microsoft.Security#CA2129;-Microsoft.Usage#CA2243;-Microsoft.Usage#CA2236;-Microsoft.Usage#CA2227;-Microsoft.Usage#CA2213;-Microsoft.Usage#CA2216;-Microsoft.Usage#CA2214;-Microsoft.Usage#CA2222;-Microsoft.Usage#CA1806;-Microsoft.Usage#CA2217;-Microsoft.Usage#CA2212;-Microsoft.Usage#CA2219;-Microsoft.Usage#CA2201;-Microsoft.Usage#CA2228;-Microsoft.Usage#CA2221;-Microsoft.Usage#CA2220;-Microsoft.Usage#CA2240;-Microsoft.Usage#CA2229;-Microsoft.Usage#CA2238;-Microsoft.Usage#CA2207;-Microsoft.Usage#CA2208;-Microsoft.Usage#CA2235;-Microsoft.Usage#CA2237;-Microsoft.Usage#CA2232;-Microsoft.Usage#CA2223;-Microsoft.Usage#CA2211;-Microsoft.Usage#CA2233;-Microsoft.Usage#CA2225;-Microsoft.Usage#CA2226;-Microsoft.Usage#CA2231;-Microsoft.Usage#CA2224;-Microsoft.Usage#CA2218;-Microsoft.Usage#CA2234;-Microsoft.Usage#CA2239;-Microsoft.Usage#CA2200;-Microsoft.Usage#CA1801;-Microsoft.Usage#CA2242;-Microsoft.Usage#CA2205;-Microsoft.Usage#CA2230</CodeAnalysisRules>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
<CodeAnalysisRuleSet>Strata.Base.Internal.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<DefineDebug>false</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DocumentationFile>Strata.Base.Internal.xml</DocumentationFile>
|
||||
<NoWarn>42353,42354,42355</NoWarn>
|
||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
<CodeAnalysisRuleSet>Strata.Base.Internal.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseDeploy|AnyCPU'">
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>bin\ReleaseDeploy\</OutputPath>
|
||||
<DocumentationFile>Strata.Base.Internal.xml</DocumentationFile>
|
||||
<Optimize>true</Optimize>
|
||||
<NoWarn>42353,42354,42355</NoWarn>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
<CodeAnalysisRuleSet>Strata.Base.Internal.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.configuration" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Import Include="Microsoft.VisualBasic" />
|
||||
<Import Include="System" />
|
||||
<Import Include="System.Collections" />
|
||||
<Import Include="System.Collections.Generic" />
|
||||
<Import Include="System.Data" />
|
||||
<Import Include="System.Diagnostics" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Encryptors\IPasswordEncryptionMethod.vb" />
|
||||
<Compile Include="Encryptors\UberEncryptionMethod.vb" />
|
||||
<Compile Include="Encryptors\UserSaltEncryptionMethod.vb" />
|
||||
<Compile Include="InternalConstants.vb" />
|
||||
<Compile Include="My Project\AssemblyInfo.vb" />
|
||||
<Compile Include="My Project\Application.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Application.myapp</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="My Project\Resources.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="My Project\Settings.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
<Compile Include="Security\Encryption.vb" />
|
||||
<Compile Include="Security\SecurityUtils.vb" />
|
||||
<Compile Include="Encryptors\UserGUIDEncryptionMethod.vb" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="My Project\Resources.resx">
|
||||
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
||||
<CustomToolNamespace>My.Resources</CustomToolNamespace>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="My Project\Application.myapp">
|
||||
<Generator>MyApplicationCodeGenerator</Generator>
|
||||
<LastGenOutput>Application.Designer.vb</LastGenOutput>
|
||||
</None>
|
||||
<None Include="My Project\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<CustomToolNamespace>My</CustomToolNamespace>
|
||||
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Strata.Base.Internal.ruleset" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AdditionalFiles Include="..\..\.sonarlint\stratajazz\VB\SonarLint.xml">
|
||||
<Link>SonarLint.xml</Link>
|
||||
</AdditionalFiles>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Strata.Configuration.Client">
|
||||
<Version>8.44.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Strata.Jazz.Client">
|
||||
<Version>0.0.9</Version>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
38
vb-migration/Strata.Base.Internal/app.config
Normal file
38
vb-migration/Strata.Base.Internal/app.config
Normal file
@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<section name="Strata.Base.Internal.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<appSettings>
|
||||
<add key="Environment" value="Development"/>
|
||||
</appSettings>
|
||||
<system.diagnostics>
|
||||
<sources>
|
||||
<!-- This section defines the logging configuration for My.Application.Log -->
|
||||
<source name="DefaultSource" switchName="DefaultSwitch">
|
||||
<listeners>
|
||||
<add name="FileLog"/>
|
||||
<!-- Uncomment the below section to write to the Application Event Log -->
|
||||
<!--<add name="EventLog"/>-->
|
||||
</listeners>
|
||||
</source>
|
||||
</sources>
|
||||
<switches>
|
||||
<add name="DefaultSwitch" value="Information"/>
|
||||
</switches>
|
||||
<sharedListeners>
|
||||
<add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter"/>
|
||||
<!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
|
||||
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
|
||||
</sharedListeners>
|
||||
</system.diagnostics>
|
||||
<applicationSettings>
|
||||
<Strata.Base.Internal.My.MySettings>
|
||||
<setting name="Environment" serializeAs="String">
|
||||
<value>Development</value>
|
||||
</setting>
|
||||
</Strata.Base.Internal.My.MySettings>
|
||||
</applicationSettings>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>
|
||||
@ -0,0 +1,7 @@
|
||||
' <autogenerated/>
|
||||
Option Strict Off
|
||||
Option Explicit On
|
||||
|
||||
Imports System
|
||||
Imports System.Reflection
|
||||
<Assembly: Global.System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.1", FrameworkDisplayName:="")>
|
||||
@ -0,0 +1,7 @@
|
||||
' <autogenerated/>
|
||||
Option Strict Off
|
||||
Option Explicit On
|
||||
|
||||
Imports System
|
||||
Imports System.Reflection
|
||||
<Assembly: Global.System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName:=".NET Framework 4.8")>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,76 @@
|
||||
{
|
||||
"format": 1,
|
||||
"restore": {
|
||||
"D:\\Develop\\Repos\\st-monolith\\Code\\Strata.Base.Internal\\Strata.Base.Internal.vbproj": {}
|
||||
},
|
||||
"projects": {
|
||||
"D:\\Develop\\Repos\\st-monolith\\Code\\Strata.Base.Internal\\Strata.Base.Internal.vbproj": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "D:\\Develop\\Repos\\st-monolith\\Code\\Strata.Base.Internal\\Strata.Base.Internal.vbproj",
|
||||
"projectName": "Strata.Base.Internal",
|
||||
"projectPath": "D:\\Develop\\Repos\\st-monolith\\Code\\Strata.Base.Internal\\Strata.Base.Internal.vbproj",
|
||||
"packagesPath": "D:\\Users\\jorge.burgos\\.nuget\\packages\\",
|
||||
"outputPath": "D:\\Develop\\Repos\\st-monolith\\Code\\Strata.Base.Internal\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"skipContentFileWrite": true,
|
||||
"UsingMicrosoftNETSdk": false,
|
||||
"fallbackFolders": [
|
||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
||||
],
|
||||
"configFilePaths": [
|
||||
"D:\\Develop\\Repos\\st-monolith\\NuGet.Config",
|
||||
"D:\\Users\\jorge.burgos\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net48"
|
||||
],
|
||||
"sources": {
|
||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
||||
"https://api.nuget.org/v3/index.json": {},
|
||||
"https://proget.sdt.local/nuget/nuget/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net48": {
|
||||
"projectReferences": {}
|
||||
}
|
||||
},
|
||||
"restoreAuditProperties": {
|
||||
"enableAudit": "true",
|
||||
"auditLevel": "low",
|
||||
"auditMode": "direct"
|
||||
}
|
||||
},
|
||||
"frameworks": {
|
||||
"net48": {
|
||||
"dependencies": {
|
||||
"Strata.Configuration.Client": {
|
||||
"target": "Package",
|
||||
"version": "[8.44.0, )"
|
||||
},
|
||||
"Strata.Jazz.Client": {
|
||||
"target": "Package",
|
||||
"version": "[0.0.9, )"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"runtimes": {
|
||||
"win": {
|
||||
"#import": []
|
||||
},
|
||||
"win-arm64": {
|
||||
"#import": []
|
||||
},
|
||||
"win-x64": {
|
||||
"#import": []
|
||||
},
|
||||
"win-x86": {
|
||||
"#import": []
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">D:\Users\jorge.burgos\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
|
||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.12.2</NuGetToolVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<SourceRoot Include="D:\Users\jorge.burgos\.nuget\packages\" />
|
||||
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
||||
97
vb-migration/Strata.Base.Internal/obj/project.assets.json
Normal file
97
vb-migration/Strata.Base.Internal/obj/project.assets.json
Normal file
@ -0,0 +1,97 @@
|
||||
{
|
||||
"version": 3,
|
||||
"targets": {
|
||||
".NETFramework,Version=v4.8": {},
|
||||
".NETFramework,Version=v4.8/win": {},
|
||||
".NETFramework,Version=v4.8/win-arm64": {},
|
||||
".NETFramework,Version=v4.8/win-x64": {},
|
||||
".NETFramework,Version=v4.8/win-x86": {}
|
||||
},
|
||||
"libraries": {},
|
||||
"projectFileDependencyGroups": {
|
||||
".NETFramework,Version=v4.8": [
|
||||
"Strata.Configuration.Client >= 8.44.0",
|
||||
"Strata.Jazz.Client >= 0.0.9"
|
||||
]
|
||||
},
|
||||
"packageFolders": {
|
||||
"D:\\Users\\jorge.burgos\\.nuget\\packages\\": {},
|
||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
|
||||
},
|
||||
"project": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "D:\\Develop\\Repos\\st-monolith\\Code\\Strata.Base.Internal\\Strata.Base.Internal.vbproj",
|
||||
"projectName": "Strata.Base.Internal",
|
||||
"projectPath": "D:\\Develop\\Repos\\st-monolith\\Code\\Strata.Base.Internal\\Strata.Base.Internal.vbproj",
|
||||
"packagesPath": "D:\\Users\\jorge.burgos\\.nuget\\packages\\",
|
||||
"outputPath": "D:\\Develop\\Repos\\st-monolith\\Code\\Strata.Base.Internal\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"skipContentFileWrite": true,
|
||||
"UsingMicrosoftNETSdk": false,
|
||||
"fallbackFolders": [
|
||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
||||
],
|
||||
"configFilePaths": [
|
||||
"D:\\Develop\\Repos\\st-monolith\\NuGet.Config",
|
||||
"D:\\Users\\jorge.burgos\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net48"
|
||||
],
|
||||
"sources": {
|
||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
||||
"https://api.nuget.org/v3/index.json": {},
|
||||
"https://proget.sdt.local/nuget/nuget/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net48": {
|
||||
"projectReferences": {}
|
||||
}
|
||||
},
|
||||
"restoreAuditProperties": {
|
||||
"enableAudit": "true",
|
||||
"auditLevel": "low",
|
||||
"auditMode": "direct"
|
||||
}
|
||||
},
|
||||
"frameworks": {
|
||||
"net48": {
|
||||
"dependencies": {
|
||||
"Strata.Configuration.Client": {
|
||||
"target": "Package",
|
||||
"version": "[8.44.0, )"
|
||||
},
|
||||
"Strata.Jazz.Client": {
|
||||
"target": "Package",
|
||||
"version": "[0.0.9, )"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"runtimes": {
|
||||
"win": {
|
||||
"#import": []
|
||||
},
|
||||
"win-arm64": {
|
||||
"#import": []
|
||||
},
|
||||
"win-x64": {
|
||||
"#import": []
|
||||
},
|
||||
"win-x86": {
|
||||
"#import": []
|
||||
}
|
||||
}
|
||||
},
|
||||
"logs": [
|
||||
{
|
||||
"code": "NU1301",
|
||||
"level": "Error",
|
||||
"message": "Unable to load the service index for source https://proget.sdt.local/nuget/nuget/v3/index.json.\r\n An error occurred while sending the request.\r\n The remote name could not be resolved: 'proget.sdt.local'",
|
||||
"libraryId": "Strata.Configuration.Client"
|
||||
}
|
||||
]
|
||||
}
|
||||
15
vb-migration/Strata.Base.Internal/obj/project.nuget.cache
Normal file
15
vb-migration/Strata.Base.Internal/obj/project.nuget.cache
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"version": 2,
|
||||
"dgSpecHash": "79VZAfPMGao=",
|
||||
"success": false,
|
||||
"projectFilePath": "D:\\Develop\\Repos\\st-monolith\\Code\\Strata.Base.Internal\\Strata.Base.Internal.vbproj",
|
||||
"expectedPackageFiles": [],
|
||||
"logs": [
|
||||
{
|
||||
"code": "NU1301",
|
||||
"level": "Error",
|
||||
"message": "Unable to load the service index for source https://proget.sdt.local/nuget/nuget/v3/index.json.\r\n An error occurred while sending the request.\r\n The remote name could not be resolved: 'proget.sdt.local'",
|
||||
"libraryId": "Strata.Configuration.Client"
|
||||
}
|
||||
]
|
||||
}
|
||||
378
vb-migration/migration-steps.md
Normal file
378
vb-migration/migration-steps.md
Normal file
@ -0,0 +1,378 @@
|
||||
# VB.NET to C# Migration Guide
|
||||
|
||||
## Migration Sequence - Important!
|
||||
|
||||
### Recommended Order of Migration
|
||||
The migration should be performed in two distinct phases to minimize complications and ensure a smooth transition:
|
||||
|
||||
1. **First Phase: .NET Framework to .NET 8 Migration (Stay in VB.NET)**
|
||||
- Focus only on framework compatibility
|
||||
- Keep the original VB.NET language
|
||||
- Use .NET Upgrade Assistant
|
||||
- Test thoroughly before proceeding
|
||||
|
||||
2. **Second Phase: VB.NET to C# Conversion**
|
||||
- Convert the working .NET 8 VB.NET code to C#
|
||||
- Use code conversion tools
|
||||
- Apply C# best practices
|
||||
- Final testing and optimization
|
||||
|
||||
### Rationale for This Sequence
|
||||
- Separates framework issues from language syntax issues
|
||||
- Easier debugging and problem isolation
|
||||
- Framework migration tools work better with VB.NET
|
||||
- Allows parallel testing between versions
|
||||
- Reduces complexity of each migration step
|
||||
|
||||
### Example Migration Path
|
||||
```
|
||||
Starting Point: VB.NET on .NET Framework 4.7.1
|
||||
↓
|
||||
Step 1: VB.NET on .NET 8 (framework migration)
|
||||
↓
|
||||
Step 2: C# on .NET 8 (language conversion)
|
||||
```
|
||||
|
||||
## AI-Assisted Migration Support
|
||||
### Available AI Tools
|
||||
1. **GitHub Copilot**
|
||||
- IDE integration
|
||||
- Real-time code suggestions
|
||||
- Pattern recognition
|
||||
- Modern C# syntax suggestions
|
||||
|
||||
2. **Claude or ChatGPT**
|
||||
- Code analysis and review
|
||||
- Pattern modernization suggestions
|
||||
- Documentation generation
|
||||
- Error resolution
|
||||
- Test case generation
|
||||
- Code optimization suggestions
|
||||
|
||||
3. **Amazon CodeWhisperer**
|
||||
- Code completion
|
||||
- Pattern suggestions
|
||||
- Security checks
|
||||
- Best practice recommendations
|
||||
|
||||
## Primary Migration Tools
|
||||
|
||||
### 1. .NET Upgrade Assistant (Free)
|
||||
#### Features
|
||||
- Official Microsoft tool
|
||||
- Command-line interface
|
||||
- Framework upgrade automation
|
||||
- Package dependency updates
|
||||
- Configuration file updates
|
||||
|
||||
#### Installation
|
||||
```bash
|
||||
dotnet tool install -g upgrade-assistant
|
||||
```
|
||||
|
||||
#### Usage for Framework Migration
|
||||
```bash
|
||||
# Analyze your solution
|
||||
upgrade-assistant analyze your-solution.sln
|
||||
|
||||
# Perform the upgrade
|
||||
upgrade-assistant upgrade your-solution.sln
|
||||
```
|
||||
|
||||
### 2. ICSharpCode.CodeConverter (Free, Open Source)
|
||||
#### Features
|
||||
- Built on Roslyn
|
||||
- Command-line and Visual Studio integration
|
||||
- Community-supported
|
||||
- Regular updates
|
||||
- Batch processing capability
|
||||
|
||||
#### Installation
|
||||
```bash
|
||||
dotnet tool install --global ICSharpCode.CodeConverter.Cli
|
||||
```
|
||||
|
||||
### 3. Telerik Code Converter (Free Online Tool)
|
||||
#### Features
|
||||
- Web-based interface
|
||||
- No installation required
|
||||
- Immediate results
|
||||
- Good for quick conversions
|
||||
- Supports multiple code snippets
|
||||
|
||||
### 4. Visual Studio Built-in Tools (Free with Community Edition)
|
||||
#### Features
|
||||
- Code analysis tools
|
||||
- Refactoring capabilities
|
||||
- Project system tools
|
||||
- Framework compatibility checking
|
||||
- IntelliSense support
|
||||
|
||||
## Detailed Migration Steps with AI Enhancement
|
||||
|
||||
### 1. Preparation Phase
|
||||
1. Analyze current codebase
|
||||
- Document dependencies
|
||||
- Identify framework-specific code
|
||||
- List external packages
|
||||
- Note VB.NET specific features
|
||||
|
||||
**AI Enhancement**:
|
||||
- Use Claude/ChatGPT to analyze code patterns and identify potential migration challenges
|
||||
- Ask AI to create a detailed dependency map
|
||||
- Use AI to identify outdated patterns that should be modernized
|
||||
```
|
||||
Example prompt: "Analyze this VB.NET code and identify:
|
||||
1. Framework-specific dependencies
|
||||
2. Outdated patterns that should be modernized
|
||||
3. Potential migration challenges"
|
||||
```
|
||||
|
||||
2. Setup Environment
|
||||
- Install Visual Studio Community Edition
|
||||
- Install .NET Upgrade Assistant
|
||||
- Install ICSharpCode.CodeConverter
|
||||
- Set up version control
|
||||
- Create backup of all code
|
||||
|
||||
3. Plan Migration Strategy
|
||||
- Identify smallest/simplest libraries to start
|
||||
- Create test cases for validation
|
||||
- Document current functionality
|
||||
- Set up continuous integration
|
||||
|
||||
**AI Enhancement**:
|
||||
- Use AI to generate test cases
|
||||
- Ask AI to review and enhance migration plan
|
||||
- Generate documentation templates
|
||||
```
|
||||
Example prompt: "Based on this code, generate:
|
||||
1. Unit test scenarios
|
||||
2. Integration test cases
|
||||
3. Documentation structure"
|
||||
```
|
||||
|
||||
### 2. Framework Migration Phase (Step 1)
|
||||
1. Framework Update
|
||||
- Run .NET Upgrade Assistant analysis
|
||||
- Review suggested changes
|
||||
- Update package references
|
||||
- Fix compatibility issues
|
||||
|
||||
**AI Enhancement**:
|
||||
- Use AI to review upgrade-assistant suggestions
|
||||
- Get alternative solutions for compatibility issues
|
||||
- Modernize configuration files
|
||||
```
|
||||
Example prompt: "Review these .NET Framework 4.7.1 configuration settings
|
||||
and suggest equivalent .NET 8 configurations"
|
||||
```
|
||||
|
||||
2. Testing Framework Migration
|
||||
- Run all tests in VB.NET
|
||||
- Verify functionality
|
||||
- Check performance
|
||||
- Document any issues
|
||||
|
||||
**AI Enhancement**:
|
||||
- Generate additional test cases
|
||||
- Review test coverage
|
||||
- Suggest performance improvements
|
||||
```
|
||||
Example prompt: "Analyze this test suite and suggest:
|
||||
1. Additional test scenarios
|
||||
2. Performance test cases
|
||||
3. Edge cases to consider"
|
||||
```
|
||||
|
||||
3. Framework Stabilization
|
||||
- Fix identified issues
|
||||
- Update dependencies
|
||||
- Verify third-party compatibility
|
||||
- Final framework testing
|
||||
|
||||
### 3. Language Migration Phase (Step 2)
|
||||
1. Code Conversion
|
||||
- Use ICSharpCode.CodeConverter for bulk conversion
|
||||
- Use Telerik Code Converter for problematic sections
|
||||
- Manual review and cleanup
|
||||
- Apply C# best practices
|
||||
|
||||
**AI Enhancement**:
|
||||
- Review converted code for optimization
|
||||
- Suggest modern C# patterns
|
||||
- Identify potential improvements
|
||||
```
|
||||
Example prompt: "Review this converted C# code and suggest:
|
||||
1. Modern C# patterns to apply
|
||||
2. Performance optimizations
|
||||
3. Code structure improvements"
|
||||
```
|
||||
|
||||
2. Iterative Improvements
|
||||
- Convert one library at a time
|
||||
- Update dependencies
|
||||
- Modernize code patterns
|
||||
- Implement C# specific features
|
||||
|
||||
**AI Enhancement**:
|
||||
- Get suggestions for code modernization
|
||||
- Review for best practices
|
||||
- Generate documentation
|
||||
```
|
||||
Example prompt: "Suggest improvements for this C# code using:
|
||||
1. Latest C# features
|
||||
2. Modern design patterns
|
||||
3. Performance best practices"
|
||||
```
|
||||
|
||||
### 4. Testing Phase
|
||||
1. Automated Testing
|
||||
- Run existing unit tests
|
||||
- Create new C# specific tests
|
||||
- Verify functionality
|
||||
- Performance testing
|
||||
|
||||
2. Manual Testing
|
||||
- Code review
|
||||
- Functionality verification
|
||||
- Edge case testing
|
||||
- Integration testing
|
||||
|
||||
**AI Enhancement**:
|
||||
- Generate unit tests
|
||||
- Suggest integration test scenarios
|
||||
- Review test coverage
|
||||
- Identify edge cases
|
||||
```
|
||||
Example prompt: "For this C# class, generate:
|
||||
1. Unit tests covering main scenarios
|
||||
2. Edge cases to test
|
||||
3. Integration test examples"
|
||||
```
|
||||
|
||||
### 5. Documentation Phase
|
||||
1. Technical Documentation
|
||||
- API documentation
|
||||
- Migration notes
|
||||
- Usage examples
|
||||
- Troubleshooting guides
|
||||
|
||||
**AI Enhancement**:
|
||||
- Generate API documentation
|
||||
- Create usage examples
|
||||
- Write migration notes
|
||||
- Create troubleshooting guides
|
||||
```
|
||||
Example prompt: "Generate comprehensive documentation for this C# class including:
|
||||
1. Method descriptions
|
||||
2. Usage examples
|
||||
3. Common troubleshooting scenarios"
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Code Quality
|
||||
- Review all automated conversions
|
||||
- Follow C# coding standards
|
||||
- Use modern language features
|
||||
- Remove deprecated code
|
||||
- Optimize for .NET 8
|
||||
- Document major changes
|
||||
|
||||
### Testing Strategy
|
||||
- Maintain test coverage
|
||||
- Add new tests for C# features
|
||||
- Validate performance
|
||||
- Check compatibility
|
||||
- Document changes
|
||||
|
||||
### Risk Mitigation
|
||||
- Regular backups
|
||||
- Incremental changes
|
||||
- Keep original code
|
||||
- Document conversion issues
|
||||
- Maintain rollback capability
|
||||
|
||||
## AI-Assisted Best Practices
|
||||
|
||||
### Code Review Enhancement
|
||||
Use AI tools to:
|
||||
- Review converted code quality
|
||||
- Suggest improvements
|
||||
- Identify potential issues
|
||||
- Check for modern patterns
|
||||
```
|
||||
Example prompt: "Review this converted C# code for:
|
||||
1. Potential bugs
|
||||
2. Performance issues
|
||||
3. Modern C# feature opportunities"
|
||||
```
|
||||
|
||||
### Testing Strategy Enhancement
|
||||
Use AI tools to:
|
||||
- Generate test cases
|
||||
- Identify edge cases
|
||||
- Create test data
|
||||
- Suggest test scenarios
|
||||
```
|
||||
Example prompt: "For this business logic, suggest:
|
||||
1. Key test scenarios
|
||||
2. Edge cases
|
||||
3. Test data examples"
|
||||
```
|
||||
|
||||
### Documentation Enhancement
|
||||
Use AI tools to:
|
||||
- Generate technical documentation
|
||||
- Create code examples
|
||||
- Write API documentation
|
||||
- Document migration decisions
|
||||
```
|
||||
Example prompt: "Create documentation for this migrated code including:
|
||||
1. API reference
|
||||
2. Migration decisions
|
||||
3. Usage examples"
|
||||
```
|
||||
|
||||
## Tips for Specific Scenarios
|
||||
|
||||
### Large Codebases
|
||||
- Split into manageable chunks
|
||||
- Convert one namespace at a time
|
||||
- Use batch processing tools
|
||||
- Automate repetitive tasks
|
||||
- Track progress systematically
|
||||
|
||||
### Complex Logic
|
||||
- Use multiple conversion tools
|
||||
- Compare tool outputs
|
||||
- Manual review critical sections
|
||||
- Maintain business logic
|
||||
- Document complex conversions
|
||||
|
||||
### Legacy Features
|
||||
- Research modern alternatives
|
||||
- Plan feature updates
|
||||
- Document replacements
|
||||
- Test thoroughly
|
||||
- Phase out gradually
|
||||
|
||||
## Conclusion
|
||||
|
||||
A successful migration can be achieved by:
|
||||
- Following the correct migration sequence (Framework first, then Language)
|
||||
- Leveraging AI tools effectively
|
||||
- Using multiple conversion tools
|
||||
- Conducting thorough testing
|
||||
- Maintaining good documentation
|
||||
|
||||
### AI Tool Best Practices
|
||||
1. Always review AI-generated code
|
||||
2. Test all suggestions thoroughly
|
||||
3. Use AI tools iteratively for improvements
|
||||
4. Combine multiple AI tools for better results
|
||||
5. Keep security in mind when sharing code with AI tools
|
||||
6. Document which parts were AI-assisted for future reference
|
||||
|
||||
Start with a small pilot project to validate the process and AI tool effectiveness before proceeding with the full migration.
|
||||
Loading…
Reference in New Issue
Block a user