diff --git a/App.config b/App.config new file mode 100644 index 0000000..59df92c --- /dev/null +++ b/App.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Assets/Image/steam-token.ico b/Assets/Image/steam-token.ico new file mode 100644 index 0000000..a5bd0d5 Binary files /dev/null and b/Assets/Image/steam-token.ico differ diff --git a/Assets/Image/steam-token.png b/Assets/Image/steam-token.png new file mode 100644 index 0000000..453d678 Binary files /dev/null and b/Assets/Image/steam-token.png differ diff --git a/Entity/Config.cs b/Entity/Config.cs new file mode 100644 index 0000000..ef10cdc --- /dev/null +++ b/Entity/Config.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace steam_token.Entity +{ + public class Config + { + public SteamGuard SteamGuard { get; set; } + + } +} diff --git a/Entity/SteamGuard.cs b/Entity/SteamGuard.cs new file mode 100644 index 0000000..10eb480 --- /dev/null +++ b/Entity/SteamGuard.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace steam_token.Entity +{ + public class SteamGuard + { + public string shared_secret { get; set; } + public string serial_number { get; set; } + public string revocation_code { get; set; } + public string uri { get; set; } + public string server_time { get; set; } + public string account_name { get; set; } + public string token_gid { get; set; } + public string identity_secret { get; set; } + public string secret_1 { get; set; } + public string status { get; set; } + public string steamguard_scheme { get; set; } + public string steamid { get; set; } + } +} diff --git a/FodyWeavers.xml b/FodyWeavers.xml new file mode 100644 index 0000000..a5dcf04 --- /dev/null +++ b/FodyWeavers.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs new file mode 100644 index 0000000..655446b --- /dev/null +++ b/MainForm.Designer.cs @@ -0,0 +1,215 @@ + +namespace steam_token +{ + partial class mainForm + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(mainForm)); + this.menuStrip = new System.Windows.Forms.MenuStrip(); + this.SettingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GuardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ProgramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.AboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.progressBar_refresh = new System.Windows.Forms.ProgressBar(); + this.groupBox_display = new System.Windows.Forms.GroupBox(); + this.label_guard = new System.Windows.Forms.Label(); + this.button_recalc = new System.Windows.Forms.Button(); + this.button_copy = new System.Windows.Forms.Button(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.timer_time = new System.Windows.Forms.Timer(this.components); + this.label_datetime = new System.Windows.Forms.Label(); + this.menuStrip.SuspendLayout(); + this.groupBox_display.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip + // + this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SettingToolStripMenuItem, + this.AboutToolStripMenuItem}); + this.menuStrip.Location = new System.Drawing.Point(0, 0); + this.menuStrip.Name = "menuStrip"; + this.menuStrip.Size = new System.Drawing.Size(644, 25); + this.menuStrip.TabIndex = 0; + this.menuStrip.Text = "menuStrip1"; + // + // SettingToolStripMenuItem + // + this.SettingToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.GuardToolStripMenuItem, + this.ProgramToolStripMenuItem}); + this.SettingToolStripMenuItem.Name = "SettingToolStripMenuItem"; + this.SettingToolStripMenuItem.Size = new System.Drawing.Size(44, 21); + this.SettingToolStripMenuItem.Text = "设置"; + // + // GuardToolStripMenuItem + // + this.GuardToolStripMenuItem.Name = "GuardToolStripMenuItem"; + this.GuardToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.GuardToolStripMenuItem.Text = "令牌配置"; + this.GuardToolStripMenuItem.Click += new System.EventHandler(this.GuardToolStripMenuItem_Click); + // + // ProgramToolStripMenuItem + // + this.ProgramToolStripMenuItem.Name = "ProgramToolStripMenuItem"; + this.ProgramToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.ProgramToolStripMenuItem.Text = "程序设置"; + this.ProgramToolStripMenuItem.Visible = false; + this.ProgramToolStripMenuItem.Click += new System.EventHandler(this.ProgramToolStripMenuItem_Click); + // + // AboutToolStripMenuItem + // + this.AboutToolStripMenuItem.Name = "AboutToolStripMenuItem"; + this.AboutToolStripMenuItem.Size = new System.Drawing.Size(44, 21); + this.AboutToolStripMenuItem.Text = "关于"; + this.AboutToolStripMenuItem.Click += new System.EventHandler(this.AboutToolStripMenuItem_Click); + // + // progressBar_refresh + // + this.progressBar_refresh.BackColor = System.Drawing.SystemColors.Control; + this.progressBar_refresh.ForeColor = System.Drawing.SystemColors.Control; + this.progressBar_refresh.Location = new System.Drawing.Point(12, 28); + this.progressBar_refresh.Maximum = 30; + this.progressBar_refresh.Name = "progressBar_refresh"; + this.progressBar_refresh.Size = new System.Drawing.Size(620, 23); + this.progressBar_refresh.TabIndex = 2; + this.progressBar_refresh.Value = 30; + // + // groupBox_display + // + this.groupBox_display.Controls.Add(this.label_guard); + this.groupBox_display.Location = new System.Drawing.Point(13, 57); + this.groupBox_display.Name = "groupBox_display"; + this.groupBox_display.Size = new System.Drawing.Size(620, 313); + this.groupBox_display.TabIndex = 3; + this.groupBox_display.TabStop = false; + this.groupBox_display.Text = "Steam Guard"; + // + // label_guard + // + this.label_guard.Font = new System.Drawing.Font("微软雅黑", 72F); + this.label_guard.ForeColor = System.Drawing.Color.DodgerBlue; + this.label_guard.Location = new System.Drawing.Point(6, 25); + this.label_guard.Name = "label_guard"; + this.label_guard.Size = new System.Drawing.Size(608, 299); + this.label_guard.TabIndex = 1; + this.label_guard.Text = "令二哈"; + this.label_guard.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // button_recalc + // + this.button_recalc.Location = new System.Drawing.Point(428, 384); + this.button_recalc.Name = "button_recalc"; + this.button_recalc.Size = new System.Drawing.Size(99, 30); + this.button_recalc.TabIndex = 4; + this.button_recalc.Text = "重新计算"; + this.button_recalc.UseVisualStyleBackColor = true; + this.button_recalc.Click += new System.EventHandler(this.button_recalc_Click); + // + // button_copy + // + this.button_copy.Location = new System.Drawing.Point(534, 384); + this.button_copy.Name = "button_copy"; + this.button_copy.Size = new System.Drawing.Size(99, 30); + this.button_copy.TabIndex = 4; + this.button_copy.Text = "复制"; + this.button_copy.UseVisualStyleBackColor = true; + this.button_copy.Click += new System.EventHandler(this.button_copy_Click); + // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(199, 385); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(223, 29); + this.comboBox1.TabIndex = 5; + this.comboBox1.Visible = false; + // + // timer_time + // + this.timer_time.Tick += new System.EventHandler(this.timer_time_Tick); + // + // label_datetime + // + this.label_datetime.AutoSize = true; + this.label_datetime.Location = new System.Drawing.Point(12, 389); + this.label_datetime.Name = "label_datetime"; + this.label_datetime.Size = new System.Drawing.Size(105, 21); + this.label_datetime.TabIndex = 6; + this.label_datetime.Text = " "; + // + // mainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(644, 425); + this.Controls.Add(this.label_datetime); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.button_copy); + this.Controls.Add(this.button_recalc); + this.Controls.Add(this.groupBox_display); + this.Controls.Add(this.progressBar_refresh); + this.Controls.Add(this.menuStrip); + this.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip; + this.Margin = new System.Windows.Forms.Padding(5); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "mainForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Steam令牌计算器"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.mainForm_FormClosed); + this.menuStrip.ResumeLayout(false); + this.menuStrip.PerformLayout(); + this.groupBox_display.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip; + private System.Windows.Forms.ToolStripMenuItem SettingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem AboutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem GuardToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ProgramToolStripMenuItem; + private System.Windows.Forms.ProgressBar progressBar_refresh; + private System.Windows.Forms.GroupBox groupBox_display; + private System.Windows.Forms.Button button_recalc; + private System.Windows.Forms.Button button_copy; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Label label_guard; + private System.Windows.Forms.Timer timer_time; + private System.Windows.Forms.Label label_datetime; + } +} + diff --git a/MainForm.cs b/MainForm.cs new file mode 100644 index 0000000..79eadf6 --- /dev/null +++ b/MainForm.cs @@ -0,0 +1,93 @@ +using steam_token.Entity; +using steam_token.UI; +using steam_token.UI.Set; +using steam_token.Util; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using Util; + +namespace steam_token +{ + public partial class mainForm : Form + { + public mainForm() + { + InitializeComponent(); + + this.timer_time.Start(); + + // 先计算一次 + this.label_guard.Text = CalcOnce(); + + // 新开一个线程去初始化数据 + SteamGuardCalcThread.StartThread(this.label_guard, this.progressBar_refresh); + } + + /// + /// 打开令牌配置页面 + /// + /// + /// + private void GuardToolStripMenuItem_Click(object sender, EventArgs e) + { + GuardConfig guard = new GuardConfig(); + guard.ShowDialog(this); + } + + /// + /// 打开程序设置页面 + /// + /// + /// + + private void ProgramToolStripMenuItem_Click(object sender, EventArgs e) + { + ProgramConfig program = new ProgramConfig(); + program.ShowDialog(this); + } + + private void button_recalc_Click(object sender, EventArgs e) + { + this.label_guard.Text = CalcOnce(); + + SteamGuardCalcThread.StartThread(this.label_guard, this.progressBar_refresh); + } + + private string CalcOnce() + { + Config config = ConfigUtil.Read(); + string guard = SteamTwoFactorToken.GenerateSteamGuardCode(config.SteamGuard.shared_secret); + Console.WriteLine("guard = " + guard); + return guard; + } + + private void button_copy_Click(object sender, EventArgs e) + { + Clipboard.SetDataObject(this.label_guard.Text); + } + + private void timer_time_Tick(object sender, EventArgs e) + { + this.label_datetime.Text = DateTime.Now.ToString(); + } + + private void mainForm_FormClosed(object sender, FormClosedEventArgs e) + { + Environment.Exit(0); + } + + private void AboutToolStripMenuItem_Click(object sender, EventArgs e) + { + AboutForm about = new AboutForm(); + about.ShowDialog(this); + } + } +} diff --git a/MainForm.resx b/MainForm.resx new file mode 100644 index 0000000..a2dba95 --- /dev/null +++ b/MainForm.resx @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 130, 17 + + + True + + + + + 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 + + + \ No newline at end of file diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..e01e7ae --- /dev/null +++ b/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; +using Util; + +namespace steam_token +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Control.CheckForIllegalCrossThreadCalls = false; + ConfigUtil.Init(new steam_token.Entity.Config()); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new mainForm()); + } + } +} diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4ff727f --- /dev/null +++ b/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("steam-token")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("steam-token")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("26555785-e311-4f28-a28d-dd96b3165b98")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs new file mode 100644 index 0000000..0f94583 --- /dev/null +++ b/Properties/Resources.Designer.cs @@ -0,0 +1,91 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace steam_token.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [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() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("steam_token.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找类似 SteamGuard 的本地化字符串。 + /// + internal static string CONFIG_FOLDER { + get { + return ResourceManager.GetString("CONFIG_FOLDER", resourceCulture); + } + } + + /// + /// 查找类似 config.json 的本地化字符串。 + /// + internal static string CONFIG_NAME { + get { + return ResourceManager.GetString("CONFIG_NAME", resourceCulture); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap steam_token { + get { + object obj = ResourceManager.GetObject("steam_token", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Properties/Resources.resx b/Properties/Resources.resx new file mode 100644 index 0000000..0c2ea96 --- /dev/null +++ b/Properties/Resources.resx @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + SteamGuard + + + config.json + 配置文件 + + + + ..\Assets\Image\steam-token.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs new file mode 100644 index 0000000..96f4a25 --- /dev/null +++ b/Properties/Settings.Designer.cs @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------ +// +// 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 steam_token.Properties +{ + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.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/Properties/Settings.settings b/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/UI/AboutForm.Designer.cs b/UI/AboutForm.Designer.cs new file mode 100644 index 0000000..c945380 --- /dev/null +++ b/UI/AboutForm.Designer.cs @@ -0,0 +1,136 @@ + +namespace steam_token.UI +{ + partial class AboutForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutForm)); + this.label1 = new System.Windows.Forms.Label(); + this.linkLabel_openurl = new System.Windows.Forms.LinkLabel(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.button_about_confirm = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(105, 30); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(286, 21); + this.label1.TabIndex = 0; + this.label1.Text = "Steam令牌计算器 v1.0 @niushuai233"; + // + // linkLabel_openurl + // + this.linkLabel_openurl.AutoSize = true; + this.linkLabel_openurl.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; + this.linkLabel_openurl.Location = new System.Drawing.Point(105, 115); + this.linkLabel_openurl.Name = "linkLabel_openurl"; + this.linkLabel_openurl.Size = new System.Drawing.Size(390, 21); + this.linkLabel_openurl.TabIndex = 1; + this.linkLabel_openurl.TabStop = true; + this.linkLabel_openurl.Text = "https://github.com/niushuai233/steam-token-win"; + this.linkLabel_openurl.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel_openurl_LinkClicked); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(21, 115); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(78, 21); + this.label2.TabIndex = 2; + this.label2.Text = "开源地址:"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(105, 70); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(72, 21); + this.label3.TabIndex = 3; + this.label3.Text = "欢迎Star"; + // + // pictureBox1 + // + this.pictureBox1.InitialImage = global::steam_token.Properties.Resources.steam_token; + this.pictureBox1.Location = new System.Drawing.Point(24, 20); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(75, 75); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox1.TabIndex = 4; + this.pictureBox1.TabStop = false; + // + // button_about_confirm + // + this.button_about_confirm.Location = new System.Drawing.Point(394, 156); + this.button_about_confirm.Name = "button_about_confirm"; + this.button_about_confirm.Size = new System.Drawing.Size(90, 32); + this.button_about_confirm.TabIndex = 5; + this.button_about_confirm.Text = "关闭"; + this.button_about_confirm.UseVisualStyleBackColor = true; + this.button_about_confirm.Click += new System.EventHandler(this.button_about_confirm_Click); + // + // AboutForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(496, 200); + this.Controls.Add(this.button_about_confirm); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.linkLabel_openurl); + this.Controls.Add(this.label1); + this.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(5); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "关于"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.LinkLabel linkLabel_openurl; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Button button_about_confirm; + } +} \ No newline at end of file diff --git a/UI/AboutForm.cs b/UI/AboutForm.cs new file mode 100644 index 0000000..a302b05 --- /dev/null +++ b/UI/AboutForm.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace steam_token.UI +{ + public partial class AboutForm : Form + { + public AboutForm() + { + InitializeComponent(); + // 初始化图片 + this.pictureBox1.Image = Properties.Resources.steam_token; + } + + private void button_about_confirm_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void linkLabel_openurl_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start(this.linkLabel_openurl.Text); + } + } +} diff --git a/UI/AboutForm.resx b/UI/AboutForm.resx new file mode 100644 index 0000000..ed11fcd --- /dev/null +++ b/UI/AboutForm.resx @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + + + 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 + + + \ No newline at end of file diff --git a/UI/Set/GuardConfig.Designer.cs b/UI/Set/GuardConfig.Designer.cs new file mode 100644 index 0000000..ae94ac0 --- /dev/null +++ b/UI/Set/GuardConfig.Designer.cs @@ -0,0 +1,135 @@ + +namespace steam_token.UI.Set +{ + partial class GuardConfig + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button_confirm = new System.Windows.Forms.Button(); + this.openFileDialog_steam = new System.Windows.Forms.OpenFileDialog(); + this.textBox_shared_secret = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.button_openfile = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // button_confirm + // + this.button_confirm.Location = new System.Drawing.Point(451, 97); + this.button_confirm.Name = "button_confirm"; + this.button_confirm.Size = new System.Drawing.Size(85, 30); + this.button_confirm.TabIndex = 1; + this.button_confirm.Text = "确定"; + this.button_confirm.UseVisualStyleBackColor = true; + this.button_confirm.Click += new System.EventHandler(this.button_confirm_Click); + // + // openFileDialog_steam + // + this.openFileDialog_steam.FileName = "openFileDialog1"; + this.openFileDialog_steam.Title = "请选择Steam令牌文件"; + // + // textBox_shared_secret + // + this.textBox_shared_secret.Location = new System.Drawing.Point(16, 59); + this.textBox_shared_secret.Name = "textBox_shared_secret"; + this.textBox_shared_secret.Size = new System.Drawing.Size(428, 29); + this.textBox_shared_secret.TabIndex = 2; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(363, 21); + this.label1.TabIndex = 3; + this.label1.Text = "请输入位于Steam令牌文件中的[shared_secret]值"; + // + // button_openfile + // + this.button_openfile.Location = new System.Drawing.Point(451, 59); + this.button_openfile.Name = "button_openfile"; + this.button_openfile.Size = new System.Drawing.Size(85, 30); + this.button_openfile.TabIndex = 1; + this.button_openfile.Text = "选择文件"; + this.button_openfile.UseVisualStyleBackColor = true; + this.button_openfile.Click += new System.EventHandler(this.button_openfile_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("微软雅黑", 9F); + this.label2.ForeColor = System.Drawing.Color.Red; + this.label2.Location = new System.Drawing.Point(13, 36); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(462, 17); + this.label2.TabIndex = 4; + this.label2.Text = "/data/data/com.valvesoftware.android.steam.community/files/Steamguard-xxx"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("微软雅黑", 10F); + this.label3.Location = new System.Drawing.Point(16, 101); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(309, 20); + this.label3.TabIndex = 5; + this.label3.Text = "Tips: 手机需root或者能通过备份手段拿到该文件"; + // + // GuardConfig + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(539, 132); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.textBox_shared_secret); + this.Controls.Add(this.button_openfile); + this.Controls.Add(this.button_confirm); + this.Font = new System.Drawing.Font("微软雅黑", 12F); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "GuardConfig"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "令牌配置"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Button button_confirm; + private System.Windows.Forms.OpenFileDialog openFileDialog_steam; + private System.Windows.Forms.TextBox textBox_shared_secret; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button button_openfile; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + } +} \ No newline at end of file diff --git a/UI/Set/GuardConfig.cs b/UI/Set/GuardConfig.cs new file mode 100644 index 0000000..b4f79af --- /dev/null +++ b/UI/Set/GuardConfig.cs @@ -0,0 +1,95 @@ +using Newtonsoft.Json; +using steam_token.Entity; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Util; + +namespace steam_token.UI.Set +{ + public partial class GuardConfig : Form + { + private SteamGuard steamGuard; + public GuardConfig() + { + InitializeComponent(); + // 先初始化组件 再使用 + Config config = ConfigUtil.Read(); + steamGuard = config.SteamGuard; + if (null != steamGuard && !string.IsNullOrEmpty(steamGuard.shared_secret)) + { + this.textBox_shared_secret.Text = steamGuard.shared_secret; + } + } + + private void button_openfile_Click(object sender, EventArgs e) + { + this.openFileDialog_steam.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); + if (this.openFileDialog_steam.ShowDialog() == DialogResult.OK) + { + ReadFile(this.openFileDialog_steam.FileName); + } + } + + private void ReadFile(string fileName) + { + FileInfo file = new FileInfo(fileName); + if (!file.Exists) + { + MessageBox.Show("文件" + fileName + "不存在"); + } + + if (file.Length > 1024 * 2) + { + MessageBox.Show("文件大小错误, 鉴定为不合适的文件"); + } + + byte[] bytes = File.ReadAllBytes(fileName); + string fileStr = Encoding.UTF8.GetString(bytes); + + ParseSteamGuard(fileStr); + + + } + + private void ParseSteamGuard(string fileStr) + { + try + { + steamGuard = JsonConvert.DeserializeObject(fileStr); + Console.WriteLine(steamGuard); + + this.textBox_shared_secret.Text = steamGuard.shared_secret; + } + catch (JsonReaderException) + { + MessageBox.Show("文件内容不符合要求, 请不要修改拷贝出来的文件"); + } + catch (Exception) + { + MessageBox.Show("未知异常, 请通知作者, 感谢!"); + } + } + + private void button_confirm_Click(object sender, EventArgs e) + { + if (null == steamGuard) + { + MessageBox.Show("熬, 未知操作!!!"); + return; + } + + Config config = ConfigUtil.Read(); + config.SteamGuard = steamGuard; + ConfigUtil.Save(config); + this.Dispose(); + } + } +} diff --git a/UI/Set/GuardConfig.resx b/UI/Set/GuardConfig.resx new file mode 100644 index 0000000..227aca0 --- /dev/null +++ b/UI/Set/GuardConfig.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + True + + \ No newline at end of file diff --git a/UI/Set/ProgramConfig.Designer.cs b/UI/Set/ProgramConfig.Designer.cs new file mode 100644 index 0000000..9d97c17 --- /dev/null +++ b/UI/Set/ProgramConfig.Designer.cs @@ -0,0 +1,52 @@ + +namespace steam_token.UI.Set +{ + partial class ProgramConfig + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // ProgramConfig + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(539, 294); + this.Font = new System.Drawing.Font("微软雅黑", 12F); + this.Margin = new System.Windows.Forms.Padding(5); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ProgramConfig"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "设置"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/UI/Set/ProgramConfig.cs b/UI/Set/ProgramConfig.cs new file mode 100644 index 0000000..84b46b3 --- /dev/null +++ b/UI/Set/ProgramConfig.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace steam_token.UI.Set +{ + public partial class ProgramConfig : Form + { + public ProgramConfig() + { + InitializeComponent(); + } + } +} diff --git a/UI/Set/ProgramConfig.resx b/UI/Set/ProgramConfig.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/UI/Set/ProgramConfig.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Util/ConfigUtil.cs b/Util/ConfigUtil.cs new file mode 100644 index 0000000..08938c9 --- /dev/null +++ b/Util/ConfigUtil.cs @@ -0,0 +1,63 @@ +using Newtonsoft.Json; +using steam_token.Entity; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Util +{ + public class ConfigUtil + { + public static string CONFIG_NAME = steam_token.Properties.Resources.CONFIG_NAME; + public static string CONFIG_FOLDER = steam_token.Properties.Resources.CONFIG_FOLDER; + + public static void Init(T t) + { + string configPath = GetConfigPath(); + if (File.Exists(configPath)) + { + return; + } + File.WriteAllText(configPath, JsonConvert.SerializeObject(t)); + } + + public static T Read() + { + string json = File.ReadAllText(GetConfigPath()); + + try + { + return JsonConvert.DeserializeObject(json); + } + catch (Exception) + { + MessageBox.Show("配置文件内容异常, 请检查", json); + } + + return default; + } + + public static void Save(T config) + { + if (null == config) + { + return; + } + File.WriteAllText(GetConfigPath(), JsonConvert.SerializeObject(config)); + } + + private static string GetConfigPath() + { + string folder = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "/niushuai233/" + CONFIG_FOLDER; + if (!Directory.Exists(folder)) + { + Directory.CreateDirectory(folder); + } + return folder + "/" + CONFIG_NAME; + } + } +} diff --git a/Util/SteamGuardCalcThread.cs b/Util/SteamGuardCalcThread.cs new file mode 100644 index 0000000..ebdbfd6 --- /dev/null +++ b/Util/SteamGuardCalcThread.cs @@ -0,0 +1,69 @@ +using steam_token.Entity; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using Util; + +namespace steam_token.Util +{ + public class SteamGuardCalcThread + { + private static Thread thread; + private static Label label_guard; + private static ProgressBar progressBar_refresh; + internal static void StartThread(Label label, ProgressBar progressBar) + { + label_guard = label; + progressBar_refresh = progressBar; + + StartThread(); + } + + private static void StartThread() + { + if (thread != null && thread.IsAlive) + { + // 先停止原先的线程 + thread.Abort(); + Console.WriteLine("中止线程"); + } + // 等1s 保证停止 + // Thread.Sleep(1000); + + // 初始化线程 + thread = new Thread(Calc); + thread.Name = "SteamGuardCalcThread"; + // 开启线程 + thread.Start(); + } + + private static void Calc() + { + Config config = ConfigUtil.Read(); + string shared_secret = config.SteamGuard.shared_secret; + if (string.IsNullOrEmpty(shared_secret)) + { + Console.WriteLine("未发现配置的秘钥"); + return; + } + + for (int i = 30; i >= 0; i--) + { + Thread.Sleep(1000); + if (i == 0) + { + string guard = SteamTwoFactorToken.GenerateSteamGuardCode(shared_secret); + label_guard.Text = guard; + i = 30; + Console.WriteLine("重新设值: " + guard); + } + + progressBar_refresh.Value = i; + } + } + } +} diff --git a/Util/SteamTwoFactorToken.cs b/Util/SteamTwoFactorToken.cs new file mode 100644 index 0000000..64cff66 --- /dev/null +++ b/Util/SteamTwoFactorToken.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace steam_token.Util +{ + public class SteamTwoFactorToken + { + private static byte[] s_rgchSteamguardCodeChars = { 50, 51, 52, 53, 54, 55, 56, 57, 66, 67, 68, 70, 71, 72, 74, 75, 77, 78, 80, 81, 82, 84, 86, 87, 88, 89 }; + private byte[] mSecret; + + public SteamTwoFactorToken(String sharedSecret) + { + if (!string.IsNullOrEmpty(sharedSecret)) + { + this.mSecret = Convert.FromBase64String(sharedSecret); + } + else + { + MessageBox.Show("未知的shared_secret"); + } + } + + public static string GenerateSteamGuardCode(String sharedSecret) + { + return new SteamTwoFactorToken(sharedSecret).GenerateSteamGuardCode(); + } + + public string GenerateSteamGuardCode() + { + return GenerateSteamGuardCodeForTime(CurrentTime()); + } + + private string GenerateSteamGuardCodeForTime(long calcTime) + { + if (this.mSecret == null) + { + return ""; + } + byte[] bArr = new byte[8]; + long j2 = calcTime / 30; + + int i = 8; + while (true) + { + int i2 = i - 1; + if (i <= 0) + { + break; + } + bArr[i2] = (byte)((int)j2); + j2 = RightMove(j2, 8); + i = i2; + } + + HMACSHA1 hmacsha1 = new HMACSHA1(); + hmacsha1.Key = (this.mSecret); + + byte[] doFinal = hmacsha1.ComputeHash(bArr); + int i3 = doFinal[19] & 15; + int i4 = (doFinal[i3 + 3] & 255) | ((doFinal[i3 + 2] & 255) << 8) | ((doFinal[i3] & 127) << 24) | ((doFinal[i3 + 1] & 255) << 16); + byte[] bArr2 = new byte[5]; + for (int i5 = 0; i5 < 5; i5++) + { + byte[] bArr3 = s_rgchSteamguardCodeChars; + bArr2[i5] = bArr3[i4 % bArr3.Length]; + i4 /= bArr3.Length; + } + + return System.Text.Encoding.UTF8.GetString(bArr2); + } + + public long CurrentTime() + { + return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() / 1000; + } + + + /// + /// 无符号右移, 相当于java里的 value>>>pos + /// + /// + /// + /// + public long RightMove(long value, int pos) + { + //移动 0 位时直接返回原值 + if (pos != 0) + { + // int.MaxValue = 0x7FFFFFFF 整数最大值 + int mask = int.MaxValue; + //无符号整数最高位不表示正负但操作数还是有符号的,有符号数右移1位,正数时高位补0,负数时高位补1 + value = value >> 1; + //和整数最大值进行逻辑与运算,运算后的结果为忽略表示正负值的最高位 + value = value & mask; + //逻辑运算后的值无符号,对无符号的值直接做右移运算,计算剩下的位 + value = value >> pos - 1; + } + + return value; + } + } +} diff --git a/XXXSteamTwoFactorToken.cs b/XXXSteamTwoFactorToken.cs new file mode 100644 index 0000000..d7d5892 --- /dev/null +++ b/XXXSteamTwoFactorToken.cs @@ -0,0 +1,47 @@ +using steam_token.Entity; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Util; + +namespace steam_token +{ + public class XXXSteamTwoFactorToken + { + private static byte[] s_rgchSteamguardCodeChars = { 50, 51, 52, 53, 54, 55, 56, 57, 66, 67, 68, 70, 71, 72, 74, 75, 77, 78, 80, 81, 82, 84, 86, 87, 88, 89 }; + private byte[] mSecret; + + public XXXSteamTwoFactorToken(String sharedSecret) + { + if (string.IsNullOrEmpty(sharedSecret)) + { + this.mSecret = Convert.FromBase64String(sharedSecret); + } + else + { + MessageBox.Show("未知参数 shared_secret"); + } + } + + public static String GenerateSteamGuardCode() + { + string sharedSecret = ConfigUtil.Read().SteamGuard.shared_secret; + + return new XXXSteamTwoFactorToken(sharedSecret).GenerateSteamGuardCodeForTime(CurrentTime()); + } + + private String GenerateSteamGuardCodeForTime(long calcTime) + { + + return null; + } + + private static long CurrentTime() + { + return DateTime.Now.Millisecond / 1000; + } + } +} diff --git a/packages.config b/packages.config new file mode 100644 index 0000000..c8fdfd1 --- /dev/null +++ b/packages.config @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/steam-token.csproj b/steam-token.csproj new file mode 100644 index 0000000..dbfef78 --- /dev/null +++ b/steam-token.csproj @@ -0,0 +1,276 @@ + + + + + + Debug + AnyCPU + {26555785-E311-4F28-A28D-DD96B3165B98} + WinExe + steam_token + steam-token + v4.8 + 512 + true + true + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + steam-token.ico + + + + packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll + + + packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll + True + True + + + packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + + + + packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll + True + True + + + + packages\System.Console.4.3.0\lib\net46\System.Console.dll + True + True + + + + packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + + + packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll + True + True + + + packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll + True + True + + + packages\System.IO.4.3.0\lib\net462\System.IO.dll + True + True + + + packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll + True + True + + + + packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll + True + True + + + packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll + True + True + + + packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll + True + True + + + packages\System.Linq.4.3.0\lib\net463\System.Linq.dll + True + True + + + packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll + True + True + + + packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll + True + True + + + packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll + True + True + + + + packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll + True + True + + + packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll + True + True + + + packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll + True + True + + + packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll + True + True + + + packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll + True + True + + + packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll + True + True + + + packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + True + True + + + packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + True + True + + + packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + True + True + + + packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll + True + True + + + + + + + + + + + + packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll + True + True + + + + + + + Form + + + MainForm.cs + + + + + Form + + + AboutForm.cs + + + Form + + + ProgramConfig.cs + + + Form + + + GuardConfig.cs + + + + + + MainForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + AboutForm.cs + + + GuardConfig.cs + + + ProgramConfig.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + + + \ No newline at end of file diff --git a/steam-token.ico b/steam-token.ico new file mode 100644 index 0000000..a5bd0d5 Binary files /dev/null and b/steam-token.ico differ diff --git a/steam-token.sln b/steam-token.sln new file mode 100644 index 0000000..5448f29 --- /dev/null +++ b/steam-token.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32106.194 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "steam-token", "steam-token.csproj", "{26555785-E311-4F28-A28D-DD96B3165B98}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {26555785-E311-4F28-A28D-DD96B3165B98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26555785-E311-4F28-A28D-DD96B3165B98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26555785-E311-4F28-A28D-DD96B3165B98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26555785-E311-4F28-A28D-DD96B3165B98}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {820E8374-01AD-41B9-82C1-388ADF797885} + EndGlobalSection +EndGlobal