groups.rs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. use ansi_term::Style;
  2. use users::{Users, Groups};
  3. use crate::fs::fields as f;
  4. use crate::output::cell::TextCell;
  5. impl f::Group {
  6. pub fn render<C: Colours, U: Users+Groups>(self, colours: &C, users: &U) -> TextCell {
  7. use users::os::unix::GroupExt;
  8. let mut style = colours.not_yours();
  9. let group = match users.get_group_by_gid(self.0) {
  10. Some(g) => (*g).clone(),
  11. None => return TextCell::paint(style, self.0.to_string()),
  12. };
  13. let current_uid = users.get_current_uid();
  14. if let Some(current_user) = users.get_user_by_uid(current_uid) {
  15. if current_user.primary_group_id() == group.gid()
  16. || group.members().iter().any(|u| u == current_user.name())
  17. {
  18. style = colours.yours();
  19. }
  20. }
  21. TextCell::paint(style, group.name().to_string_lossy().into())
  22. }
  23. }
  24. pub trait Colours {
  25. fn yours(&self) -> Style;
  26. fn not_yours(&self) -> Style;
  27. }
  28. #[cfg(test)]
  29. #[allow(unused_results)]
  30. pub mod test {
  31. use super::Colours;
  32. use crate::fs::fields as f;
  33. use crate::output::cell::TextCell;
  34. use users::{User, Group};
  35. use users::mock::MockUsers;
  36. use users::os::unix::GroupExt;
  37. use ansi_term::Colour::*;
  38. use ansi_term::Style;
  39. struct TestColours;
  40. impl Colours for TestColours {
  41. fn yours(&self) -> Style { Fixed(80).normal() }
  42. fn not_yours(&self) -> Style { Fixed(81).normal() }
  43. }
  44. #[test]
  45. fn named() {
  46. let mut users = MockUsers::with_current_uid(1000);
  47. users.add_group(Group::new(100, "folk"));
  48. let group = f::Group(100);
  49. let expected = TextCell::paint_str(Fixed(81).normal(), "folk");
  50. assert_eq!(expected, group.render(&TestColours, &users))
  51. }
  52. #[test]
  53. fn unnamed() {
  54. let users = MockUsers::with_current_uid(1000);
  55. let group = f::Group(100);
  56. let expected = TextCell::paint_str(Fixed(81).normal(), "100");
  57. assert_eq!(expected, group.render(&TestColours, &users));
  58. }
  59. #[test]
  60. fn primary() {
  61. let mut users = MockUsers::with_current_uid(2);
  62. users.add_user(User::new(2, "eve", 100));
  63. users.add_group(Group::new(100, "folk"));
  64. let group = f::Group(100);
  65. let expected = TextCell::paint_str(Fixed(80).normal(), "folk");
  66. assert_eq!(expected, group.render(&TestColours, &users))
  67. }
  68. #[test]
  69. fn secondary() {
  70. let mut users = MockUsers::with_current_uid(2);
  71. users.add_user(User::new(2, "eve", 666));
  72. let test_group = Group::new(100, "folk").add_member("eve");
  73. users.add_group(test_group);
  74. let group = f::Group(100);
  75. let expected = TextCell::paint_str(Fixed(80).normal(), "folk");
  76. assert_eq!(expected, group.render(&TestColours, &users))
  77. }
  78. #[test]
  79. fn overflow() {
  80. let group = f::Group(2_147_483_648);
  81. let expected = TextCell::paint_str(Fixed(81).normal(), "2147483648");
  82. assert_eq!(expected, group.render(&TestColours, &MockUsers::with_current_uid(0)));
  83. }
  84. }