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();
+
+