#!/usr/bin/env python

# absAdduser.py
#
# c2007-2008 by Paul Sherman  http://www.pcbypaul.com
# This program is free software; you can redistribute it and/or	
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
# c2009 Adaptado e internacionalizado por:
# Miguel Anxo Bouzada para GALPon MiniNo
# http://minino.galpon.org
# 
#

import gettext  
APP="minino-AddUser"  
DIR="/usr/local/share/locale"
gettext.textdomain(APP)  
gettext.bindtextdomain(APP, DIR)
_ = gettext.gettext

#import wx
import pygtk
pygtk.require('2.0')
#import gtk, xdialog, sys, os, string, commands, crypt, gobject, re
import gtk, sys, os, string, commands, crypt, gobject, re

try:
	import pango
except:
	print >> sys.stderr, _("Cannot load Pango")
	raise SystemExit
	
adduser_xpm = [
"16 16 134 2",
"  	c None",
". 	c #8B5B08",
"+ 	c #9B6A18",
"@ 	c #A57629",
"# 	c #A87A33",
"$ 	c #9C6708",
"% 	c #89590A",
"& 	c #7F5101",
"* 	c #9A6911",
"= 	c #B78B38",
"- 	c #A57C46",
"; 	c #70481F",
"> 	c #9D6909",
", 	c #D3B276",
"' 	c #9E7B4A",
") 	c #724400",
"! 	c #916417",
"~ 	c #A98040",
"{ 	c #784E23",
"] 	c #714920",
"^ 	c #976A24",
"/ 	c #F5E0B6",
"( 	c #FCE8C8",
"_ 	c #B19265",
": 	c #845B20",
"< 	c #8C6225",
"[ 	c #6F4921",
"} 	c #855E30",
"| 	c #F7D3A1",
"1 	c #FFE2B3",
"2 	c #FFE9C3",
"3 	c #E4CBA1",
"4 	c #8A602D",
"5 	c #885D35",
"6 	c #F5CA90",
"7 	c #FFD091",
"8 	c #FFD59C",
"9 	c #F8D79C",
"0 	c #875D32",
"a 	c #C39565",
"b 	c #FFCA88",
"c 	c #FFCB86",
"d 	c #C09260",
"e 	c #4F4A7F",
"f 	c #D7AB82",
"g 	c #DEB580",
"h 	c #554D88",
"i 	c #135610",
"j 	c #4B8949",
"k 	c #589554",
"l 	c #497858",
"m 	c #9A9FBF",
"n 	c #CFD2DD",
"o 	c #D2D5DD",
"p 	c #C3C6DB",
"q 	c #767AB2",
"r 	c #6769A7",
"s 	c #205921",
"t 	c #7EE617",
"u 	c #80E720",
"v 	c #407444",
"w 	c #B3ACD0",
"x 	c #C2BDDF",
"y 	c #C5C5DC",
"z 	c #C7CBD8",
"A 	c #D5D8E1",
"B 	c #E7E9EC",
"C 	c #7576B0",
"D 	c #18621C",
"E 	c #1E6223",
"F 	c #316D37",
"G 	c #7AE512",
"H 	c #74DE20",
"I 	c #317234",
"J 	c #44784C",
"K 	c #417845",
"L 	c #9DB4A4",
"M 	c #DAD8E9",
"N 	c #D8D8E4",
"O 	c #D9DBE4",
"P 	c #B0B3C8",
"Q 	c #505492",
"R 	c #228122",
"S 	c #67DC10",
"T 	c #67DC0D",
"U 	c #6FE10C",
"V 	c #61D613",
"W 	c #5FD511",
"X 	c #5AD210",
"Y 	c #136F11",
"Z 	c #80B279",
"` 	c #EEE7FA",
" .	c #D8D8E5",
"..	c #B9BBCF",
"+.	c #999DB6",
"@.	c #595D98",
"#.	c #565996",
"$.	c #0B750B",
"%.	c #4EC804",
"&.	c #68DA04",
"*.	c #5DD302",
"=.	c #54CF00",
"-.	c #55C904",
";.	c #50C904",
">.	c #008500",
",.	c #7AAD77",
"'.	c #E0D7F5",
").	c #BFC1D7",
"!.	c #ACAFC8",
"~.	c #9EA2BC",
"{.	c #61649C",
"].	c #60639A",
"^.	c #125212",
"/.	c #114F13",
"(.	c #16521B",
"_.	c #59CA01",
":.	c #59D300",
"<.	c #1C5F19",
"[.	c #14442C",
"}.	c #163C42",
"|.	c #2A337A",
"1.	c #373690",
"2.	c #33348C",
"3.	c #32328B",
"4.	c #313189",
"5.	c #2B2B86",
"6.	c #125112",
"7.	c #6DD504",
"8.	c #82F102",
"9.	c #1B610E",
"0.	c #135312",
"a.	c #35800E",
"b.	c #3D8A0E",
"c.	c #226A0C",
"              . + @ #           ",
"            $ % & * = -         ",
"          ; > , ' ) ! ~ {       ",
"          ] ^ / ( _ : < [       ",
"            } | 1 2 3 4         ",
"            5 6 7 8 9 0         ",
"              a b c d           ",
"              e f g h           ",
"      i j k l m n o p q r       ",
"      s t u v w x y z A B C     ",
"  D E F G H I J K L M N O P Q   ",
"  R S T U V W X Y Z `  ...+.@.#.",
"  $.%.&.*.=.-.;.>.,.'.).!.~.{.].",
"  ^./.(._.:.<.[.}.|.1.2.3.4.5.  ",
"      6.7.8.9.                  ",
"      0.a.b.c.                  "
]


