summaryrefslogtreecommitdiff
path: root/rt/html/REST/1.0/Forms/user/default
blob: 6b216e072f642421ec8a228fc86d2ad8991ffd4f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
%# REST/1.0/Forms/user/default
%#
<%ARGS>
$id
$format => 's'
$changes => {}
</%ARGS>
<%perl>
my @comments;
my ($c, $o, $k, $e) = ("", [], {}, 0);
my %data = %$changes;
my $user = new RT::User $session{CurrentUser};
my @fields = qw(RealName NickName Gecos Organization Address1 Address2 City
                State Zip Country HomePhone WorkPhone MobilePhone PagerPhone
                FreeformContactInfo Comments Signature Lang EmailEncoding
                WebEncoding ExternalContactInfoId ContactInfoSystem
                ExternalAuthId AuthSystem);
my %fields = map { lc $_ => $_ } @fields;

if ($id ne 'new') {
    $user->Load($id);
    if (!$user->Id) {
        return [ "# User $id does not exist.", [], {}, 1 ];
    }
}
else {
    if (%data == 0) {
        return [
            "# Required: Name, EmailAddress",
            [ qw(id Name EmailAddress Organization Password Comments) ],
            {
                id => "user/new",
                Name => "",
                EmailAddress => "",
                Organization => "",
                Password => "",
                Comments => ""
            },
            0
        ];
    }
    else {
        my %v;
        my %create = %fields;
        $create{name}         = "Name";
        $create{password}     = "Password";
        $create{emailaddress} = "EmailAddress";
        $create{contactinfo}  = "FreeformContactInfo";
        # Do any fields need to be excluded here?

        foreach my $k (keys %data) {
            if (exists $create{lc $k}) {
                $v{$create{lc $k}} = delete $data{$k};
            }
        }

        $user->Create(%v);
        unless ($user->Id) {
            return [ "# Could not create user.", [], {}, 1 ];
        }

        $id = $user->Id;
        delete $data{id};
        push(@comments, "# User $id created.");
        goto DONE if %data == 0;
    }
}

if (%data == 0) {
    my @data;

    push @data, [ id => "user/".$user->Id ];
    push @data, [ Name => $user->Name ];
    push @data, [ Password => '********' ];
    push @data, [ EmailAddress => $user->EmailAddress ];

    foreach my $key (@fields) {
        my $val = $user->$key;

        if ($format eq 'l' || (defined $val && $val ne '')) {
            $key = "ContactInfo" if $key eq 'FreeformContactInfo';
            push @data, [ $key => $val ];
        }
    }

    my %k = map {@$_} @data;
    $o = [ map {$_->[0]} @data ];
    $k = \%k;
}
else {
    my ($get, $set, $key, $val, $n, $s);

    foreach $key (keys %data) {
        $val = $data{$key};
        $key = lc $key;
        $n = 1;

        if ($key eq 'name' || $key eq 'emailaddress' ||
            $key eq 'contactinfo' || exists $fields{$key})
        {
            if (exists $fields{$key}) {
                $key = $fields{$key};
            }
            else {
                $key = "FreeformContactInfo" if $key eq 'contactinfo';
                $key = "EmailAddress" if $key eq 'emailaddress';
                $key = "Name" if $key eq 'name';
            }
            $set = "Set$key";

            next if $val eq $user->$key;
            ($n, $s) = $user->$set($val);
        }
        elsif ($key eq 'password') {
            ($n, $s) = $user->SetPassword($val) unless $val =~ /^\**$/;
        }
        elsif ($key ne 'id') {
            $n = 0;
            $s = "Unknown field.";
        }

    SET:
        if ($n == 0) {
            $e = 1;
            push @comments, "# $key: $s";
            unless (@$o) {
                my %o = keys %$changes;
                delete @o{"id", @fields};
                @$o = ("id", @fields, keys %o);
                $k = $changes;
            }
        }
    }

    push(@comments, "# User $id updated.") unless $n == 0;
}

DONE:
$c ||= join("\n", @comments) if @comments;
return [ $c, $o, $k, $e ];
</%perl>