New LDAP UI

Signed-off-by: Sebastien Goasguen <runseb@gmail.com>
This commit is contained in:
Ian Duffy 2013-07-29 05:58:00 -04:00 committed by Sebastien Goasguen
parent eaa4143371
commit ec064b3077
7 changed files with 603 additions and 134 deletions

View File

@ -17,3 +17,266 @@ givenName: Ryan
mail: rmurphy@cloudstack.org
uid: rmurphy
userpassword:: cGFzc3dvcmQ=
dn: cn=Barbara Brewer,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Barbara Brewer
sn: Brewer
mail: bbrewer@cloudstack.org
uid: bbrewer
userpassword:: cGFzc3dvcmQ=
dn: cn=Zak Wilkinson,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Zak Wilkinson
givenname: Zak
sn: Wilkinson
uid: zwilkinson
userpassword:: cGFzc3dvcmQ=
dn: cn=Archie Shingleton,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Archie Shingleton
sn: Shingleton
givenName: Archie
mail: ashingleton@cloudstack.org
uid: ashingleton
userpassword:: cGFzc3dvcmQ=
dn: cn=Cletus Pears,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Cletus Pears
sn: Pears
givenName: Cletus
mail: cpears@cloudstack.org
uid: cpears
userpassword:: cGFzc3dvcmQ=
dn: cn=Teisha Milewski,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Teisha Milewski
sn: Milewski
givenName: Teisha
mail: tmilewski@cloudstack.org
uid: tmilewski
userpassword:: cGFzc3dvcmQ=
dn: cn=Eloy Para,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Eloy Para
sn: Para
givenName: Eloy
mail: epara@cloudstack.org
uid: epara
userpassword:: cGFzc3dvcmQ=
dn: cn=Elaine Lamb,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Elaine Lamb
sn: Lamb
givenName: Elaine
mail: elamb@cloudstack.org
uid: elamb
userpassword:: cGFzc3dvcmQ=
dn: cn=Soon Griffen,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Soon Griffen
sn: Griffen
givenName: Soon
mail: sgriffen@cloudstack.org
uid: sgriffen
userpassword:: cGFzc3dvcmQ=
dn: cn=Tran Neisler,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Tran Neisler
sn: Neisler
givenName: Tran
mail: tneisler@cloudstack.org
uid: tneisler
userpassword:: cGFzc3dvcmQ=
dn: cn=Mirella Zeck,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Mirella Zeck
sn: Zeck
givenName: Mirella
mail: mzeck@cloudstack.org
uid: mzeck
userpassword:: cGFzc3dvcmQ=
dn: cn=Greg Hoskin,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Greg Hoskin
sn: Hoskin
givenName: Greg
mail: ghoskin@cloudstack.org
uid: ghoskin
userpassword:: cGFzc3dvcmQ=
dn: cn=Johanne Runyon,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Johanne Runyon
sn: Runyon
givenName: Johanne
mail: jrunyon@cloudstack.org
uid: jrunyon
userpassword:: cGFzc3dvcmQ=
dn: cn=Mabelle Waiters,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Mabelle Waiters
sn: Waiters
givenName: Mabelle
mail: mwaiters@cloudstack.org
uid: mwaiters
userpassword:: cGFzc3dvcmQ=
dn: cn=Phillip Fruge,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Phillip Fruge
sn: Fruge
givenName: Phillip
mail: pfruge@cloudstack.org
uid: pfruge
userpassword:: cGFzc3dvcmQ=
dn: cn=Jayna Ridenhour,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Jayna Ridenhour
sn: Ridenhour
givenName: Jayna
mail: jridenhour@cloudstack.org
uid: jridenhour
userpassword:: cGFzc3dvcmQ=
dn: cn=Marlyn Mandujano,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Marlyn Mandujano
sn: Mandujano
givenName: Marlyn
mail: mmandujano@cloudstack.org
uid: mmandujano
userpassword:: cGFzc3dvcmQ=
dn: cn=Shaunna Scherer,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Shaunna Scherer
sn: Scherer
givenName: Shaunna
mail: sscherer@cloudstack.org
uid: sscherer
userpassword:: cGFzc3dvcmQ=
dn: cn=Adriana Bozek,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Adriana Bozek
sn: Bozek
givenName: Adriana
mail: abozek@cloudstack.org
uid: abozek
userpassword:: cGFzc3dvcmQ=
dn: cn=Silvana Chipman,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Silvana Chipman
sn: Chipman
givenName: Silvana
mail: schipman@cloudstack.org
uid: schipman
userpassword:: cGFzc3dvcmQ=
dn: cn=Marion Wasden,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Marion Wasden
sn: Wasden
givenName: Marion
mail: mwasden@cloudstack.org
uid: mwasden
userpassword:: cGFzc3dvcmQ=
dn: cn=Anisa Casson,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Anisa Casson
sn: Casson
givenName: Anisa
mail: acasson@cloudstack.org
uid: acasson
userpassword:: cGFzc3dvcmQ=
dn: cn=Cammy Petri,dc=cloudstack,dc=org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Cammy Petri
sn: Petri
givenName: Cammy
mail: cpetri@cloudstack.org
uid: cpetri
userpassword:: cGFzc3dvcmQ=