close_xpm = [
"32 32 365 2",
"  	c None",
". 	c #860000",
"+ 	c #730000",
"@ 	c #991414",
"# 	c #F38989",
"$ 	c #F79393",
"% 	c #F79292",
"& 	c #F79090",
"* 	c #F78F8F",
"= 	c #F68C8C",
"- 	c #F58888",
"; 	c #F27777",
"> 	c #9C0F0F",
", 	c #991515",
"' 	c #F18383",
") 	c #E76565",
"! 	c #D94040",
"~ 	c #D93F3F",
"{ 	c #D83E3E",
"] 	c #D83D3D",
"^ 	c #D83C3C",
"/ 	c #D73A3A",
"( 	c #DF4E4E",
"_ 	c #ED6666",
": 	c #9D0F0F",
"< 	c #790000",
"[ 	c #9B1616",
"} 	c #F18484",
"| 	c #E76666",
"1 	c #D94242",
"2 	c #D94141",
"3 	c #DE4D4D",
"4 	c #ED6565",
"5 	c #9E1010",
"6 	c #840000",
"7 	c #F28585",
"8 	c #E66565",
"9 	c #D94343",
"0 	c #DA4444",
"a 	c #DF4A4A",
"b 	c #EB5C5C",
"c 	c #8A0000",
"d 	c #9D1818",
"e 	c #DA4545",
"f 	c #D83B3B",
"g 	c #D73838",
"h 	c #DD4646",
"i 	c #EB5F5F",
"j 	c #9F1111",
"k 	c #890000",
"l 	c #9E1818",
"m 	c #E56363",
"n 	c #DA4646",
"o 	c #DA4747",
"p 	c #D53737",
"q 	c #DE4A4A",
"r 	c #ED6464",
"s 	c #9F1313",
"t 	c #A01919",
"u 	c #E56262",
"v 	c #E54B4B",
"w 	c #FA4F4F",
"x 	c #DD4848",
"y 	c #EB4444",
"z 	c #F64545",
"A 	c #D63A3A",
"B 	c #D53939",
"C 	c #D33737",
"D 	c #ED6A6A",
"E 	c #A51E1E",
"F 	c #8B0000",
"G 	c #A01A1A",
"H 	c #E45F5F",
"I 	c #E54A4A",
"J 	c #F96161",
"K 	c #EFA9A9",
"L 	c #F75454",
"M 	c #DC4747",
"N 	c #EA4646",
"O 	c #F56B6B",
"P 	c #F08E8E",
"Q 	c #F24747",
"R 	c #D43939",
"S 	c #D33838",
"T 	c #D23636",
"U 	c #DD4C4C",
"V 	c #EB6C6C",
"W 	c #A62020",
"X 	c #880000",
"Y 	c #F68E8E",
"Z 	c #E45D5D",
"` 	c #E54848",
" .	c #F85F5F",
"..	c #E6DBDB",
"+.	c #E5E5E5",
"@.	c #EEB2B2",
"#.	c #F75252",
"$.	c #DC4545",
"%.	c #EB4848",
"&.	c #F66C6C",
"*.	c #E5E1E1",
"=.	c #E4E4E4",
"-.	c #EF9292",
";.	c #F24848",
">.	c #D23737",
",.	c #CF3434",
"'.	c #DC4B4B",
").	c #F07373",
"!.	c #FC4848",
"~.	c #EEAAAA",
"{.	c #E6E6E6",
"].	c #E7E7E7",
"^.	c #EFB3B3",
"/.	c #DC4343",
"(.	c #EB4B4B",
"_.	c #F67171",
":.	c #E8E4E4",
"<.	c #E6D9D9",
"[.	c #FF4848",
"}.	c #DB3C3C",
"|.	c #D13838",
"1.	c #D03636",
"2.	c #CF3535",
"3.	c #CE3434",
"4.	c #EF6C6C",
"5.	c #F85353",
"6.	c #EEB6B6",
"7.	c #E8E8E8",
"8.	c #E9E9E9",
"9.	c #EAEAEA",
"0.	c #F0B7B7",
"a.	c #F75858",
"b.	c #EC4E4E",
"c.	c #F77777",
"d.	c #EBE7E7",
"e.	c #E9DDDD",
"f.	c #F86565",
"g.	c #DF4242",
"h.	c #D03737",
"i.	c #CF3636",
"j.	c #CE3535",
"k.	c #CD3333",
"l.	c #EF6969",
"m.	c #DB4343",
"n.	c #F85A5A",
"o.	c #F0BABA",
"p.	c #EBEBEB",
"q.	c #ECECEC",
"r.	c #F2BABA",
"s.	c #F97878",
"t.	c #ECE9E9",
"u.	c #ECE0E0",
"v.	c #F96C6C",
"w.	c #DF4646",
"x.	c #D13939",
"y.	c #D03838",
"z.	c #CF3737",
"A.	c #CD3434",
"B.	c #CC3333",
"C.	c #EE6767",
"D.	c #F79191",
"E.	c #DB4141",
"F.	c #F86161",
"G.	c #F2BFBF",
"H.	c #EDEDED",
"I.	c #EEEEEE",
"J.	c #EEE3E3",
"K.	c #F97272",
"L.	c #DF4949",
"M.	c #CE3636",
"N.	c #CD3535",
"O.	c #CC3434",
"P.	c #CB3232",
"Q.	c #EE6565",
"R.	c #F76868",
"S.	c #F4C0C0",
"T.	c #EFEFEF",
"U.	c #F0F0F0",
"V.	c #F0E7E7",
"W.	c #FA7979",
"X.	c #CC3131",
"Y.	c #CA2D2D",
"Z.	c #C82929",
"`.	c #C72828",
" +	c #ED5F5F",
".+	c #D73939",
"++	c #D83A3A",
"@+	c #ED5A5A",
"#+	c #FA8686",
"$+	c #F1F1F1",
"%+	c #F2F2F2",
"&+	c #F5CFCF",
"*+	c #FD7171",
"=+	c #D33939",
"-+	c #CB2424",
";+	c #C71616",
">+	c #C40B0B",
",+	c #C00202",
"'+	c #BF0000",
")+	c #BE0000",
"!+	c #BD0000",
"~+	c #BC0000",
"{+	c #E93D3D",
"]+	c #EA5B5B",
"^+	c #F99191",
"/+	c #F2EFEF",
"(+	c #F3F3F3",
"_+	c #F4F4F4",
":+	c #F45353",
"<+	c #C60505",
"[+	c #C10000",
"}+	c #C00000",
"|+	c #BA0000",
"1+	c #E93B3B",
"2+	c #F68D8D",
"3+	c #D73737",
"4+	c #EA5E5E",
"5+	c #F99595",
"6+	c #F3F0F0",
"7+	c #F5F5F5",
"8+	c #F6EEEE",
"9+	c #F7DDDD",
"0+	c #F3BFBF",
"a+	c #F45C5C",
"b+	c #C40606",
"c+	c #BB0000",
"d+	c #B90000",
"e+	c #E83939",
"f+	c #F68B8B",
"g+	c #D73535",
"h+	c #D73636",
"i+	c #F99A9A",
"j+	c #F7EFEF",
"k+	c #FA8181",
"l+	c #FD6767",
"m+	c #F8C7C7",
"n+	c #F3C3C3",
"o+	c #F36666",
"p+	c #C20707",
"q+	c #B80000",
"r+	c #E73838",
"s+	c #F68989",
"t+	c #D63434",
"u+	c #EB6363",
"v+	c #F89D9D",
"w+	c #F1EFEF",
"x+	c #F7EEEE",
"y+	c #F97F7F",
"z+	c #D62424",
"A+	c #C80707",
"B+	c #F56C6C",
"C+	c #F9CCCC",
"D+	c #F2C6C6",
"E+	c #F47272",
"F+	c #BF0707",
"G+	c #B70000",
"H+	c #E73636",
"I+	c #F48686",
"J+	c #E14E4E",
"K+	c #D63333",
"L+	c #F78383",
"M+	c #F5BCBC",
"N+	c #F5ECEC",
"O+	c #F98484",
"P+	c #D62727",
"Q+	c #C40000",
"R+	c #C30000",
"S+	c #C60808",
"T+	c #F57676",
"U+	c #F8CFCF",
"V+	c #F0DFDF",
"W+	c #FE8A8A",
"X+	c #C41515",
"Y+	c #B80202",
"Z+	c #E63434",
"`+	c #A82323",
" @	c #F07A7A",
".@	c #E04C4C",
"+@	c #D63232",
"@@	c #D53333",
"#@	c #D53535",
"$@	c #F27E7E",
"%@	c #F5BBBB",
"&@	c #F1E9E9",
"*@	c #F98B8B",
"=@	c #D62A2A",
"-@	c #C20000",
";@	c #C40909",
">@	c #F48080",
",@	c #F6D2D2",
"'@	c #F3E4E4",
")@	c #C61B1B",
"!@	c #D92626",
"~@	c #CD2020",
"{@	c #A72222",
"]@	c #EF6E6E",
"^@	c #DE3C3C",
"/@	c #D11B1B",
"(@	c #CE1313",
"_@	c #CA0707",
":@	c #C90303",
"<@	c #FF8F8F",
"[@	c #D62D2D",
"}@	c #C10A0A",
"|@	c #F58B8B",
"1@	c #FD9898",
"2@	c #C61C1C",
"3@	c #B90303",
"4@	c #DB2828",
"5@	c #CA1F1F",
"6@	c #890101",
"7@	c #A01313",
"8@	c #EC5555",
"9@	c #D61F1F",
"0@	c #C90000",
"a@	c #C80000",
"b@	c #C70000",
"c@	c #C70303",
"d@	c #CD1616",
"e@	c #BF0909",
"f@	c #C11010",
"g@	c #B90404",
"h@	c #DC2929",
"i@	c #C71E1E",
"j@	c #A01111",
"k@	c #EA5252",
"l@	c #D51E1E",
"m@	c #C60000",
"n@	c #C50000",
"o@	c #BA0404",
"p@	c #DC2A2A",
"q@	c #C31C1C",
"r@	c #EA4E4E",
"s@	c #D51D1D",
"t@	c #BB0505",
"u@	c #DE2B2B",
"v@	c #BF1A1A",
"w@	c #9E0F0F",
"x@	c #E94A4A",
"y@	c #D31C1C",
"z@	c #BC0606",
"A@	c #DF2D2D",
"B@	c #BA1818",
"C@	c #870000",
"D@	c #9C0D0D",
"E@	c #E84646",
"F@	c #D01B1B",
"G@	c #BC0707",
"H@	c #E02E2E",
"I@	c #B61717",
"J@	c #810000",
"K@	c #9A0C0C",
"L@	c #EC4949",
"M@	c #EB4747",
"N@	c #EB4545",
"O@	c #E94343",
"P@	c #E94141",
"Q@	c #E93F3F",
"R@	c #E73939",
"S@	c #E73737",
"T@	c #E63535",
"U@	c #B31515",
"V@	c #7D0000",
"W@	c #720000",
"X@	c #7C0000",
"                    . . . . . . . . . . . . +                   ",
"                  @ # $ $ $ $ $ % & * = - ; > +                 ",
"                , ' ) ! ! ! ! ~ ~ { ] ^ / ( _ : <               ",
"              [ } | 1 1 1 1 2 2 ! ~ { ] ^ / 3 4 5 6             ",
"            [ 7 8 9 9 0 0 9 9 1 2 ! ~ { ] ^ / a b 5 c           ",
"          d 7 8 0 0 e e e e 0 9 1 2 ! ~ { ^ f g h i j k         ",
"        l 7 m 0 e n o o o n e 0 9 1 2 ~ { ] ^ / p q r s k       ",
"      t 7 u 9 0 e o v w x o n e 9 1 2 ! y z ^ A B C 3 D E F     ",
"    G 7 H 1 9 0 e I J K L M n e 9 1 2 N O P Q A R S T U V W X   ",
"  . Y Z ! 2 1 0 `  ...+.@.#.$.0 9 1 %.&.*.=.-.;.R S >.,.'.)..   ",
"  . % { ~ 2 1 9 !.~.+.{.].^.#./.1 (._.:.].{.<.[.}.|.1.2.3.4..   ",
"  . % { ~ ! 2 1 /.5.6.7.8.9.0.a.b.c.d.8.7.e.f.g.|.h.i.j.k.l..   ",
"  . % ] { ~ ! ! 2 m.n.o.9.p.q.r.s.t.p.p.u.v.w.x.y.z.j.A.B.C..   ",
"  . D.^ ] { { ~ ! ! E.F.G.H.I.I.I.I.I.J.K.L.x.y.z.M.N.O.P.Q..   ",
"  . D.f f ^ ] { { ~ ~ E.R.S.T.U.U.U.V.W.a x.y.z.M.X.Y.Z.`. +.   ",
"  . & .+++f ^ ^ ] ] ] ] @+#+$+%+%+%+&+*+=+-+;+>+,+'+)+!+~+{+.   ",
"  . * g .+++++f f f ^ ]+^+/+(+(+_+_+(+S.:+<+[+}+'+)+!+~+|+1+.   ",
"  . 2+3+3+g .+.+.+++4+5+6+(+7+8+9+_+%+$+0+a+b+'+)+!+c+|+d+e+.   ",
"  . f+g+h+3+3+g g 4+i+/+(+7+j+k+l+m+7+(+$+n+o+p+!+c+|+d+q+r+.   ",
"  . s+t+g+g+h+h+u+v+w+%+7+x+y+z+A+B+C+7+(+U.D+E+F+|+d+q+G+H+.   ",
"  . I+J+K+t+t+t+L+M+$+(+N+O+P+Q+R+S+T+U+_+$+V+W+X+d+q+G+Y+Z+.   ",
"  X `+ @.@+@+@@@#@$@%@&@*@=@Q+R+-@[+;@>@,@'@& )@d+q+G+Y+!@~@.   ",
"    F {@]@^@/@(@_@:@]@<@[@Q+R+-@[+}+)+}@|@1@2@d+q+G+3@4@5@6@    ",
"      k 7@8@9@0@a@b@c@d@Q+R+-@[+'+)+!+~+e@f@d+q+G+g@h@i@k       ",
"        k j@k@l@b@m@n@Q+R+-@[+'+)+!+~+c+|+d+q+G+o@p@q@c         ",
"          c 5 r@s@n@Q+R+-@}+'+)+!+~+c+|+d+q+G+t@u@v@k           ",
"            6 w@x@y@R+-@}+'+)+!+~+c+|+d+q+G+z@A@B@C@            ",
"              < D@E@F@}+'+)+!+~+c+|+d+q+G+G@H@I@J@              ",
"                + K@(.L@M@N@O@P@Q@{+1+R@S@T@U@V@                ",
"                  W@. . . . . . . . . . . . X@                  ",
"                                                                ",
"                                                                "]

