From: <de...@de...> - 2006-08-20 13:20:02
|
Author: CrawfordCurrie Date: 2006-08-20 05:17:46 -0500 (Sun, 20 Aug 2006) New Revision: 11345 Modified: twiki/branches/TWikiRelease04x00/lib/TWiki.pm twiki/branches/TWikiRelease04x00/lib/TWiki/Access.pm twiki/branches/TWikiRelease04x00/lib/TWiki/Func.pm twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs.pm twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs/Parser.pm twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs/PrefsCache.pm twiki/branches/TWikiRelease04x00/lib/TWiki/Search.pm twiki/branches/TWikiRelease04x00/lib/TWiki/Store.pm twiki/branches/TWikiRelease04x00/lib/TWiki/Templates.pm twiki/branches/TWikiRelease04x00/lib/TWiki/UI.pm twiki/branches/TWikiRelease04x00/lib/TWiki/UI/Manage.pm twiki/branches/TWikiRelease04x00/test/unit/AccessControlTests.pm Log: Item2714: passed meta to access checks everywhere it's appropriate Modified: twiki/branches/TWikiRelease04x00/lib/TWiki/Access.pm =================================================================== --- twiki/branches/TWikiRelease04x00/lib/TWiki/Access.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/lib/TWiki/Access.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -100,11 +100,12 @@ =pod ----++ ObjectMethod checkAccessPermission( $action, $user, $text, $topic, $web ) -> $boolean +---++ ObjectMethod checkAccessPermission( $action, $user, $text, $meta, $topic, $web ) -> $boolean Check if user is allowed to access topic * =$action= - 'VIEW', 'CHANGE', 'CREATE', etc. * =$user= - User object * =$text= - If undef or '': Read '$theWebName.$theTopicName' to check permissions + * =$meta= - If undef, but =$text= is defined, then metadata will be parsed from =$text=. If defined, then metadata embedded in =$text= will be ignored. Always ignored if =$text= is undefined. Settings in =$meta= override * Set settings in plain text. * =$topic= - Topic name to check, e.g. 'SomeTopic' *undef to check web perms only) * =$web= - Web, e.g. 'Know' If the check fails, the reason can be recoveered using getReason. @@ -112,7 +113,7 @@ =cut sub checkAccessPermission { - my( $this, $mode, $user, $text, $topic, $web ) = @_; + my( $this, $mode, $user, $text, $meta, $topic, $web ) = @_; ASSERT($this->isa( 'TWiki::Access')) if DEBUG; ASSERT($user->isa( 'TWiki::User')) if DEBUG; @@ -135,14 +136,12 @@ my $denyText; # extract the * Set (ALLOWTOPIC|DENYTOPIC)$mode - if( $text ) { - # override topic permissions. Note: ignores embedded metadata - # SMELL: this is horrible! But it's inevitable given the dreadful - # business of storing access controls embedded in topic text. - $allowText = $prefs->getTextPreferencesValue( 'ALLOWTOPIC'.$mode, - $text, $web, $topic ); - $denyText = $prefs->getTextPreferencesValue( 'DENYTOPIC'.$mode, - $text, $web, $topic ); + if( defined $text ) { + # override topic permissions. + $allowText = $prefs->getTextPreferencesValue( + 'ALLOWTOPIC'.$mode, $text, $meta, $web, $topic ); + $denyText = $prefs->getTextPreferencesValue( + 'DENYTOPIC'.$mode, $text, $meta, $web, $topic ); } elsif( $topic ) { $allowText = $prefs->getTopicPreferencesValue( 'ALLOWTOPIC'.$mode, $web, $topic ); Modified: twiki/branches/TWikiRelease04x00/lib/TWiki/Func.pm =================================================================== --- twiki/branches/TWikiRelease04x00/lib/TWiki/Func.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/lib/TWiki/Func.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -649,7 +649,7 @@ ASSERT($TWiki::Plugins::SESSION) if DEBUG; $user = $TWiki::Plugins::SESSION->{users}->findUser( $user ); return $TWiki::Plugins::SESSION->{security}->checkAccessPermission - ( $type, $user, $text, $topic, $web ); + ( $type, $user, $text, undef, $topic, $web ); } =pod Modified: twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs/Parser.pm =================================================================== --- twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs/Parser.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs/Parser.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -62,29 +62,29 @@ sub parseText { my( $this, $text, $prefs, $keyPrefix ) = @_; + $text =~ tr/\r//d; my $key = ''; my $value =''; my $type; - foreach my $line ( split( /\r?\n/, $text ) ) { - if( $line =~ m/$TWiki::regex{setVarRegex}/o ) { - if( $type ) { + foreach( split( "\n", $text ) ) { + if( m/$TWiki::regex{setVarRegex}/os ) { + if( defined $type ) { $prefs->insert( $type, $keyPrefix.$key, $value ); } $type = $1; $key = $2; $value = (defined $3) ? $3 : ''; - } elsif( $type ) { - if( $line =~ /^(\s{3}|\t)+\s*[^\s*]/ && - $line !~ m/$TWiki::regex{bulletRegex}/o ) { + } elsif( defined $type ) { + if( /^( |\t)+ */ && !/$TWiki::regex{bulletRegex}/o ) { # follow up line, extending value - $value .= "\n$line"; + $value .= "\n".$_; } else { $prefs->insert( $type, $keyPrefix.$key, $value ); undef $type; } } } - if( $type ) { + if( defined $type ) { $prefs->insert( $type, $keyPrefix.$key, $value ); } } Modified: twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs/PrefsCache.pm =================================================================== --- twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs/PrefsCache.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs/PrefsCache.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -45,8 +45,11 @@ package TWiki::Prefs::PrefsCache; use TWiki::Prefs::Parser; + use Assert; +use vars qw( $parser ); + =pod ---++ ClassMethod new( $prefs, $parent, $type, $web, $topic, $prefix ) @@ -133,7 +136,7 @@ my( $meta, $text ) = $session->{store}->readTopic( undef, $web, $topic, undef ); - my $parser = new TWiki::Prefs::Parser(); + $parser ||= new TWiki::Prefs::Parser(); $parser->parseText( $text, $this, $keyPrefix ); $parser->parseMeta( $meta, $this, $keyPrefix ); } @@ -141,10 +144,12 @@ =pod ----++ ObjectMethod loadPrefsFromText( $text, $web, $topic ) +---++ ObjectMethod loadPrefsFromText( $text, $meta, $web, $topic ) -Loads preferences from a topic. All settings loaded are prefixed -with the key prefix (default ''). +Loads preferences from text and optional metadata. All settings loaded +are prefixed with the key prefix (default ''). If =$meta= is defined, +then metadata will be taken from that object. Otherwise, =$text= will +be parsed to extract meta-data. =cut @@ -153,14 +158,16 @@ # stuck with. sub loadPrefsFromText { - my( $this, $text, $web, $topic ) = @_; + my( $this, $text, $meta, $web, $topic ) = @_; ASSERT($this->isa( 'TWiki::Prefs::PrefsCache')) if DEBUG; $this->{SOURCE} = $web.'.'.$topic; my $session = $this->{MANAGER}->{session}; - my $meta = new TWiki::Meta( $session, $web, $topic ); - $session->{store}->extractMetaData( $meta, \$text ); + unless( $meta ) { + $meta = new TWiki::Meta( $session, $web, $topic ); + $session->{store}->extractMetaData( $meta, \$text ); + } my $parser = new TWiki::Prefs::Parser(); $parser->parseText( $text, $this, '' ); @@ -183,10 +190,11 @@ return if $this->{CONTEXT}->isFinalised( $key ); - $value =~ s/\t/ /g; # replace TAB by space + $value =~ tr/\r//d; # Delete \r + $value =~ tr/\t/ /; # replace TAB by space $value =~ s/([^\\])\\n/$1\n/g; # replace \n by new line $value =~ s/([^\\])\\\\n/$1\\n/g; # replace \\n by \n - $value =~ s/`//g; # filter out dangerous chars + $value =~ tr/`//d; # filter out dangerous chars if( $type eq 'Local' ) { $this->{locals}{$this->{SOURCE}.'-'.$key} = $value; } else { Modified: twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs.pm =================================================================== --- twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/lib/TWiki/Prefs.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -290,22 +290,20 @@ =pod ----++ getTextPreferencesValue( $key, $text, $web, $topic ) -> $value -Get a preference value from the settings in the text. The values are -*not* cached. +---++ getTextPreferencesValue( $key, $text, $meta, $web, $topic ) -> $value +Get a preference value from the settings in the text (and/or optional $meta). +The values read are *not* cached. =cut -# SMELL: this is horrible! But it's inevitable given the truly dreadful -# business of storing access controls embedded in topic text. sub getTextPreferencesValue { - my( $this, $key, $text, $web, $topic ) = @_; + my( $this, $key, $text, $meta, $web, $topic ) = @_; my $wtn = $web.'.'.$topic; my $cache = new TWiki::Prefs::PrefsCache( $this, undef, 'TOPIC' ); - $cache->loadPrefsFromText( $text, $web, $topic ); + $cache->loadPrefsFromText( $text, $meta, $web, $topic ); return $cache->{values}{$key}; } Modified: twiki/branches/TWikiRelease04x00/lib/TWiki/Search.pm =================================================================== --- twiki/branches/TWikiRelease04x00/lib/TWiki/Search.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/lib/TWiki/Search.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -1039,10 +1039,9 @@ $info->{allowView} = $session->{security}-> - checkAccessPermission( 'view', - $session->{user}, - $text, $topic, - $web ); + checkAccessPermission( 'view', $session->{user}, + $text, $meta, + $topic, $web ); return $info unless $sortfield; Modified: twiki/branches/TWikiRelease04x00/lib/TWiki/Store.pm =================================================================== --- twiki/branches/TWikiRelease04x00/lib/TWiki/Store.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/lib/TWiki/Store.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -193,9 +193,11 @@ $text = $handler->getRevision( $version ); } + # Note: passing undef as meta will cause extraction of the meta + # from the (raw) text passed if( $user && !$this->{session}->{security}->checkAccessPermission - ( 'view', $user, $text, $topic, $web )) { + ( 'view', $user, $text, undef, $topic, $web )) { throw TWiki::AccessControlException( 'VIEW', $user, $web, $topic, $this->{session}->{security}->getReason()); @@ -227,7 +229,7 @@ my( $ometa, $otext ) = $this->readTopic( undef, $oldWeb, $oldTopic ); if( $user && !$this->{session}->{security}->checkAccessPermission - ( 'change', $user, $otext, $oldTopic, $oldWeb )) { + ( 'change', $user, $otext, $ometa, $oldTopic, $oldWeb )) { throw TWiki::AccessControlException( 'CHANGE', $user, $oldWeb, $oldTopic, $this->{session}->{security}->getReason()); @@ -236,7 +238,7 @@ my ( $nmeta, $ntext ) = $this->readTopic( undef, $newWeb, $newTopic ); if( $user && !$this->{session}->{security}->checkAccessPermission - ( 'change', $user, $ntext, $newTopic, $newWeb )) { + ( 'change', $user, $ntext, $nmeta, $newTopic, $newWeb )) { throw TWiki::AccessControlException( 'CHANGE', $user, $newWeb, $newTopic, $this->{session}->{security}->getReason()); @@ -300,7 +302,7 @@ if( $user && !$this->{session}->{security}->checkAccessPermission - ( 'view', $user, undef, $topic, $web )) { + ( 'view', $user, undef, undef, $topic, $web )) { throw TWiki::AccessControlException( 'VIEW', $user, $web, $topic, $this->{session}->{security}->getReason()); } @@ -436,9 +438,10 @@ $this->lockTopic( $user, $oldWeb, $oldTopic ); try { my $otext = $this->readTopicRaw( undef, $oldWeb, $oldTopic ); + # Note: undef $meta param will cause $otext to be parsed for meta if( $user && !$this->{session}->{security}->checkAccessPermission - ( 'change', $user, $otext, $oldTopic, $oldWeb )) { + ( 'change', $user, $otext, undef, $oldTopic, $oldWeb )) { throw TWiki::AccessControlException( 'CHANGE', $user, $oldWeb, $oldTopic, @@ -451,7 +454,7 @@ } if( $user && !$this->{session}->{security}->checkAccessPermission - ( 'change', $user, $ntext, $newTopic, $newWeb )) { + ( 'change', $user, $ntext, $nmeta, $newTopic, $newWeb )) { throw TWiki::AccessControlException( 'CHANGE', $user, $newWeb, $newTopic, $this->{session}->{security}->getReason()); @@ -567,7 +570,7 @@ if( $user && !$this->{session}->{security}->checkAccessPermission - ( 'view', $user, undef, $topic, $web )) { + ( 'view', $user, undef, undef, $topic, $web )) { throw TWiki::AccessControlException( 'VIEW', $user, $web, $topic, $this->{session}->{security}->getReason()); @@ -820,7 +823,7 @@ if( $user && !$this->{session}->{security}->checkAccessPermission - ( 'change', $user, undef, $topic, $web )) { + ( 'change', $user, undef, undef, $topic, $web )) { throw TWiki::AccessControlException( 'CHANGE', $user, $web, $topic, @@ -909,7 +912,7 @@ if( $user && !$this->{session}->{security}->checkAccessPermission - ( 'change', $user, $text, $topic, $web )) { + ( 'change', $user, $text, $meta, $topic, $web )) { throw TWiki::AccessControlException( 'CHANGE', $user, $web, $topic, @@ -1594,7 +1597,8 @@ my $security = $this->{session}->{security}; @webList = grep { - $security->checkAccessPermission( 'view', $user, undef, undef, $_ ) + $security->checkAccessPermission( + 'view', $user, undef, undef, undef, $_ ) } @webList; } Modified: twiki/branches/TWikiRelease04x00/lib/TWiki/Templates.pm =================================================================== --- twiki/branches/TWikiRelease04x00/lib/TWiki/Templates.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/lib/TWiki/Templates.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -412,7 +412,8 @@ sub validateTopic { my( $session, $store, $user, $topic, $web ) = @_; return $store->topicExists( $web, $topic ) && - $session->{security}->checkAccessPermission ('view', $user, undef, $topic, $web ); + $session->{security}->checkAccessPermission( + 'view', $user, undef, undef, $topic, $web ); } sub retrieveTopic { Modified: twiki/branches/TWikiRelease04x00/lib/TWiki/UI/Manage.pm =================================================================== --- twiki/branches/TWikiRelease04x00/lib/TWiki/UI/Manage.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/lib/TWiki/UI/Manage.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -525,7 +525,7 @@ $webTopicInfo{modify}{$ref}{summary} = $refs{$ref}; $webTopicInfo{modify}{$ref}{access} = $security->checkAccessPermission('change', $user, - undef, $webTopic, + undef, undef, $webTopic, $webIter); if(!$webTopicInfo{modify}{$ref}{access}) { $webTopicInfo{modify}{$ref}{accessReason} = @@ -564,7 +564,7 @@ $webTopicInfo{move}{$wit}{leaseuser} ne $user); $webTopicInfo{move}{$wit}{access} = $security->checkAccessPermission('rename', $user, - undef, $webTopic, + undef, undef, $webTopic, $webIter); $webTopicInfo{move}{$wit}{accessReason} = $security->getReason(); Modified: twiki/branches/TWikiRelease04x00/lib/TWiki/UI.pm =================================================================== --- twiki/branches/TWikiRelease04x00/lib/TWiki/UI.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/lib/TWiki/UI.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -257,8 +257,8 @@ my ( $session, $web, $topic, $mode, $user ) = @_; ASSERT($session->isa( 'TWiki')) if DEBUG; - unless( $session->{security}->checkAccessPermission( $mode, $user, undef, - $topic, $web )) { + unless( $session->{security}->checkAccessPermission( + $mode, $user, undef, undef, $topic, $web )) { throw TWiki::OopsException( 'accessdenied', def => 'topic_access', web => $web, Modified: twiki/branches/TWikiRelease04x00/lib/TWiki.pm =================================================================== --- twiki/branches/TWikiRelease04x00/lib/TWiki.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/lib/TWiki.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -407,13 +407,12 @@ $regex{mixedAlphaNumRegex} = qr/[$regex{mixedAlphaNum}]*/o; # %TAG% name - $regex{tagNameRegex} = qr/[$regex{mixedAlpha}][$regex{mixedAlphaNum}_:]*/o; + $regex{tagNameRegex} = '['.$regex{mixedAlpha}.']['.$regex{mixedAlphaNum}.'_:]*'; # Set statement in a topic - $regex{bulletRegex} = qr/^(?:\t| )+\*/; - $regex{setRegex} = qr/$regex{bulletRegex}\s+(Set|Local)\s+/o; - # SMELL: this ought to use $regex{tagNameRegex} - $regex{setVarRegex} = qr/$regex{setRegex}(\w+)\s*=\s*(.*)$/o; + $regex{bulletRegex} = '^(?:\t| )+\*'; + $regex{setRegex} = $regex{bulletRegex}.'\s+(Set|Local)\s+'; + $regex{setVarRegex} = $regex{setRegex}.'('.$regex{tagNameRegex}.')\s*=\s*(.*)$'; # Character encoding regexes @@ -1556,7 +1555,7 @@ if( $web ne $theWeb || $topic ne $theTopic ) { # CODE_SMELL: Does not account for not yet authenticated user unless( $this->{security}->checkAccessPermission( - 'view', $this->{user}, undef, $topic, $web ) ) { + 'view', $this->{user}, undef, undef, $topic, $web ) ) { return $this->inlineAlert( 'alerts', 'access_denied', $web, $topic ); } @@ -1664,7 +1663,7 @@ if( $web ne $defaultWeb || $topic ne $defaultTopic ) { unless( $this->{security}->checkAccessPermission - ( 'view', $this->{user}, undef, $topic, $web ) ) { + ( 'view', $this->{user}, undef, undef, $topic, $web ) ) { return $this->inlineAlert( 'alerts', 'access_denied', $web, $topic ); } @@ -2733,7 +2732,7 @@ $rev ); unless( $this->{security}->checkAccessPermission( - 'VIEW', $this->{user}, $text, $includedTopic, $includedWeb )) { + 'VIEW', $this->{user}, $text, $meta, $includedTopic, $includedWeb )) { if( isTrue( $warn )) { return $this->inlineAlert( 'alerts', 'access_denied', $includedTopic ); Modified: twiki/branches/TWikiRelease04x00/test/unit/AccessControlTests.pm =================================================================== --- twiki/branches/TWikiRelease04x00/test/unit/AccessControlTests.pm 2006-08-20 09:53:22 UTC (rev 11344) +++ twiki/branches/TWikiRelease04x00/test/unit/AccessControlTests.pm 2006-08-20 10:17:46 UTC (rev 11345) @@ -59,14 +59,14 @@ sub DENIED { my( $this, $web, $topic, $mode, $user ) = @_; $this->assert(!$twiki->{security}->checkAccessPermission - ($mode, $twiki->{users}->findUser($user),undef,$topic,$web), + ($mode, $twiki->{users}->findUser($user),undef,undef,$topic,$web), "$user $mode $web.$topic"); } sub PERMITTED { my( $this, $web, $topic, $mode, $user ) = @_; $this->assert($twiki->{security}->checkAccessPermission - ($mode, $twiki->{users}->findUser($user),undef,$topic,$web), + ($mode, $twiki->{users}->findUser($user),undef,undef,$topic,$web), "$user $mode $web.$topic"); } @@ -218,52 +218,109 @@ $this->DENIED($testWeb,$testTopic,"view",$MrBlue); } -sub test_text { - my $this = shift; - $twiki->{store}->saveTopic( $currUser, $testWeb, $testTopic, - <<THIS -If ALLOWTOPIC is set - 1. people in the list are PERMITTED - 2. everyone else is DENIED -\t* Set ALLOWTOPICVIEW = %MAINWEB%.$MrOrange -THIS - , undef); - $twiki = new TWiki(); - $this->PERMITTED($testWeb,$testTopic,"VIEW",$MrOrange); - $twiki = new TWiki(); - $this->DENIED($testWeb,$testTopic,"VIEW",$MrGreen); - $twiki = new TWiki(); - $this->DENIED($testWeb,$testTopic,"VIEW",$MrYellow); - $twiki = new TWiki(); - $this->DENIED($testWeb,$testTopic,"VIEW",$MrWhite); - $twiki = new TWiki(); - $this->DENIED($testWeb,$testTopic,"view",$MrBlue); +sub checkText { + my ($this, $text, $meta) = @_; - my $text = <<THIS; -\t* Set ALLOWTOPICVIEW = %MAINWEB%.$MrGreen -THIS - - $twiki = new TWiki(); $this->assert(!$twiki->{security}->checkAccessPermission ('VIEW', $twiki->{users}->findUser($MrOrange), - $text,$testTopic,$testWeb), + $text,$meta,$testTopic,$testWeb), " 'VIEW' $testWeb.$testTopic"); $this->assert($twiki->{security}->checkAccessPermission ('VIEW', $twiki->{users}->findUser($MrGreen), - $text,$testTopic,$testWeb), + $text,$meta,$testTopic,$testWeb), " 'VIEW' $testWeb.$testTopic"); $this->assert(!$twiki->{security}->checkAccessPermission ('VIEW', $twiki->{users}->findUser($MrYellow), - $text,$testTopic,$testWeb), + $text,$meta,$testTopic,$testWeb), " 'VIEW' $testWeb.$testTopic"); $this->assert(!$twiki->{security}->checkAccessPermission ('VIEW', $twiki->{users}->findUser($MrWhite), - $text,$testTopic,$testWeb), + $text,$meta,$testTopic,$testWeb), " 'VIEW' $testWeb.$testTopic"); $this->assert(!$twiki->{security}->checkAccessPermission ('VIEW', $twiki->{users}->findUser($MrBlue), - $text,$testTopic,$testWeb), + $text,$meta,$testTopic,$testWeb), " 'VIEW' $testWeb.$testTopic"); } +sub test_SetInText { + my $this = shift; + + $twiki->{store}->saveTopic( $currUser, $testWeb, $testTopic, 'Empty'); + $twiki = new TWiki(); + + my $text = <<THIS; +\t* Set ALLOWTOPICVIEW = %MAINWEB%.$MrGreen +THIS + $this->checkText($text, undef); +} + +sub test_setInMETA { + my $this = shift; + + $twiki->{store}->saveTopic( $currUser, $testWeb, $testTopic, 'Empty'); + $twiki = new TWiki(); + my $meta = new TWiki::Meta($twiki,$testWeb,$testTopic); + my $args = + { + name => 'ALLOWTOPICVIEW', + title => 'ALLOWTOPICVIEW', + value => "%MAINWEB%.$MrGreen", + type => "Set" + }; + $meta->putKeyed('PREFERENCE', $args); + $this->checkText('', $meta); +} + +sub test_setInSetAndMETA { + my $this = shift; + + $twiki->{store}->saveTopic( $currUser, $testWeb, $testTopic, 'Empty'); + $twiki = new TWiki(); + my $meta = new TWiki::Meta($twiki,$testWeb,$testTopic); + my $args = + { + name => 'ALLOWTOPICVIEW', + title => 'ALLOWTOPICVIEW', + value => "%MAINWEB%.$MrGreen", + type => "Set" + }; + $meta->putKeyed('PREFERENCE', $args); + my $text = <<THIS; +\t* Set ALLOWTOPICVIEW = %MAINWEB%.$MrOrange +THIS + $this->checkText($text, $meta); +} + +sub test_setInEmbedAndNoMETA { + my $this = shift; + + $twiki->{store}->saveTopic( $currUser, $testWeb, $testTopic, 'Empty'); + $twiki = new TWiki(); + my $text = <<THIS; +%META:PREFERENCE{name="ALLOWTOPICVIEW" title="ALLOWTOPICVIEW" type="Set" value="%25MAINWEB%25.$MrGreen"}% +THIS + $this->checkText($text, undef); +} + +sub test_setInEmbedAndMETA { + my $this = shift; + + $twiki->{store}->saveTopic( $currUser, $testWeb, $testTopic, 'Empty'); + $twiki = new TWiki(); + my $meta = new TWiki::Meta($twiki,$testWeb,$testTopic); + my $args = + { + name => 'ALLOWTOPICVIEW', + title => 'ALLOWTOPICVIEW', + value => "%MAINWEB%.$MrGreen", + type => "Set" + }; + $meta->putKeyed('PREFERENCE', $args); + my $text = <<THIS; +%META:PREFERENCE{name="ALLOWTOPICVIEW" title="ALLOWTOPICVIEW" type="Set" value="%25MAINWEB%25.$MrOrange"}% +THIS + $this->checkText($text, $meta); +} + 1; |