Bivio::Biz::Model::AdmSubstituteUserForm
# Copyright (c) 1999-2001 bivio Software, Inc. All rights reserved.
# $Id$
package Bivio::Biz::Model::AdmSubstituteUserForm;
use strict;
use Bivio::Base 'Biz.FormModel';
use Bivio::IO::Trace;
our($_TRACE);
my($_LQ) = b_use('SQL.ListQuery');
my($_DEFAULT_TASK) = b_use('Agent.TaskId')->ADM_SUBSTITUTE_USER;
sub SUPER_USER_FIELD {
# : string
# Returns the cookie key for the super user value.
return 's';
}
sub can_substitute_user {
my($self, undef) = @_;
return $self->req->is_super_user;
}
sub execute_empty {
# (self) : undef
# Perform lookup and su automatically if coming in with query string.
my($self) = @_;
my($req) = $self->get_request;
my($this) = ($req->unsafe_get('query') || {})
->{$_LQ->to_char('this')};
return unless $this;
$self->internal_put_field(login => $this);
$req->put(query => {});
return $self->validate_and_execute_ok($self->OK_BUTTON_NAME);
}
sub execute_ok {
# (self) : boolean
# Logs in the I<realm_owner> and updates the cookie.
my($self) = @_;
# user is validated in internal_pre_execute
return $self->new_other('UserLoginForm')->substitute_user(
$self->get('realm_owner'),
$self->req,
$self,
);
}
sub internal_initialize {
# (self) : hash_ref;
# B<FOR INTERNAL USE ONLY>
my($self) = @_;
return $self->merge_initialize_info(
$self->SUPER::internal_initialize, {
version => 1,
require_validate => 1,
visible => [
{
name => 'login',
type => 'LoginName',
constraint => 'NOT_NULL',
},
],
other => [
{
name => 'realm_owner',
type => 'Model.RealmOwner',
constraint => 'NONE',
},
],
},
);
}
sub su_logout {
# (self, Agent.Request) : Agent.TaskId
# Logout as substitute user, return to super user.
# Return next task (if any).
my($self) = @_;
my($req) = $self->req;
my($su) = $req->get('super_user_id');
$req->delete('super_user_id');
$req->get('cookie')->delete($self->SUPER_USER_FIELD)
if $req->unsafe_get('cookie');
my($realm) = $self->new_other('RealmOwner');
$self->new_other('UserLoginForm')->process({
realm_owner => $realm->unauth_load({realm_id => $su})
? $realm : undef,
});
_trace($realm) if $_TRACE;
return $realm->is_loaded && $req->unsafe_get('task')
? $req->get('task')->unsafe_get_attr_as_id('su_task') || $_DEFAULT_TASK
: 0;
}
sub validate {
my($self) = @_;
$self->internal_put_field(realm_owner =>
$self->get_instance('UserLoginForm')->validate_login($self)
) unless $self->in_error;
return;
}
1;