create_xpm = [
"32 32 127 2",
"  	c None",
". 	c #3465A4",
"+ 	c #C5D7EB",
"@ 	c #C7D9EC",
"# 	c #9FBEDE",
"$ 	c #C6D8EB",
"% 	c #9FBDDE",
"& 	c #C5D8EC",
"* 	c #9EBDDE",
"= 	c #C4D7EB",
"- 	c #C3D6EA",
"; 	c #9EBCDF",
"> 	c #C1D6EA",
", 	c #C1D4EA",
"' 	c #9DBCDF",
") 	c #BFD4EA",
"! 	c #3465A3",
"~ 	c #C3D7EA",
"{ 	c #9CBCDF",
"] 	c #BED3E9",
"^ 	c #C6D9EC",
"/ 	c #C5D9EC",
"( 	c #C3D5EB",
"_ 	c #9CBBDF",
": 	c #BCD2E9",
"< 	c #BBD1E8",
"[ 	c #BAD0E8",
"} 	c #BACFE8",
"| 	c #B8CFE8",
"1 	c #B7CEE8",
"2 	c #B6CDE6",
"3 	c #B4CCE6",
"4 	c #B3CCE6",
"5 	c #B1CAE6",
"6 	c #9EBCDE",
"7 	c #9BBBDF",
"8 	c #9BBADF",
"9 	c #9ABADF",
"0 	c #99BADF",
"a 	c #99B9DF",
"b 	c #98B9DF",
"c 	c #97B8DF",
"d 	c #AFC9E5",
"e 	c #96B7DF",
"f 	c #93B5DE",
"g 	c #90B3DD",
"h 	c #8EB2DD",
"i 	c #8EB1DD",
"j 	c #A8C4E2",
"k 	c #B5CDE6",
"l 	c #8AB0D7",
"m 	c #8DB2D8",
"n 	c #90B3D9",
"o 	c #8FB3D9",
"p 	c #8DB1D9",
"q 	c #8CB0D9",
"r 	c #8AAFD9",
"s 	c #88AED8",
"t 	c #84ACD7",
"u 	c #83AAD6",
"v 	c #80A8D6",
"w 	c #7CA6D6",
"x 	c #7AA4D5",
"y 	c #77A2D4",
"z 	c #739FD3",
"A 	c #709DD2",
"B 	c #6D9BD2",
"C 	c #6A99D1",
"D 	c #6998D1",
"E 	c #6898D1",
"F 	c #6897D1",
"G 	c #6797D2",
"H 	c #87ADD8",
"I 	c #ADC7E3",
"J 	c #73A0CF",
"K 	c #739FCF",
"L 	c #729FCF",
"M 	c #719ED0",
"N 	c #709DD0",
"O 	c #6F9DD0",
"P 	c #6F9CD0",
"Q 	c #6E9CD0",
"R 	c #6D9BD1",
"S 	c #6C9BD1",
"T 	c #6C9AD1",
"U 	c #6B9AD1",
"V 	c #6B99D1",
"W 	c #6796D2",
"X 	c #84ABD7",
"Y 	c #3868A6",
"Z 	c #ACC6E3",
"` 	c #AAC5E2",
" .	c #A9C4E1",
"..	c #A7C3E1",
"+.	c #A5C2E1",
"@.	c #A4C1E1",
"#.	c #A3C1DF",
"$.	c #A1BFE0",
"%.	c #9FBEDF",
"&.	c #709DD1",
"*.	c #94B6DC",
"=.	c #93B5DC",
"-.	c #92B4DB",
";.	c #90B3DA",
">.	c #8EB2DA",
",.	c #8DB1DA",
"'.	c #8BAFD9",
").	c #86ACD7",
"!.	c #99BADD",
"~.	c #6F9DD1",
"{.	c #97B8DC",
"].	c #6F9CD1",
"^.	c #91B4DB",
"/.	c #98B9DD",
"(.	c #90B2DA",
"_.	c #96B8DC",
":.	c #6999D1",
"<.	c #95B7DC",
"[.	c #8BB0D9",
"}.	c #89AFD9",
"|.	c #85ABD8",
"1.	c #8EB2D9",
"2.	c #89AFDA",
"3.	c #86ADD9",
"4.	c #85ABD7",
"5.	c #3667A6",
"6.	c #3868A5",
"                                                                ",
"                                                                ",
"                        . . . . . . . .                         ",
"                        . + + + + + + .                         ",
"                        . @ # # # # @ .                         ",
"                        . @ # # # # $ .                         ",
"                        . @ # # # % & .                         ",
"                        . @ # # % * = .                         ",
"                        . @ # % * * - .                         ",
"                        . @ % * * ; > .                         ",
"                        . $ * * ; ; , .                         ",
"                        . + * ; ; ' ) .                         ",
"    . . . . . . . . . ! . ~ ; ; ' { ] . . . . . . . . . . .     ",
"    . @ @ @ @ @ @ ^ / + - ( ' ' { _ : < [ } | 1 2 3 4 5 5 .     ",
"    . @ # # # # % % * 6 ; ' ' { _ 7 8 8 8 9 0 a a a b c d .     ",
"    . @ # # # % % * 6 ; ' ' { _ 7 8 8 8 9 0 a e f g h i j .     ",
"    . k l m n o o p q r s t u v w x y z A B C C D E F G H .     ",
"    . I J K L L M M N N O P Q R R S T U V C C D E F G W X .     ",
"    Y I Z `  ...+.@.#.$.%.' &.R S T *.=.-.;.>.,.'.s H X )..     ",
"    . . . . . . . . . . . !.~.S T U =.. . . . . . . . . . .     ",
"                        . {.].T U V ^..                         ",
"                        . /.T U V C (..                         ",
"                        . _.U V C :.>..                         ",
"                        . <.V C :.E [..                         ",
"                        . -.C :.E E }..                         ",
"                        . ;.D E F G H .                         ",
"                        . >.E F G W |..                         ",
"                        . 1.'.2.3.4.)..                         ",
"                        . . . . . 5.6..                         ",
"                                                                ",
"                                                                ",
"                                                                "]

