summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/lockedit.pm
blob: 525fcb0e5d7fd0e074036421d74a3bc59b2dc33e (plain)
  1. #!/usr/bin/perl
  2. package IkiWiki::Plugin::lockedit;
  3. use warnings;
  4. use strict;
  5. use IkiWiki 2.00;
  6. sub import { #{{{
  7. hook(type => "getsetup", id => "lockedit", call => \&getsetup);
  8. hook(type => "canedit", id => "lockedit", call => \&canedit);
  9. hook(type => "formbuilder_setup", id => "lockedit",
  10. call => \&formbuilder_setup);
  11. } # }}}
  12. sub getsetup () { #{{{
  13. return
  14. locked_pages => {
  15. type => "pagespec",
  16. example => "!*/Discussion",
  17. description => "PageSpec controlling which pages are locked",
  18. link => "ikiwiki/PageSpec",
  19. safe => 1,
  20. rebuild => 0,
  21. },
  22. } #}}}
  23. sub canedit ($$) { #{{{
  24. my $page=shift;
  25. my $cgi=shift;
  26. my $session=shift;
  27. my $user=$session->param("name");
  28. return undef if defined $user && IkiWiki::is_admin($user);
  29. if (defined $config{locked_pages} && length $config{locked_pages} &&
  30. pagespec_match($page, $config{locked_pages})) {
  31. if (! defined $user ||
  32. ! IkiWiki::userinfo_get($session->param("name"), "regdate")) {
  33. return sub { IkiWiki::needsignin($cgi, $session) };
  34. }
  35. else {
  36. return sprintf(gettext("%s is locked and cannot be edited"),
  37. htmllink("", "", $page, noimageinline => 1));
  38. }
  39. }
  40. # XXX deprecated, should be removed eventually
  41. foreach my $admin (@{$config{adminuser}}) {
  42. if (pagespec_match($page, IkiWiki::userinfo_get($admin, "locked_pages"))) {
  43. if (! defined $user ||
  44. ! IkiWiki::userinfo_get($session->param("name"), "regdate")) {
  45. return sub { IkiWiki::needsignin($cgi, $session) };
  46. }
  47. else {
  48. return sprintf(gettext("%s is locked and cannot be edited"),
  49. htmllink("", "", $page, noimageinline => 1));
  50. }
  51. }
  52. }
  53. return undef;
  54. } #}}}
  55. sub formbuilder_setup (@) { #{{{
  56. my %params=@_;
  57. # XXX deprecated, should be removed eventually
  58. my $form=$params{form};
  59. if ($form->title eq "preferences") {
  60. my $session=$params{session};
  61. my $cgi=$params{cgi};
  62. my $user_name=$session->param("name");
  63. $form->field(name => "locked_pages", size => 50,
  64. fieldset => "admin",
  65. comment => "deprecated; please move to locked_pages in setup file"
  66. );
  67. if (! IkiWiki::is_admin($user_name)) {
  68. $form->field(name => "locked_pages", type => "hidden");
  69. }
  70. if (! $form->submitted) {
  71. my $value=IkiWiki::userinfo_get($user_name, "locked_pages");
  72. if (length $value) {
  73. $form->field(name => "locked_pages", force => 1, value => $value);
  74. }
  75. else {
  76. $form->field(name => "locked_pages", type => "hidden");
  77. }
  78. }
  79. if ($form->submitted && $form->submitted eq 'Save Preferences') {
  80. if (defined $form->field("locked_pages")) {
  81. IkiWiki::userinfo_set($user_name, "locked_pages",
  82. $form->field("locked_pages")) ||
  83. error("failed to set locked_pages");
  84. if (! length $form->field("locked_pages")) {
  85. $form->field(name => "locked_pages", type => "hidden");
  86. }
  87. }
  88. }
  89. }
  90. } #}}}
  91. 1