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