diff --git a/E5Renewer.Tests/Models/UintExtendsTests.cs b/E5Renewer.Tests/Models/UintExtendsTests.cs
new file mode 100644
index 0000000..706df8f
--- /dev/null
+++ b/E5Renewer.Tests/Models/UintExtendsTests.cs
@@ -0,0 +1,43 @@
+using E5Renewer.Models;
+
+namespace E5Renewer.Tests.Models;
+
+/// Test
+///
+///
+[TestClass]
+public class UintExtendsTests
+{
+ ///
+ /// Test
+ ///
+ ///
+ [TestMethod]
+ [DataRow(0b000000000, UnixFileMode.None)]
+ [DataRow(0b000000001, UnixFileMode.OtherExecute)]
+ [DataRow(0b000000010, UnixFileMode.OtherWrite)]
+ [DataRow(0b000000011, UnixFileMode.OtherWrite | UnixFileMode.OtherExecute)]
+ [DataRow(0b000000100, UnixFileMode.OtherRead)]
+ [DataRow(0b000000101, UnixFileMode.OtherRead | UnixFileMode.OtherExecute)]
+ [DataRow(0b000000110, UnixFileMode.OtherRead | UnixFileMode.OtherWrite)]
+ [DataRow(0b000000111, UnixFileMode.OtherRead | UnixFileMode.OtherWrite | UnixFileMode.OtherExecute)]
+ [DataRow(0b000001000, UnixFileMode.GroupExecute)]
+ [DataRow(0b000010000, UnixFileMode.GroupWrite)]
+ [DataRow(0b000011000, UnixFileMode.GroupWrite | UnixFileMode.GroupExecute)]
+ [DataRow(0b000100000, UnixFileMode.GroupRead)]
+ [DataRow(0b000101000, UnixFileMode.GroupRead | UnixFileMode.GroupExecute)]
+ [DataRow(0b000110000, UnixFileMode.GroupRead | UnixFileMode.GroupWrite)]
+ [DataRow(0b000111000, UnixFileMode.GroupRead | UnixFileMode.GroupWrite | UnixFileMode.GroupExecute)]
+ [DataRow(0b001000000, UnixFileMode.UserExecute)]
+ [DataRow(0b010000000, UnixFileMode.UserWrite)]
+ [DataRow(0b011000000, UnixFileMode.UserWrite | UnixFileMode.UserExecute)]
+ [DataRow(0b100000000, UnixFileMode.UserRead)]
+ [DataRow(0b101000000, UnixFileMode.UserRead | UnixFileMode.UserExecute)]
+ [DataRow(0b110000000, UnixFileMode.UserRead | UnixFileMode.UserWrite)]
+ [DataRow(0b111000000, UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute)]
+ [DataRow(0b100100100, UnixFileMode.UserRead | UnixFileMode.GroupRead | UnixFileMode.OtherRead)]
+ public void TestToUnixFileMode(int permission, UnixFileMode mode)
+ {
+ Assert.AreEqual(mode, ((uint)permission).ToUnixFileMode());
+ }
+}
diff --git a/E5Renewer/Models/Config/Config.cs b/E5Renewer/Models/Config/Config.cs
index 2d093a7..bafce6c 100644
--- a/E5Renewer/Models/Config/Config.cs
+++ b/E5Renewer/Models/Config/Config.cs
@@ -56,7 +56,7 @@ public Config()
this.listenAddr = "127.0.0.1";
this.listenPort = 8888;
this.listenSocket = "/run/e5renewer/e5renewer.socket";
- this.listenSocketPermission = 666;
+ this.listenSocketPermission = Convert.ToUInt32("666", 8);
this.users = new();
}
}
diff --git a/E5Renewer/Models/UintExtends.cs b/E5Renewer/Models/UintExtends.cs
index 3f2497c..0d5f714 100644
--- a/E5Renewer/Models/UintExtends.cs
+++ b/E5Renewer/Models/UintExtends.cs
@@ -5,6 +5,9 @@ namespace E5Renewer.Models
///
public static class UintExtends
{
+ private const uint minPermission = 0; // 0o000
+ private const uint maxPermission = 511; // 0o777
+
/// Convert
/// uint
/// to
@@ -12,50 +15,18 @@ public static class UintExtends
///
public static UnixFileMode ToUnixFileMode(this uint permission)
{
- if (permission > 777)
+
+ if (permission < UintExtends.minPermission)
{
- permission = 777;
+ permission = UintExtends.minPermission;
}
- uint user = permission / 100;
- uint group = (permission - user * 100) / 10;
- uint other = permission - user * 100 - group * 10;
- UnixFileMode userFileMode = user switch
+
+ if (permission > UintExtends.maxPermission)
{
- 0 => UnixFileMode.None,
- 1 => UnixFileMode.UserExecute,
- 2 => UnixFileMode.UserWrite,
- 3 => UnixFileMode.UserWrite | UnixFileMode.UserExecute,
- 4 => UnixFileMode.UserRead,
- 5 => UnixFileMode.UserRead | UnixFileMode.UserExecute,
- 6 => UnixFileMode.UserRead | UnixFileMode.UserWrite,
- 7 => UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute,
- _ => throw new ArgumentOutOfRangeException(nameof(user), string.Format("Invalid unix user permission value {0}", user))
- };
- UnixFileMode groupFileMode = group switch
- {
- 0 => UnixFileMode.None,
- 1 => UnixFileMode.GroupExecute,
- 2 => UnixFileMode.GroupWrite,
- 3 => UnixFileMode.GroupWrite | UnixFileMode.GroupExecute,
- 4 => UnixFileMode.GroupRead,
- 5 => UnixFileMode.GroupRead | UnixFileMode.GroupExecute,
- 6 => UnixFileMode.GroupRead | UnixFileMode.GroupWrite,
- 7 => UnixFileMode.GroupRead | UnixFileMode.GroupWrite | UnixFileMode.GroupExecute,
- _ => throw new ArgumentOutOfRangeException(nameof(group), string.Format("Invalid unix group permission value {0}", group))
- };
- UnixFileMode otherFileMode = other switch
- {
- 0 => UnixFileMode.None,
- 1 => UnixFileMode.OtherExecute,
- 2 => UnixFileMode.OtherWrite,
- 3 => UnixFileMode.OtherWrite | UnixFileMode.OtherExecute,
- 4 => UnixFileMode.OtherRead,
- 5 => UnixFileMode.OtherRead | UnixFileMode.OtherExecute,
- 6 => UnixFileMode.OtherRead | UnixFileMode.OtherWrite,
- 7 => UnixFileMode.OtherRead | UnixFileMode.OtherWrite | UnixFileMode.OtherExecute,
- _ => throw new ArgumentOutOfRangeException(nameof(other), string.Format("Invalid unix other permission {0}", other))
- };
- return userFileMode | groupFileMode | otherFileMode;
+ permission = UintExtends.maxPermission;
+ }
+
+ return (UnixFileMode)permission;
}
}
}
diff --git a/README.md b/README.md
index ca15eeb..c7e5e0d 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,10 @@ A tool to renew e5 subscription by calling msgraph APIs
If you want to use certificate instead secret, which is better for security, you can write a `certificate` key with path to your certificate file instead `secret` key.
Tips: We support json, yaml and toml formats, just let their contents be equal, the configuration result is same.
+
+ > [!NOTE]
+ > Due to that C# does not have a native octal number support, we use the `listen_socket_permission` as unix permission directly.
+ > For example, if you are using json format, you need to set it to `438` in order to see socket mode is `rw-rw-rw-`.
3. Install .NET