Fix cases, add version number. (#4935)
[ab/samba.git/.git] / source4 / setup / setpassword
1 #!/bin/sh
2 exec smbscript "$0" ${1+"$@"}
3 /*
4         set a user's password on a Samba4 server
5         Copyright Andrew Tridgell 2005
6         Copyright Andrew Bartlett 2006
7         Released under the GNU GPL v2 or later
8 */
9
10 options = GetOptions(ARGV,
11                 "POPT_AUTOHELP",
12                 'username=s',
13                 'filter=s',
14                 'newpassword=s',
15                 "POPT_COMMON_SAMBA",
16                 "POPT_COMMON_VERSION",
17                 "POPT_COMMON_CREDENTIALS",
18                 'quiet');
19
20 if (options == undefined) {
21    println("Failed to parse options");
22    return -1;
23 }
24
25 libinclude("base.js");
26 libinclude("provision.js");
27
28 /*
29   print a message if quiet is not set
30 */
31 function message() 
32 {
33         if (options["quiet"] == undefined) {
34                 print(vsprintf(arguments));
35         }
36 }
37
38 /*
39  show some help
40 */
41 function ShowHelp()
42 {
43         print("
44 Samba4 newuser
45
46 newuser [options]
47   --username     USERNAME     username
48   --filter       LDAPFILTER   LDAP Filter to set password on
49   --newpassword  PASSWORD     set password
50
51 You must provide either a filter or a username, as well as password
52 ");
53         exit(1);
54 }
55
56 if (options['username'] == undefined && options['filter'] == undefined) {
57         ShowHelp();
58 }
59
60 if (options['newpassword'] == undefined) {
61         ShowHelp();
62 }
63
64         var lp = loadparm_init();
65         var samdb = lp.get("sam database");
66         var ldb = ldb_init();
67         random_init(local);
68         ldb.session_info = system_session();
69         ldb.credentials = options.get_credentials();
70
71         /* connect to the sam */
72         var ok = ldb.connect(samdb);
73         assert(ok);
74
75         ldb.transaction_start();
76
77 /* find the DNs for the domain and the domain users group */
78 var attrs = new Array("defaultNamingContext");
79 var attrs2 = new Array("cn");
80 res = ldb.search("defaultNamingContext=*", "", ldb.SCOPE_BASE, attrs);
81 assert(res.error == 0);
82 assert(res.msgs.length == 1 && res.msgs[0].defaultNamingContext != undefined);
83 var domain_dn = res.msgs[0].defaultNamingContext;
84 assert(domain_dn != undefined);
85
86 if (options['filter'] != undefined) {
87     var res = ldb.search(options['filter'],
88         domain_dn, ldb.SCOPE_SUBTREE, attrs2);
89     if (res.error != 0 || res.msgs.length != 1) {
90         message("Failed to find record for filter %s\n", options['filter']);
91         exit(1);
92     }
93 } else {
94     var res = ldb.search(sprintf("samAccountName=%s", options['username']), 
95     domain_dn, ldb.SCOPE_SUBTREE, attrs2);
96     if (res.error != 0 || res.msgs.length != 1) {
97         message("Failed to find record for user %s\n", options['username']);
98         exit(1);
99     }
100 }
101
102 var mod = sprintf("
103 dn: %s
104 changetype: modify
105 replace: sambaPassword
106 sambaPassword: %s
107 ",
108     res[0].dn, options['newpassword']);
109 var ok = ldb.modify(mod);
110 if (ok.error != 0) {
111         message("set password for %s failed - %s\n",
112             res[0].dn, ok.errstr);
113         ldb.transaction_cancel();
114         exit(1);
115 } else {
116         message("set password for %s (%s) succeded\n",
117             res[0].dn, res[0].cn);
118         
119         ldb.transaction_commit();
120 }
121
122
123 return 0;