View File

@ -12268,84 +12268,97 @@ div.ui-dialog div.autoscaler div.field-group div.form-container form div.form-it
}
.accounts-wizard table {
margin: 0;
width: 100%;
table-layout: fixed;
margin: 0;
width: 100%;
table-layout: fixed;
}
.accounts-wizard .ui-button {
display: inline-block !important;
float: none !important;
}
.accounts-wizard td:last-child {
border: none;
border: none;
}
.accounts-wizard tbody tr:nth-child(even) {
background: #DFE1E3;
background: #DFE1E3;
}
.accounts-wizard tbody tr:nth-child(odd) {
background: #F2F0F0;
background: #F2F0F0;
}
.accounts-wizard .content {
display: inline-block;
display: inline-block;
}
.accounts-wizard .content:last-child {
margin-left: 14px;
margin-left: 14px;
}
.accounts-wizard .select-container {
overflow: auto;
.accounts-wizard .input-area {
width: 320px;
font-size: 13px;
color: #485867;
text-shadow: 0px 2px 1px #FFFFFF;
}
.accounts-wizard .input-area{
width: 320px;
font-size: 15px;
color: #485867;
text-shadow: 0px 2px 1px #FFFFFF;
}
.ldap-account-choice {
border: none !important;
border-radius: 0 0 0 0 !important;
border: none !important;
border-radius: 0 0 0 0 !important;
}
.manual-account-details .name {
margin-top: 2px;
width: 100px;
float: left;
padding-bottom:10px;
margin-top: 2px;
width: 100px;
float: left;
padding-bottom:10px;
}
.manual-account-details {
height: auto !important;
overflow: visible !important;
overflow-x: visible !important;
}
.manual-account-details label.error {
display: block;
font-size: 10px;
}
.manual-account-details .value {
float: left;
float: left;
}
.manual-account-details .form-item:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
content:".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
.manual-account-details .form-item {
padding: 10px;
width: 278px;
padding: 5px;
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.manual-account-details select, .manual-account-details input {
width: 150px;
width: 150px;
}
.manual-account-details input {
background: #F6F6F6;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
border-radius: 4px 4px 4px 4px;
border: 1px solid #AFAFAF;
-moz-box-shadow: inset 0px 1px #727272;
-webkit-box-shadow: inset 0px 1px #727272;
-o-box-shadow: inset 0px 1px #727272;
box-shadow: inset 0px 1px #727272;
-moz-box-shadow: inset 0px 1px 0px #727272;
-webkit-box-shadow: inset 0px 1px 0px #727272;
-o-box-shadow: inset 0px 1px 0px #727272;
}
.manual-account-details > *:nth-child(even) {
background: #DFE1E3;
background: #DFE1E3;
}
.manual-account-details > *:nth-child(odd) {
background: #F2F0F0;
background: #F2F0F0;
}
.manual-account-details .value {
display: inline-block;
display: inline-block;
}

View File

@ -473,8 +473,8 @@ under the License.
<div class="multi-wizard accounts-wizard">
<form>
<div class="steps">
<div class="content">
<div class="select-container ldap-account-choice">
<div class="content ldap-account-choice">
<div class="select-container">
<table>
<thead>
<tr>
@ -496,8 +496,8 @@ under the License.
</div>
</form>
<div class="buttons">
<div class="button cancel"><span><fmt:message key="label.cancel"/></span></div>
<div class="button next"><span><fmt:message key="label.add"/></span></div>
<button class="cancel ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span><fmt:message key="label.cancel"/></span></button>
<button class="next ok ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span><fmt:message key="label.add"/></span></button>
</div>
</div>
<!-- Zone wizard -->

View File

@ -18,7 +18,57 @@
(function(cloudStack, $) {
cloudStack.accountsWizard = {
manuallyInputtedAccountInformation: {
informationWithinLdap: {
username: {
label: 'label.username',
validation: {
required: true
},
docID: 'helpAccountUsername'
},
password: {
label: 'label.password',
validation: {
required: true
},
isPassword: true,
id: 'password',
docID: 'helpAccountPassword'
},
'password-confirm': {
label: 'label.confirm.password',
validation: {
required: true,
equalTo: '#password'
},
isPassword: true,
docID: 'helpAccountConfirmPassword'
},
email: {
label: 'label.email',
validation: {
required: true,
email: true
},
docID: 'helpAccountEmail'
},
firstname: {
label: 'label.first.name',
validation: {
required: true
},
docID: 'helpAccountFirstName'
},
lastname: {
label: 'label.last.name',
validation: {
required: true
},
docID: 'helpAccountLastName'
}
},
informationNotInLdap: {
domainid: {
label: 'label.domain',
docID: 'helpAccountDomain',
@ -48,7 +98,7 @@
description: this.path
});
if (this.level == 0)
if (this.level === 0)
rootDomainId = this.id;
});
args.response.success({
@ -62,8 +112,8 @@
label: 'label.account',
docID: 'helpAccountAccount',
validation: {
required: true
},
required: false
}
},
accounttype: {
label: 'label.type',
@ -116,43 +166,123 @@
action: function(args) {
var array1 = [];
var ldapStatus = isLdapEnabled();
console.log("creating user: " + args.username);
array1.push("&username=" + args.username);
if (!ldapStatus) {
var password = args.data.password;
if (md5Hashed) {
password = $.md5(password);
}
array1.push("&email=" + args.data.email);
array1.push("&firstname=" + args.data.firstname);
array1.push("&lastname=" + args.data.lastname);
var password = args.data.password;
if (md5Hashed) {
password = $.md5(password);
}
array1.push("&password=" + password);
}
array1.push("&username=" + args.data.username);
array1.push("&domainid=" + args.data.domainid);
if (args.data.account != null && args.data.account.length != 0) {
array1.push("&account=" + args.data.account);
var account = args.data.account;
if (account === null || account.length === 0) {
account = args.username;
}
array1.push("&account=" + account);
if (args.data.accounttype == "1" && args.data.domainid != rootDomainId) {
args.data.accounttype = "2";
var accountType = args.data.accounttype;
if (args.data.accounttype == "1" && args.data.domainid != rootDomainId) { //if account type is admin, but domain is not Root domain
accountType = "2"; // Change accounttype from root-domain("1") to domain-admin("2")
}
array1.push("&accountType=" + args.data.accounttype);
array1.push("&accounttype=" + accountType);
if (args.data.timezone != null && args.data.timezone.length != 0) {
if (args.data.timezone !== null && args.data.timezone.length > 0) {
array1.push("&timezone=" + args.data.timezone);
}
if (args.data.networkdomain != null && args.data.networkdomain != 0) {
array1.push("&networkDomain=" + args.data.networkdomain);
if (args.data.networkdomain !== null && args.data.networkdomain.length > 0) {
array1.push("&networkdomain=" + args.data.networkdomain);
}
console.log(array1.join(""));
console.log(args.data);
$.ajax({
url: createURL("ldapCreateAccount" + array1.join("")),
dataType: "json",
success: function(json) {
var item = json.createaccountresponse.account;
args.response.success({
data: item
});
},
error: function(XMLHttpResponse) {
args.response.error(parseXMLHttpResponse(XMLHttpResponse));
}
});
if (ldapStatus) {
console.log("doing an ldap add");
$.ajax({
url: createURL('ldapCreateAccount' + array1.join("")),
dataType: "json",
async: false,
success: function(json) {
var item = json.createaccountresponse.account;
args.response.success({
data: item
});
},
error: function(XMLHttpResponse) {
args.response.error(parseXMLHttpResponse(XMLHttpResponse));
}
});
} else {
console.log("doing normal user add");
$.ajax({
url: createURL('createAccount' + array1.join("")),
dataType: "json",
async: false,
success: function(json) {
var item = json.createaccountresponse.account;
args.response.success({
data: item
});
},
error: function(XMLHttpResponse) {
args.response.error(parseXMLHttpResponse(XMLHttpResponse));
}
});
}
}
}
/*
action: function(args) {
var array1 = [];
var username = args.data.username;
array1.push("&domainid=" + args.data.domainid);
if (args.data.account != null && args.data.account.length != 0) {
array1.push("&account=" + args.data.account);
}
if (args.data.accounttype == "1" && args.data.domainid != rootDomainId) {
args.data.accounttype = "2";
}
array1.push("&accountType=" + args.data.accounttype);
if (args.data.timezone != null && args.data.timezone.length != 0) {
array1.push("&timezone=" + args.data.timezone);
}
if (args.data.networkdomain != null && args.data.networkdomain != 0) {
array1.push("&networkDomain=" + args.data.networkdomain);
}
for (var i = 0; i < username.length; i++) {
$.ajax({
url: createURL("ldapCreateAccount&username=" + username[i] + array1.join("")),
dataType: "json",
async: false,
success: function(json) {
var item = json.createaccountresponse.account;
args.response.success({
data: item
});
},
error: function(XMLHttpResponse) {
args.response.error(parseXMLHttpResponse(XMLHttpResponse));
}
});
}
}
*/
};
}(cloudStack, jQuery));

View File

@ -699,6 +699,22 @@ var addGuestNetworkDialog = {
}
function isLdapEnabled() {
var result;
$.ajax({
url: createURL("listLdapConfigurations"),
dataType: "json",
async: false,
success: function(json) {
result = (json.ldapconfigurationresponse.count > 0);
},
error: function(json) {
result = false;
}
});
return result;
}
// Role Functions
function isAdmin() {

View File

@ -19,7 +19,7 @@
cloudStack.uiCustom.accountsWizard = function(args) {
return function(listViewArgs) {
var context = listViewArgs.context;
var ldapStatus = isLdapEnabled();
var accountsWizard = function(data) {
var $wizard = $('#template').find('div.accounts-wizard').clone();
var $form = $wizard.find('form');
@ -33,82 +33,129 @@
var completeAction = function() {
var data = cloudStack.serializeForm($form);
args.action({
context: context,
data: data,
response: {
success: function(args) {
$('.list-view').listView('refresh');
close();
},
error: function(message) {
close();
if(message) {
cloudStack.dialog.notice({
message: message
});
var username = data.username;
var bulkAdd = (username instanceof Array);
if (bulkAdd) {
console.log("doing bulk add");
for (var i = 0; i < username.length; i++) {
console.log("creating user " + username[i]);
args.action({
context: context,
data: data,
username: username[i],
response: {
error: function(message) {
if (message) {
cloudStack.dialog.notice({
message: message
});
}
}
}
});
}
} else {
args.action({
context: context,
data: data,
username: username,
response: {
error: function(message) {
if (message) {
cloudStack.dialog.notice({
message: message
});
}
}
}
}
});
}
});
}
};
$wizard.click(function(event) {
var $target = $(event.target);
if ($target.closest('div.button.next').size()) {
if ($target.closest('button.next').size()) {
$form.validate();
if ($form.valid()) {
completeAction();
$(window).trigger('cloudStack.fullRefresh');
close();
return true;
} else {
return false;
}
}
if ($target.closest('div.button.cancel').size()) {
if ($target.closest('button.cancel').size()) {
close();
return false;
}
});
var form = cloudStack.dialog.createForm({
if (ldapStatus) {
var $table = $wizard.find('.ldap-account-choice tbody');
$.ajax({
url: createURL("listAllLdapUsers"),
dataType: "json",
async: false,
success: function(json) {
$(json.ldapuserresponse.LdapUser).each(function() {
var result = $("<tr>");
result.append("<td><input type=\"checkbox\" class=\"required\" name=\"username\" value=\"" + this.username + "\"></td>");
result.append("<td>" + this.firstname + " " + this.lastname + "</td>");
result.append("<td>" + this.username + "</td>");
result.append("<td>" + this.email + "</td>");
$table.append(result);
});
}
});
} else {
var informationWithinLdap = cloudStack.dialog.createForm({
context: context,
noDialog: true,
form: {
title: '',
fields: args.informationWithinLdap
}
});
//console.log(informationWithinLdap.$formContainer);
var informationWithinLdapForm = informationWithinLdap.$formContainer.find('form .form-item');
informationWithinLdapForm.find('.value #label_username').addClass('required');
informationWithinLdapForm.find('.value #password').addClass('required');
informationWithinLdapForm.find('.value #label_confirm_password').addClass('required');
informationWithinLdapForm.find('.value #label_confirm_password').attr('equalTo', '#password');
informationWithinLdapForm.find('.value #label_email').addClass('required');
informationWithinLdapForm.find('.value #label_first_name').addClass('required');
informationWithinLdapForm.find('.value #label_last_name').addClass('required');
$wizard.find('.manual-account-details').append(informationWithinLdapForm).children().css('background', 'none');
$wizard.find('.ldap-account-choice').css('display', 'none');
$wizard.removeClass('multi-wizard');
}
var informationNotInLdap = cloudStack.dialog.createForm({
context: context,
noDialog: true,
form: {
title: '',
fields: args.manuallyInputtedAccountInformation
fields: args.informationNotInLdap
}
});
var $manualDetails = form.$formContainer.find('form .form-item');
$wizard.find('.manual-account-details').append($manualDetails);
var $table = $wizard.find('.ldap-account-choice tbody');
$.ajax({
url: createURL("listAllLdapUsers"),
dataType: "json",
async: false,
success: function(json) {
$(json.ldapuserresponse.LdapUser).each(function() {
var result = $("<tr>");
result.append("<td><input type=\"radio\" class=\"required\" name=\"username\" value=\"" + this.username + "\"></td>");
result.append("<td>" + this.firstname + " " + this.lastname + "</td>");
result.append("<td>" + this.username + "</td>");
result.append("<td>" + this.email + "</td>");
$table.append(result);
})
}
});
var informationNotInLdapForm = informationNotInLdap.$formContainer.find('form .form-item');
informationNotInLdapForm.find('.value #label_domain').addClass('required');
informationNotInLdapForm.find('.value #label_type').addClass('required');
if (!ldapStatus) {
informationNotInLdapForm.css('background', 'none');
}
$wizard.find('.manual-account-details').append(informationNotInLdapForm);
return $wizard.dialog({
title: _l('label.add.account'),
width: 800,
height: 500,
width: ldapStatus ? 800 : 330,
height: ldapStatus ? 500 : 500,
closeOnEscape: false,
zIndex: 5000
}).closest('.ui-dialog').overlay();
}
};
accountsWizard(args);
};