message = _("""

This is a convenience utility, a front-end for useradd that creates a new user account with the default system rights and a home directory on Absolute. The created user becomes part of the groups:

users, audio, video, disk, plugdev, floppy, cdrom, games, lp, netdev

For more fine-grained control of user account creation, run the "adduser" script in an xterm and follow the prompts.
""")
class MakeUser:
	def __init__(self):
        	# create the top level window
        	self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        	self.window.set_title(_("Add User"))
        	self.window.set_size_request(300, 300)
		self.window.set_position(gtk.WIN_POS_CENTER)
        	self.window.connect("delete_event", self.delete_event)    
		icon = gtk.gdk.pixbuf_new_from_xpm_data(adduser_xpm)
		self.window.set_icon(icon)
		self.tooltips = gtk.Tooltips()
		
		closer = gtk.gdk.pixbuf_new_from_xpm_data(close_xpm)
		close_img = gtk.Image()
		close_img.set_from_pixbuf(closer)
		
		creator = gtk.gdk.pixbuf_new_from_xpm_data(create_xpm)
		create_img = gtk.Image()
		create_img.set_from_pixbuf(creator)
		
		
		###########  layout  #########################################################
		##############################################################################
		vbox = gtk.VBox(False, 16)
		self.window.add(vbox)		
		
		
		###########  exit and create ################
		btn_box = gtk.HBox(False, 0)
		vbox.pack_end(btn_box, False, True, 0)

		btn_close = gtk.Button()
		btn_close.add(close_img)
		btn_close.set_relief(gtk.RELIEF_NONE)
		btn_create = gtk.Button()
		btn_create.add(create_img)
		btn_create.set_relief(gtk.RELIEF_NONE)	
		
		align_help = gtk.Alignment(0.5, 0.5, 0, 0)	
		btn_info = gtk.Button(_("Info"))
		align_help.add(btn_info)
		self.tooltips.set_tip(btn_close, _("Exit without creating a new user."))
		self.tooltips.set_tip(btn_create, _("Creates new user with the entered name and password."))
		btn_info.connect("clicked", self.show_info)
		btn_close.connect("clicked", self.delete_event)
		btn_create.connect("clicked", self.MakeAccount)

		btn_box.pack_end(btn_close, False, False, 0)
		btn_box.pack_end(btn_create, False, False, 0)
		btn_box.pack_start(align_help, False, False, 8)		
		
		###########  Labels and inputs ################
		main_box = gtk.VBox(False, 0)
		vbox.pack_start(main_box, False, True, 0)		
		
		align1 = gtk.Alignment(0.5, 0.5, 0, 0)
		align2 = gtk.Alignment(0.5, 0.5, 0, 0)
		align = gtk.Alignment(0.5, 0.5, 0, 0)
		
		align3 = gtk.Alignment(0.5, 0.5, 0, 0)
		align4 = gtk.Alignment(0.5, 0.5, 0, 0)
		align5 = gtk.Alignment(0.5, 0.5, 0, 0)
		align6 = gtk.Alignment(0.5, 0.5, 0, 0)
		
		lbl_create = gtk.Label(_("Create a New User"))
		lbl_create.set_markup(_('<span size="16000" foreground="#222266"><b>Create a New User</b></span>'))
		
		lbl_name = gtk.Label(_("Enter the User Name"))
		self.name_entry = gtk.Entry(64)
		self.name_entry.set_width_chars(20)
		self.insert_name = self.name_entry.connect('insert_text', self.insert_cb)

		lbl_PW1 = gtk.Label(_("\nEnter a password for the user"))
		self.txt_pw1 = gtk.Entry(64)
		self.txt_pw1.set_width_chars(20)
		self.txt_pw1.set_visibility(False)
		self.insert_pass1 = self.txt_pw1.connect('insert_text', self.insert_pw1)
		
		lbl_PW2 = gtk.Label(_("Re-enter the user password"))
		self.txt_pw2 = gtk.Entry(64)
		self.txt_pw2.set_width_chars(20)
		self.txt_pw2.set_visibility(False)
		self.insert_pass2 = self.txt_pw2.connect('insert_text', self.insert_pw2)
		
		align1.add(lbl_create)
		align2.add(lbl_name)
		align.add(self.name_entry)
		align3.add(lbl_PW1)
		align4.add(self.txt_pw1)
		align5.add(lbl_PW2)
		align6.add(self.txt_pw2)
		
		main_box.pack_start(align1, False, False, 16)
		main_box.pack_start(align2, False, False, 4)
		main_box.pack_start(align, False, False, 4)
		main_box.pack_start(align3, False, False, 4)
		main_box.pack_start(align4, False, False, 4)
		main_box.pack_start(align5, False, False, 4)
		main_box.pack_start(align6, False, False, 4)
		
		self.window.show_all()
		
		
	def show_info(self, event):
		box = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, message)
		box.set_position(gtk.WIN_POS_CENTER)
		box.set_title(_('New User Info'))
		box.run()
		box.destroy()			
      
	
	def delete_event(self, window=None, event=None):
		gtk.main_quit()


	def MakeAccount(self, evt):
		un = self.name_entry.get_text()
		if un == "":
			box = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("\nA user name has not been entered."))
			box.set_position(gtk.WIN_POS_CENTER)
			box.set_title(_('Forgot the Name'))
			box.run()
			box.destroy()
			self.name_entry.grab_focus()
			return

		if self.txt_pw1.get_text() == "":
			box = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("\nA password has not been entered."))
			box.set_position(gtk.WIN_POS_CENTER)
			box.set_title(_('Forgot the Password'))
			box.run()
			box.destroy()
			self.txt_pw1.grab_focus()
			return

		if self.txt_pw2.get_text() == "":
			box = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("\nA password has not been entered."))
			box.set_position(gtk.WIN_POS_CENTER)
			box.set_title(_('Forgot the Password'))
			box.run()
			box.destroy()
			self.txt_pw2.grab_focus()
			return
			
    		if self.txt_pw1.get_text() != self.txt_pw2.get_text():
			box = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("\nThe passwords you entered do not match,\nplease try again."))
			box.set_position(gtk.WIN_POS_CENTER)
			box.set_title(_('Password Mis-Match'))
			box.run()
			box.destroy()
			self.txt_pw1.grab_focus()
			return
			
			
		try:
			ret = commands.getoutput("awk -F: '{print $1}' /etc/passwd > unTmp")
			ison = commands.getoutput("grep %s unTmp" % un)
			os.system('rm -f unTmp')
		except:
			pass
			
		if ison != "":
			box = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("\n%s\nis either already in use or is a system group name.\nIt is strongly suggested that you pick a different name for the user account...") % un)
			box.set_position(gtk.WIN_POS_CENTER)
			box.set_title(_('User name not recommended.'))
			box.run()
			box.destroy()
			self.name_entry.grab_focus()
			return
		
		
		dirpth = os.path.join("/home", un)
    		if os.path.isdir(dirpth):
			box = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("\nThere is already a folder in the /home with the *%s* username. This folder may no longer be associated with a current user, but it would still be wise to rename/backup or remove this folder prior to creating the new user with that name.") % un)
			box.set_position(gtk.WIN_POS_CENTER)
			box.set_title(_('User already created?'))
			box.run()
			box.destroy()
			self.name_entry.grab_focus()
			return


		sendpass = crypt.crypt(self.txt_pw1.get_text(),"a1")
		
    		try:
    			if commands.getoutput('useradd -s /bin/bash -m -g users -G users,audio,video,disk,plugdev,floppy,cdrom,games,lp,netdev -p %s %s' %  (sendpass, un)):
				box = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("\nSorry, for some reason the user account could not be created."))
				box.set_position(gtk.WIN_POS_CENTER)
				box.set_title(_('Error'))
				box.run()
				box.destroy()
				return	
			else:
				box = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("\nThe user account for has been successfully created.\n\nIf you need to remove them later, run:\nuserdel -r %s\n") % un)
				box.set_position(gtk.WIN_POS_CENTER)
				box.set_title(_('Success'))
				box.run()
				box.destroy()
				self.delete_event()
		except:

			box = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("\nSorry, for some reason the user account could not be created."))
			box.set_position(gtk.WIN_POS_CENTER)
			box.set_title(_('Error'))
			box.run()
			box.destroy()
			return	
		

	########### functions below are hack to "Mask" the gtkEntry(s) to alphanumeric and "_" #############
	
	def insert_cb(self, widget, text, length, *args):
		# if you don't do this, garbage comes in with text
		text = text[:length]
		pos = widget.get_position()
		# stop default emission
		widget.emit_stop_by_name("insert_text")
		gobject.idle_add(self.insert, widget, text, pos)

	def insert(self, widget, text, pos):
		# the next three lines set up the text. this is done because we
		# can't use insert_text(): it always inserts at position zero.
		orig_text = widget.get_text()
		last_char = text[-1]

		if not re.match("[A-Za-z0-9_]", last_char):
			gtk.gdk.beep()
			text = str.replace(text, last_char, "")
			
		new_text = orig_text[:pos] + text + orig_text[pos:]
		# avoid recursive calls triggered by set_text
		widget.handler_block(self.insert_name)
		# replace the text with some new text
		widget.set_text(new_text)
		widget.handler_unblock(self.insert_name)
		# set the correct position in the widget
		widget.set_position(pos + len(text))
    
 
  	def insert_pw1(self, widget, text, length, *args):
		# if you don't do this, garbage comes in with text
		text = text[:length]
		pos = widget.get_position()
		# stop default emission
		widget.emit_stop_by_name("insert_text")
		gobject.idle_add(self.insert_1, widget, text, pos)

	def insert_1(self, widget, text, pos):
		orig_text = widget.get_text()
		last_char = text[-1]
		if not re.match("[A-Za-z0-9_]", last_char):
			text = str.replace(text, last_char, "")
		new_text = orig_text[:pos] + text + orig_text[pos:]
		widget.handler_block(self.insert_pass1)
		widget.set_text(new_text)
		widget.handler_unblock(self.insert_pass1)
		widget.set_position(pos + len(text))
      

  	def insert_pw2(self, widget, text, length, *args):
		text = text[:length]
		pos = widget.get_position()
		widget.emit_stop_by_name("insert_text")
		gobject.idle_add(self.insert_2, widget, text, pos)

	def insert_2(self, widget, text, pos):
		orig_text = widget.get_text()
		last_char = text[-1]
		if not re.match("[A-Za-z0-9_]", last_char):
			text = str.replace(text, last_char, "")
		new_text = orig_text[:pos] + text + orig_text[pos:]
		widget.handler_block(self.insert_pass2)
		widget.set_text(new_text)
		widget.handler_unblock(self.insert_pass2)
		widget.set_position(pos + len(text))
      
###################################################################################     
      	
def main():
	gtk.main()
	return 0

if __name__ == "__main__":
	if not os.geteuid()==0: sys.exit(_("\nOnly root can run this script\n"))
	MakeUser()
	main()
