You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by mi...@apache.org on 2017/06/05 15:02:46 UTC
[05/14] incubator-trafficcontrol git commit: Adding user create API
Adding user create API
Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/5098aba8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/5098aba8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/5098aba8
Branch: refs/heads/master
Commit: 5098aba8653fe031657e514dd0198b1f4e1dec38
Parents: bae1863
Author: nir-sopher <ni...@gmail.com>
Authored: Wed Mar 15 16:49:11 2017 +0200
Committer: Jeremy Mitchell <mi...@gmail.com>
Committed: Mon Jun 5 09:01:58 2017 -0600
----------------------------------------------------------------------
traffic_ops/app/lib/API/User.pm | 110 +++++++++++++++++++++++++++
traffic_ops/app/lib/TrafficOpsRoutes.pm | 1 +
traffic_ops/app/t/api/1.2/user_admin.t | 96 +++++++++++++++++++++++
3 files changed, 207 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/5098aba8/traffic_ops/app/lib/API/User.pm
----------------------------------------------------------------------
diff --git a/traffic_ops/app/lib/API/User.pm b/traffic_ops/app/lib/API/User.pm
index 5e52d0f..c29d5f3 100644
--- a/traffic_ops/app/lib/API/User.pm
+++ b/traffic_ops/app/lib/API/User.pm
@@ -228,6 +228,116 @@ sub update {
}
+# Create
+sub create {
+ my $self = shift;
+ my $params = $self->req->json;
+
+ if ( !&is_oper($self) ) {
+ return $self->forbidden();
+ }
+
+ my $name = $params->{username};
+ if ( !defined($name) ) {
+ return $self->alert("Username is required.");
+ }
+
+ my $existing = $self->db->resultset('TmUser')->search( { username => $name } )->single();
+ if ($existing) {
+ return $self->alert("A user with username \"$name\" already exists.");
+ }
+
+
+ if ( !defined($params->{fullName}) ) {
+ return $self->alert("full-name is required.");
+ }
+
+ if ( !defined($params->{email}) ) {
+ return $self->alert("email is required.");
+ }
+
+ if ( !defined($params->{localPassword}) ) {
+ return $self->alert("local-password is required.");
+ }
+
+ if ( !defined($params->{confirmLocalPassword}) ) {
+ return $self->alert("confirm-local-password is required.");
+ }
+
+ if ($params->{localPassword} ne $params->{confirmLocalPassword}){
+ return $self->alert("local-password and confirmed-local-password mismatch.");
+ }
+
+ if ( !defined($params->{role}) ) {
+ return $self->alert("role is required.");
+ }
+
+ my $values = {
+ address_line1 => defined_or_default($params->{addressLine1}, ""),
+ address_line2 => defined_or_default($params->{addressLine2}, ""),
+ city => defined_or_default($params->{city}, ""),
+ company => defined_or_default($params->{company}, ""),
+ country => defined_or_default($params->{country}, ""),
+ email => $params->{email},
+ full_name => $params->{fullName},
+ new_user => ( $params->{newUser} ) ? 1 : 0,
+ phone_number => defined_or_default($params->{phoneNumber}, ""),
+ postal_code => defined_or_default($params->{postalCode}, ""),
+ public_ssh_key => defined_or_default($params->{publicSshKey}, ""),
+ registration_sent => defined_or_default( $params->{registrationSent}, undef),
+ role => $params->{role},
+ state_or_province => defined_or_default($params->{stateOrProvince}, ""),
+ username => $params->{username},
+ new_user => defined_or_default($params->{newUser}, 0),
+ uid => defined_or_default($params->{uid}, 0),
+ gid => defined_or_default($params->{gid}, 0),
+ local_passwd => sha1_hex($params->{localPassword} ),
+ confirm_local_passwd => sha1_hex($params->{confirmLocalPassword} ),
+
+ };
+
+ my ( $is_valid, $result ) = $self->is_valid($values);
+
+ if ( !$is_valid ) {
+ return $self->alert($result);
+ }
+
+ my $insert = $self->db->resultset('TmUser')->create($values);
+ my $rs = $insert->insert();
+
+ if ($rs) {
+ my $response;
+ $response->{addressLine1} = $rs->address_line1;
+ $response->{addressLine2} = $rs->address_line2;
+ $response->{city} = $rs->city;
+ $response->{company} = $rs->company;
+ $response->{country} = $rs->country;
+ $response->{email} = $rs->email;
+ $response->{fullName} = $rs->full_name;
+ $response->{gid} = $rs->gid;
+ $response->{id} = $rs->id;
+ $response->{lastUpdated} = $rs->last_updated;
+ $response->{newUser} = \$rs->new_user;
+ $response->{phoneNumber} = $rs->phone_number;
+ $response->{postalCode} = $rs->postal_code;
+ $response->{publicSshKey} = $rs->public_ssh_key;
+ $response->{registrationSent} = \$rs->registration_sent;
+ $response->{role} = $rs->role->id;
+ $response->{roleName} = $rs->role->name;
+ $response->{stateOrProvince} = $rs->state_or_province;
+ $response->{uid} = $rs->uid;
+ $response->{username} = $rs->username;
+
+ &log( $self, "Adding User with username '" . $rs->username . "' for id: " . $rs->id, "APICHANGE" );
+
+ return $self->success( $response, "User creation was successful." );
+ }
+ else {
+ return $self->alert("User creation failed.");
+ }
+}
+
+
# Reset the User Profile password
sub reset_password {
my $self = shift;
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/5098aba8/traffic_ops/app/lib/TrafficOpsRoutes.pm
----------------------------------------------------------------------
diff --git a/traffic_ops/app/lib/TrafficOpsRoutes.pm b/traffic_ops/app/lib/TrafficOpsRoutes.pm
index ed65fef..b4da30e 100644
--- a/traffic_ops/app/lib/TrafficOpsRoutes.pm
+++ b/traffic_ops/app/lib/TrafficOpsRoutes.pm
@@ -776,6 +776,7 @@ sub api_routes {
$r->get("/api/$version/users")->over( authenticated => 1 )->to( 'User#index', namespace => $namespace );
$r->get( "/api/$version/users/:id" => [ id => qr/\d+/ ] )->over( authenticated => 1 )->to( 'User#show', namespace => $namespace );
$r->put("/api/$version/users/:id" => [ id => qr/\d+/ ] )->over( authenticated => 1 )->to( 'User#update', namespace => $namespace );
+ $r->post("/api/$version/users")->over( authenticated => 1 )->to( 'User#create', namespace => $namespace );
# -- USERS: CURRENT USER
$r->get("/api/$version/user/current")->over( authenticated => 1 )->to( 'User#current', namespace => $namespace );
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/5098aba8/traffic_ops/app/t/api/1.2/user_admin.t
----------------------------------------------------------------------
diff --git a/traffic_ops/app/t/api/1.2/user_admin.t b/traffic_ops/app/t/api/1.2/user_admin.t
new file mode 100644
index 0000000..cac6222
--- /dev/null
+++ b/traffic_ops/app/t/api/1.2/user_admin.t
@@ -0,0 +1,96 @@
+package main;
+#
+#
+# Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+use Mojo::Base -strict;
+use Test::More;
+use Test::Mojo;
+use DBI;
+use Data::Dumper;
+use strict;
+use warnings;
+use Schema;
+use Test::TestHelper;
+use Fixtures::TmUser;
+use Fixtures::Deliveryservice;
+use Digest::SHA1 qw(sha1_hex);
+use Data::Dumper;
+
+#no_transactions=>1 ==> keep fixtures after every execution, beware of duplicate data!
+#no_transactions=>0 ==> delete fixtures after every execution
+
+BEGIN { $ENV{MOJO_MODE} = "test" }
+
+sub run_ut {
+ my $t = shift;
+ my $schema = shift;
+ my $login_user = shift;
+ my $login_password = shift;
+
+ Test::TestHelper->unload_core_data($schema);
+ Test::TestHelper->teardown( $schema, 'Log' );
+ Test::TestHelper->teardown( $schema, 'Role' );
+ Test::TestHelper->teardown( $schema, 'TmUser' );
+
+ Test::TestHelper->load_core_data($schema);
+
+ # Verify the user
+ ok my $user = $schema->resultset('TmUser')->find( { username => $login_user } ), 'Does the portal user exist?';
+
+ ok $t->post_ok( '/login', => form => { u => $login_user, p => $login_password} )->status_is(302);
+
+ #adding a user
+ my $addedUserName = "user1";
+ my $addedUserEmail = "abc\@z.com";
+
+ ok $t->post_ok('/api/1.2/users' => {Accept => 'application/json'} => json => {
+ "username" => $addedUserName, "fullName"=>"full name", "email" => $addedUserEmail, "localPassword" => "pass", "confirmLocalPassword"=> "pass", "role" => 4 })
+ ->status_is(200)->or( sub { diag $t->tx->res->content->asset->{content}; } )
+ ->json_is( "/response/username" => $addedUserName )
+ ->json_is( "/response/email" => $addedUserEmail)
+ , 'Failed adding user?';
+
+ #same name again - fail
+ ok $t->post_ok('/api/1.2/users' => {Accept => 'application/json'} => json => {
+ "username" => $addedUserName, "fullName"=>"full name1", "email" => "xy\@z.com", "localPassword" => "pass", "confirmLocalPassword"=> "pass", "role" => 4 })
+ ->status_is(400)->or( sub { diag $t->tx->res->content->asset->{content}; } )
+ , 'Success same user...';
+
+ #bad email - fail
+ ok $t->post_ok('/api/1.2/users' => {Accept => 'application/json'} => json => {
+ "username" => "user2", "fullName"=>"full name2", "email" => "xy", "localPassword" => "pass", "confirmLocalPassword"=> "pass", "role" => 4 })
+ ->status_is(400)->or( sub { diag $t->tx->res->content->asset->{content}; } )
+ , 'Success bad email...';
+
+ #adding same email again - fail
+ ok $t->post_ok('/api/1.2/users' => {Accept => 'application/json'} => json => {
+ "username" => "new-user", "fullName"=>"full name3", "email" => $addedUserEmail, "localPassword" => "pass", "confirmLocalPassword"=> "pass", "role`" => 4 })
+ ->status_is(400)->or( sub { diag $t->tx->res->content->asset->{content}; } )
+ , 'Success same email...';
+
+ my $userid = $schema->resultset('TmUser')->find( { username => $addedUserName } )->id, 'Does the portal user exist?';
+
+ ok $t->get_ok('/logout')->status_is(302)->or( sub { diag $t->tx->res->content->asset->{content}; } );
+}
+
+my $schema = Schema->connect_to_database;
+my $dbh = Schema->database_handle;
+my $t = Test::Mojo->new('TrafficOps');
+
+run_ut($t, $schema, Test::TestHelper::ADMIN_USER, Test::TestHelper::ADMIN_USER_PASSWORD);
+
+$dbh->disconnect();
+done_testing();
+
+