Changeset 2099

Show
Ignore:
Timestamp:
04/25/08 03:52:07 (22 months ago)
Author:
bchoate
Message:

Handle special case where user has excessive permission records. BugId:79501

Location:
branches/release-36/lib/MT
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • branches/release-36/lib/MT/Author.pm

    r2087 r2099  
    363363            } 
    364364            ($perm, my $sys_perm) = @perm; 
    365             $perm->add_permission($sys_perm); 
     365            $perm->add_permissions($sys_perm); 
    366366        } elsif (@perm == 1) { 
    367367            $perm = $perm[0]; 
    368368            if (!$perm->blog_id) { 
    369369                $perm->blog_id($obj->id); 
    370                 delete $perm->{column_values}->{id}; 
    371                 delete $perm->{changed_cols}->{id}; 
     370                delete $perm->{column_values}{blog_id}; 
     371                delete $perm->{changed_cols}{blog_id}; 
    372372            } 
    373         } elsif (@perm) { 
    374             die "invalid permissions for author " . $author->id; 
     373        } elsif (@perm > 2) { 
     374            # Condition sometimes caused by saving preferences. BugId:79501 
     375            # Handle by merging permissions and removing all but one 
     376            # Not ideal, but better than dying... 
     377            my ($sys_perm) = grep { ! $_->blog_id } @perm; 
     378            my @blog_perms = grep { $_->blog_id } sort { $b->modified_on cmp $a->modified_on } @perm; 
     379 
     380            my $new_perm = shift @blog_perms; # take last one saved 
     381            if (@blog_perms) { 
     382                foreach my $more_perms (@blog_perms) { 
     383                    $new_perm->add_permissions($more_perms); 
     384                    $new_perm->add_restrictions($more_perms); 
     385                    $more_perms->remove; 
     386                } 
     387                # save merged permission record 
     388                $new_perm->save; 
     389            } 
     390            $new_perm->add_permissions($sys_perm); 
     391            $new_perm->add_restrictions($sys_perm); 
     392            $perm = $new_perm; 
     393            @perm = ($perm); 
    375394        } 
    376395    } else { 
  • branches/release-36/lib/MT/Permission.pm

    r1823 r2099  
    138138    } 
    139139 
     140    sub add_restrictions { 
     141        my $perms = shift; 
     142        my ($more_perm) = @_; 
     143        if ( my $more = $more_perm->restrictions ) { 
     144            if ( $more =~ /'administer_blog'/ ) { 
     145                $more = _all_perms('blog'); 
     146            } 
     147            my $cur_perm = $perms->restrictions; 
     148            my @newperms; 
     149            for my $p ( split ',', $more ) { 
     150                $p =~ s/'(.+)'/$1/; 
     151                next if $perms->has($p); 
     152                push @newperms, $p; 
     153            } 
     154            return unless @newperms; 
     155            my $newperm = "'" . join( "','", @newperms ) . "'"; 
     156            $newperm = "$cur_perm,$newperm" if $cur_perm; 
     157            $perms->restrictions($newperm); 
     158        } 
     159    } 
     160 
    140161    # Sets permissions of those in a particular set 
    141162    sub set_full_permissions {