313 lines
8.9 KiB
Perl
313 lines
8.9 KiB
Perl
# -*- Mode: perl; tab-width: 4; indent-tabs-mode: nil; -*-
|
|
#
|
|
# This file is MPL/GPL dual-licensed under the following terms:
|
|
#
|
|
# The contents of this file are subject to the Mozilla Public License
|
|
# Version 1.1 (the "License"); you may not use this file except in
|
|
# compliance with the License. You may obtain a copy of the License at
|
|
# http://www.mozilla.org/MPL/
|
|
#
|
|
# Software distributed under the License is distributed on an "AS IS"
|
|
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
|
# the License for the specific language governing rights and
|
|
# limitations under the License.
|
|
#
|
|
# The Original Code is PLIF 1.0.
|
|
# The Initial Developer of the Original Code is Ian Hickson.
|
|
#
|
|
# Alternatively, the contents of this file may be used under the terms
|
|
# of the GNU General Public License Version 2 or later (the "GPL"), in
|
|
# which case the provisions of the GPL are applicable instead of those
|
|
# above. If you wish to allow use of your version of this file only
|
|
# under the terms of the GPL and not to allow others to use your
|
|
# version of this file under the MPL, indicate your decision by
|
|
# deleting the provisions above and replace them with the notice and
|
|
# other provisions required by the GPL. If you do not delete the
|
|
# provisions above, a recipient may use your version of this file
|
|
# under either the MPL or the GPL.
|
|
|
|
package PLIF::DataSource::User;
|
|
use strict;
|
|
use vars qw(@ISA);
|
|
use PLIF::DataSource;
|
|
@ISA = qw(PLIF::DataSource);
|
|
1;
|
|
|
|
sub provides {
|
|
my $class = shift;
|
|
my($service) = @_;
|
|
return ($service eq 'dataSource.user' or $service eq 'setup.install' or $class->SUPER::provides($service));
|
|
}
|
|
|
|
sub databaseName {
|
|
return 'default';
|
|
}
|
|
|
|
__DATA__
|
|
|
|
sub getUserByUsername {
|
|
my $self = shift;
|
|
my($app, $username) = @_;
|
|
# decent databases can do this in one go. Those that can't can do
|
|
# it in a generic two-step process:
|
|
my $userID = $self->getUserIDByUsername($app, $username);
|
|
if (defined($userID)) {
|
|
return $self->getUserByID($app, $userID);
|
|
} else {
|
|
return ();
|
|
}
|
|
# return the same as getUserByID()
|
|
}
|
|
|
|
sub getUserIDByUsername {
|
|
my $self = shift;
|
|
my($app, $username) = @_;
|
|
$self->notImplemented();
|
|
# return userID or undef
|
|
}
|
|
|
|
sub getUserByContactDetails {
|
|
my $self = shift;
|
|
my($app, $contactName, $address) = @_;
|
|
# decent databases can do this in one go. Those that can't can do
|
|
# it in a generic two-step process:
|
|
my $userID = $self->getUserIDByContactDetails($app, $contactName, $address);
|
|
if (defined($userID)) {
|
|
return $self->getUserByID($app, $userID);
|
|
} else {
|
|
return ();
|
|
}
|
|
# return the same as getUserByID()
|
|
}
|
|
|
|
sub getUserIDByContactDetails {
|
|
my $self = shift;
|
|
my($app, $contactName, $address) = @_;
|
|
$self->notImplemented();
|
|
# return userID or undef
|
|
}
|
|
|
|
sub getUserByID {
|
|
my $self = shift;
|
|
my($app, $id) = @_;
|
|
$self->notImplemented();
|
|
# return userID, disabled, password, adminMessage,
|
|
# [ fieldID, data ]*, [ groupID, name, level ]*, [rightNames]*
|
|
# or () if unsuccessful
|
|
}
|
|
|
|
sub setUser {
|
|
my $self = shift;
|
|
my($app, $userID, $disabled, $password, $adminMessage) = @_;
|
|
# if userID is undefined, then add a new entry and return the
|
|
# userID (so that it can be used in setUserField and
|
|
# setUserGroups, later).
|
|
$self->notImplemented();
|
|
}
|
|
|
|
sub setUserField {
|
|
my $self = shift;
|
|
my($app, $userID, $fieldID, $data) = @_;
|
|
$self->notImplemented();
|
|
}
|
|
|
|
sub removeUserField {
|
|
my $self = shift;
|
|
my($app, $userID, $fieldID) = @_;
|
|
$self->notImplemented();
|
|
}
|
|
|
|
sub setUserFieldChange {
|
|
my $self = shift;
|
|
my($app, $userID, $fieldID, $newData, $password, $type) = @_;
|
|
$self->notImplemented();
|
|
# return change ID
|
|
}
|
|
|
|
sub getUserFieldChangeFromChangeID {
|
|
my $self = shift;
|
|
my($app, $changeID) = @_;
|
|
$self->notImplemented();
|
|
# return [userID, fieldID, newData, password, createTime, type]
|
|
}
|
|
|
|
sub getUserFieldChangesFromUserIDAndFieldID {
|
|
my $self = shift;
|
|
my($app, $userID, $fieldID) = @_;
|
|
$self->notImplemented();
|
|
# return [changeID, newData, password, createTime, type]*
|
|
}
|
|
|
|
sub removeUserFieldChangeByChangeID {
|
|
my $self = shift;
|
|
my($changeID) = @_;
|
|
$self->notImplemented();
|
|
}
|
|
|
|
sub removeUserFieldChangesByUserIDAndFieldID {
|
|
my $self = shift;
|
|
my($app, $userID, $fieldID) = @_;
|
|
$self->notImplemented();
|
|
}
|
|
|
|
sub setUserGroups {
|
|
my $self = shift;
|
|
my($app, $userID, $groupIDs) = @_;
|
|
# $groupIDs is a hashref in the form { groupID => level }*
|
|
foreach my $groupID (keys(%$groupIDs)) {
|
|
$self->assert($groupIDs->{$groupID} > 0, 1, 'Invalid group membership level passed to setUserGroups');
|
|
}
|
|
$self->notImplemented();
|
|
}
|
|
|
|
sub addUserGroup {
|
|
my $self = shift;
|
|
my($app, $userID, $groupID, $level) = @_;
|
|
$self->assert($level > 0, 1, 'Invalid group membership level passed to addUserGroup');
|
|
$self->notImplemented();
|
|
}
|
|
|
|
sub removeUserGroup {
|
|
my $self = shift;
|
|
my($app, $userID, $groupID) = @_;
|
|
$self->notImplemented();
|
|
}
|
|
|
|
# returns the userDataTypes table, basically...
|
|
sub getFields {
|
|
my $self = shift;
|
|
my($app) = @_;
|
|
$self->notImplemented();
|
|
# return [type, fieldID, category, name, typeData]*
|
|
}
|
|
|
|
# returns the userDataTypes table in a nice way
|
|
# data sources for data bases where this can be efficiently extracted
|
|
# from the database can reimplement this method, but for the others
|
|
# here is a default implementation that simply recasts getFields().
|
|
sub getFieldsHierarchically {
|
|
my $self = shift;
|
|
my($app) = @_;
|
|
my $fields = {};
|
|
foreach my $field (@{$self->getFields($app)}) {
|
|
if (not defined($fields->{$field->[2]})) {
|
|
$fields->{$field->[2]} = { $field->[3] => { 'type' => $field->[0], 'fieldID' => $field->[1], 'typeData' => $field->[4], } };
|
|
} else {
|
|
$fields->{$field->[2]}->{$field->[3]} = { 'type' => $field->[0], 'fieldID' => $field->[1], 'typeData' => $field->[4], };
|
|
}
|
|
}
|
|
return $fields; # { category => { name => { 'type' => '', 'fieldID' => 0, 'typeData' => '', } } }
|
|
}
|
|
|
|
sub getFieldByID {
|
|
my $self = shift;
|
|
my($app, $fieldID) = @_;
|
|
$self->notImplemented();
|
|
# return [type, fieldID, category, name, typeData]
|
|
}
|
|
|
|
sub getFieldByName {
|
|
my $self = shift;
|
|
my($app, $category, $name) = @_;
|
|
$self->notImplemented();
|
|
# return [type, fieldID, category, name, typeData]
|
|
}
|
|
|
|
sub getFieldNamesByCategory {
|
|
my $self = shift;
|
|
my($app, $category) = @_;
|
|
$self->notImplemented();
|
|
# return [name, name, name, name ...]
|
|
}
|
|
|
|
sub getFieldsByCategory {
|
|
my $self = shift;
|
|
my($app, $category) = @_;
|
|
$self->notImplemented();
|
|
# return [type, fieldID, category, name, typeData]*
|
|
}
|
|
|
|
sub setField {
|
|
my $self = shift;
|
|
my($app, $fieldID, $category, $name, $type, $data) = @_;
|
|
# if fieldID is undefined, then add a new entry and return the
|
|
# fieldID. Typically data will be undefined then too.
|
|
$self->notImplemented();
|
|
# The caller should make sure that the relevant service
|
|
# ('user.field.$type.manager') is then notified
|
|
# ('fieldAdded($fieldID)') so that any additional database setup
|
|
# can be performed. If this was merely a change and not a new
|
|
# addition, then call fieldChanged($fieldID) instead. (It is a
|
|
# change if you pass $fieldID, and it is an addition if $fieldID
|
|
# is undefined.)
|
|
# returns the fieldID.
|
|
}
|
|
|
|
sub removeField {
|
|
my $self = shift;
|
|
my($app, $fieldID) = @_;
|
|
# The caller should make sure that the relevant service
|
|
# ('user.field.$type.manager') is notified
|
|
# ('fieldRemoved($fieldID)') so that any additional database
|
|
# cleanup can be performed.
|
|
$self->notImplemented();
|
|
}
|
|
|
|
sub getGroups {
|
|
my $self = shift;
|
|
my($app) = @_;
|
|
$self->notImplemented();
|
|
# return [groupID, name, [rightName]*]*
|
|
}
|
|
|
|
sub getGroupMembers {
|
|
my $self = shift;
|
|
my($app, $groupID) = @_;
|
|
$self->notImplemented();
|
|
# return [userID, level]*
|
|
}
|
|
|
|
sub getGroupName {
|
|
my $self = shift;
|
|
my($app, $groupID) = @_;
|
|
$self->notImplemented();
|
|
# return name
|
|
}
|
|
|
|
sub setGroup {
|
|
my $self = shift;
|
|
my($app, $groupID, $groupName, @rightNames) = @_;
|
|
# If groupID is undefined, then add a new entry and return the new
|
|
# groupID. If groupName is undefined, then leave it as is. If both
|
|
# groupID and groupName are undefined, there is an error.
|
|
$self->assert(defined($groupID) or defined($groupName), 1,
|
|
'Invalid arguments to DataSource::User::setGroup: \'groupID\' and \'groupName\' both undefined');
|
|
$self->notImplemented();
|
|
}
|
|
|
|
sub getRightsForGroups {
|
|
my $self = shift;
|
|
my($app, @groups) = @_;
|
|
$self->notImplemented();
|
|
# return [rightName]*
|
|
}
|
|
|
|
sub getAllRights {
|
|
my $self = shift;
|
|
my($app) = @_;
|
|
$self->notImplemented();
|
|
# return [rightName]*
|
|
}
|
|
|
|
sub addRight {
|
|
my $self = shift;
|
|
my($app, $name) = @_;
|
|
# only adds $name if it isn't there already
|
|
$self->notImplemented();
|
|
}
|
|
|
|
sub setupInstall {
|
|
my $self = shift;
|
|
$self->notImplemented();
|
|
}
|