由于TIPTOP ERP 用户更改口令不是很方便,所以写了个程序用来更改用户口令
(按理来说不是自己亲自写的,是从别人那里要来改过后的,
好东西总是要共享的嘛)
以前的修改界面如下:【输入的内容是看不到的,造成用户有时候不知所措】
运行p_pw界面及操作如下:
程序信息如下:(per文件与4gl文件)
*********************************************************************************************************************
程序编号: p_pw.4gl
程序说明:TIPTOP ERP用户密码修改
程序所在目录
4gl文件:/u1/topprod/topcust/czz/4gl/p_pw.4gl
per文件:/u1/topprod/topcust/czz/per/p_pw.per
*********************************************************************************************************************
.per文件
SCHEMA FORMONLY
LAYOUT
VBOX
FOLDER
PAGE page01 (TEXT="Main")
GRID
{
username [username ][name ]
Oldpassword [old ]
Newpassword [new ]
REPassword [renew ]
}
END --GRID
END --PAGE
END --FOLDER
END --VBOX
END --LAYOUT
ATTRIBUTES
username = FORMONLY.username,NOENTRY;
name = FORMONLY.name,NOENTRY;
old = FORMONLY.old;
new = FORMONLY.new;
renew = FORMONLY.renew;
END
.4gl文件
# Prog. Version..: '3.10.02-06.08.23(00005)' #
# Pattern name...: p_pw.4gl
# Descriptions...: 可视化界面修改用户密码
# Date & Author..: 2012/09/26 By XXXX
DATABASE ds
GLOBALS "../../config/top.global"
DEFINE p_row,p_col SMALLINT,
g_oldpwd VARCHAR(50),
g_newpwd VARCHAR(50),
g_repwd VARCHAR(50),
g_zx02 LIKE zx_file.zx02
MAIN
OPTIONS #改变一些系统预设值
FORM LINE FIRST + 2, #画面开始的位置
MESSAGE LINE LAST, #讯息显示的位置
PROMPT LINE LAST, #提示讯息的位置
INPUT NO WRAP #输入的方式: 不打转
DEFER INTERRUPT #撷取中断键, 由程式处理
IF (NOT cl_user()) THEN
EXIT PROGRAM
END IF
WHENEVER ERROR CALL cl_err_msg_log
IF (NOT cl_setup("CZZ")) THEN
EXIT PROGRAM
END IF
LET p_row = ARG_VAL(1)
LET p_col = ARG_VAL(2)
CALL cl_used(g_prog,g_time,1) RETURNING g_time #No:MOD-580088 HCN 20050818 #No.FUN-6A0081
OPEN WINDOW p_pw_w AT p_row,p_col WITH FORM "czz/42f/p_pw"
ATTRIBUTE (STYLE="chpw", TEXT="chpw") #No:FUN-580092 HCN
CALL cl_ui_init()
LET g_action_choice = ""
##显示用户账号和姓名*******************************************
SELECT zx02 INTO g_zx02 FROM zx_file WHERE zx01=g_user
IF (SQLCA.SQLCODE) THEN
DISPLAY g_user CLIPPED," has no data in zx_file."
RETURN FALSE
END IF
DISPLAY g_user TO FORMONLY.username ATTRIBUTE(REVERSE,BOLD,GREEN)
DISPLAY g_zx02 TO FORMONLY.name ATTRIBUTE(REVERSE,BOLD,GREEN)
##END**********************************************************
CALL p_pw_i()
CALL p_pw_menu()
CLOSE WINDOW p_pw_w
CALL cl_used(g_prog,g_time,2) RETURNING g_time #No:MOD-580088 HCN 20050818 #No.FUN-6A0081
END MAIN
FUNCTION p_pw_menu()
MENU ""
BEFORE MENU
ON ACTION pwd
CALL p_pw_modify()
ON ACTION exit
LET g_action_choice = "exit"
EXIT MENU
ON ACTION controlg
CALL cl_cmdask()
ON IDLE g_idle_seconds
CALL cl_on_idle()
CONTINUE MENU
COMMAND KEY(INTERRUPT)
LET INT_FLAG=FALSE
LET g_action_choice = "exit"
EXIT MENU
END MENU
END FUNCTION
FUNCTION p_pw_i()
INPUT g_oldpwd,g_newpwd,g_repwd FROM old,new,renew
BEFORE INPUT
CALL cl_set_comp_entry("old,new,renew",TRUE)
AFTER FIELD renew
IF g_repwd <> g_newpwd THEN
CALL cl_err('','czz-101',1)
NEXT FIELD new
END IF
ON ACTION CANCEL
LET g_action_choice = "exit"
CALL cl_set_act_visible("pwd", FALSE)
EXIT INPUT
END INPUT
IF INT_FLAG THEN
LET INT_FLAG = 0
CLOSE WINDOW p_pw_w
CALL cl_used(g_prog,g_time,2) RETURNING g_time
EXIT PROGRAM
END IF
END FUNCTION
FUNCTION p_pw_modify()
DEFINE
l_script STRING,
l_execute STRING,
l_return STRING
DEFINE
ch base.Channel,
l_status SMALLINT,
l_index SMALLINT,
l_temp STRING,
l_text STRING
RUN "rm -rf /u1/topprod/tiptop/azz/4gl/pwd"
RUN "rm -rf /u1/topprod/tiptop/azz/4gl/pwd.log"
LET l_script = '#!usr/bin/expect ','\n',
' set old [lindex $argv 0]','\n',
' set new [lindex $argv 1]','\n',
' spawn passwd ','\n',
' expect "password:" ','\n',
' send "$old\\r" ','\n',
' sleep 1','\n',
' expect "password:"','\n',
' send "$new\\r" ','\n',
' sleep 1 ','\n',
' expect "password:"','\n',
' send "$new\\r" ','\n',
' expect eof','\n',
' exit'
RUN "echo '"||l_script||"' > /u1/topprod/tiptop/azz/4gl/pwd"
RUN "chmod 777 /u1/topprod/tiptop/azz/4gl/pwd"
RUN "chmod 777 /u1/topprod/tiptop/azz/4gl/pwd.log"
LET l_execute = "expect /u1/topprod/tiptop/azz/4gl/pwd ",g_oldpwd," ",g_newpwd," > /u1/topprod/tiptop/azz/4gl/pwd.log"
RUN l_execute
SLEEP 2
LET ch = base.Channel.create()
CALL ch.openFile('/u1/topprod/tiptop/azz/4gl/pwd.log','r')
LET l_status = ch.read(l_temp)
WHILE l_status
LET l_text = l_text.trim(),l_temp.trim()
LET l_status = ch.read(l_temp)
END WHILE
LET l_index = 0
LET l_index = l_text.getIndexOf('successfully',1)
IF l_index > 0 THEN
CALL cl_err('successfully','!',1)
EXIT PROGRAM
ELSE
LET l_index = l_text.getIndexOf('Authentication token manipulation error',1)
IF l_index > 0 THEN
CALL cl_err('','czz-102',1) #认证令牌操作错误
ELSE
LET l_index = l_text.getIndexOf('too short',1)
IF l_index > 0 THEN
CALL cl_err('','czz-103',1) #新输入的密码太短
ELSE
LET l_index = l_text.getIndexOf('Password unchanged',1)
IF l_index > 0 THEN
CALL cl_err('','czz-108',1) #密码未改变
ELSE
LET l_index = l_text.getIndexOf('too similar to the old',1)
IF l_index > 0 THEN
CALL cl_err('','czz-107',1) #新密码与旧密码太相似了
ELSE
LET l_index = l_text.getIndexOf('not contain enough DIFFERENT characters',1)
IF l_index > 0 THEN
CALL cl_err('','czz-104',1) #密码不包含足够的不同字符
ELSE
LET l_index = l_text.getIndexOf('too simplistic',1)
IF l_index > 0 THEN
CALL cl_err('','czz-105',1) #新密码太过简单化
ELSE
LET l_index = l_text.getIndexOf('based on a dictionary word',1)
IF l_index > 0 THEN
CALL cl_err('','czz-106',1) #新密码包含了基于字典中的单词
ELSE
CALL cl_err(l_text,'!',1)
END IF
END IF
END IF
END IF
END IF
END IF
END IF
#CALL cl_err(l_text,'!',1)
CALL p_pw_i()
IF g_action_choice = "exit" THEN
CALL cl_set_act_visible("pwd", FALSE)
END IF
CALL p_pw_menu()
IF INT_FLAG OR g_action_choice = "exit" THEN
EXIT PROGRAM
END IF
END IF
END FUNCTION