tiptop WEB登录页面不能保存密码,也不能自助找回密码,非常不友好,改善了下。 界面是参考鹏大神的教程做的,保存密码和找回密码是在程序里面做的一些小调整

附上代码
IMPORT JAVA java.lang.StringBuffer
IMPORT JAVA javax.naming.ldap.Control
IMPORT JAVA javax.naming.ldap.InitialLdapContext
IMPORT JAVA java.util.Hashtable
IMPORT util
IMPORT os
DATABASE ds
GLOBALS "../../config/top.global"
DEFINE g_zx01 LIKE zx_file.zx01,
g_zx10 LIKE zx_file.zx10,
g_zz28 LIKE zz_file.zz28,
g_zx09 LIKE zx_file.zx09
DEFINE g_tryerr LIKE type_file.num5
DEFINE g_msg STRING
DEFINE g_chk LIKE type_file.chr1
DEFINE g_zx10_new LIKE zx_file.zx10
DEFINE g_zx10_ver LIKE zx_file.zx10
CONSTANT TIMEOUT INTEGER = 300
CONSTANT TRYERR SMALLINT = 5
MAIN
OPTIONS
ON CLOSE APPLICATION STOP,
INPUT NO WRAP
DEFER INTERRUPT
WHENEVER ERROR CONTINUE
CALL cl_set_config_path()
CALL cl_load_act_list("weblogin")
CALL cl_load_style_list("weblogin")
LET g_lang = '1'
LET g_prog = 'weblogin'
CALL weblogin()
END MAIN
FUNCTION weblogin()
DEFINE l_user STRING
DEFINE l_passwd STRING
DEFINE ls_pic_url STRING
DEFINE l_notify STRING
DEFINE l_ch base.Channel
DEFINE l_cnt LIKE type_file.num10
DEFINE lc_gbq10 LIKE gbq_file.gbq10
DEFINE l_strSOK STRING
DEFINE l_cmd STRING
DEFINE l_arg STRING
DEFINE l_i LIKE type_file.num10
DEFINE l_err_str STRING
DEFINE lc_fglserver LIKE gbq_file.gbq02
DEFINE l_operation STRING
DEFINE l_primaryKey LIKE gah_file.gah01
DEFINE l_resetpass LIKE type_file.num5
DEFINE l_zx10_old LIKE zx_file.zx10
DEFINE l_zx10_new LIKE zx_file.zx10
DEFINE l_zx06 LIKE zx_file.zx06
DEFINE l_zx19 LIKE zx_file.zx19
DEFINE l_ze03 LIKE ze_file.ze03
DEFINE l_ad_server STRING
DEFINE l_num LIKE type_file.num5
DEFINE l_success LIKE type_file.num5
LET l_user = ARG_VAL(1)
LET l_passwd = ARG_VAL(2)
LET l_strSOK = ARG_VAL(3)
CLOSE WINDOW SCREEN
CASE
WHEN ( NOT cl_null(l_strSOK) )
DISPLAY "weblogin time_begin:",TIME
LET g_plant = ARG_VAL(4)
LET g_prog = ARG_VAL(5)
IF cl_get_fastcgidispatch_version() >= "2.30.13" THEN
LET l_num = NUM_ARGS() / 2
IF l_num < 5 THEN
LET g_prog = ""
END IF
ELSE
LET l_num = NUM_ARGS()
END IF
LET g_gui_type = cl_fglgui()
display "SSO_SERVER:",FGL_GETENV("SSO_SERVER")
display "SSO_SOAP:",FGL_GETENV("SSO_SOAP")
IF l_user = "TIPTOPSSO" THEN
display "SOK:",l_strSOK
LET l_strSOK = cl_replace_str(l_strSOK, "_plus_", "+")
CALL cl_chk_ssokey(l_strSOK) RETURNING g_zx01,l_err_str
ELSE
CALL web_javasso(l_strSOK) RETURNING g_zx01,l_err_str
END IF
display "g_zx01:",g_zx01
IF NOT cl_null(l_err_str) THEN
CALL web_err(l_err_str)
EXIT PROGRAM
ELSE
IF cl_null(g_zx01) OR g_zx01 = "null" THEN
CALL web_err("Authentication of Single Sign-on failed!")
EXIT PROGRAM
END IF
END IF
IF NOT user_validate() THEN
EXIT PROGRAM
END IF
LET g_user = g_zx01
SELECT zx06 INTO g_lang FROM zx_file WHERE zx01 = g_user
SELECT zx10 INTO g_zx10 FROM zx_file WHERE zx01 = g_user
LET g_zx10= cl_uszx_10decod(g_zx10)
IF NOT pwd_validate() THEN
EXIT PROGRAM
END IF
IF NOT cl_null(g_plant) THEN
IF NOT s_chkdbs(g_user,g_plant,g_lang) THEN
EXIT PROGRAM
END IF
IF NOT cl_null(g_prog) THEN
FOR l_i = 6 TO l_num
LET l_arg = l_arg," '",ARG_VAL(l_i),"'"
END FOR
ELSE
LET g_prog = "udm_tree"
LET l_arg = " '' ", FGL_GETPID()
END IF
SELECT azp03 INTO g_dbs FROM azp_file WHERE azp01 = g_plant
IF cl_null(g_dbs) THEN
SELECT ze03 INTO l_ze03 FROM ze_file
WHERE ze01 = "mfg9142" AND ze02 = g_lang
CALL web_err(l_ze03)
EXIT PROGRAM
END IF
CALL cl_ins_del_sid(2,'')
CLOSE DATABASE
DATABASE g_dbs
CALL cl_ins_del_sid(1,g_plant)
IF SQLCA.SQLCODE THEN
CALL cl_ins_del_sid(2,'')
CLOSE DATABASE
DATABASE ds
CALL cl_ins_del_sid(1,'')
CALL cl_err3("sel","azp_file",g_plant,"","100","","sel azp:",1)
DISPLAY g_plant,":(azp_file) No record, related data or Master found !"
EXIT PROGRAM
END IF
LET lc_fglserver = FGL_GETENV("FGLSERVER")
LET lc_fglserver = cl_process_chg_iprec(lc_fglserver)
LET lc_gbq10 = g_plant CLIPPED, "/", g_plant CLIPPED
INSERT INTO gbq_file (gbq01, gbq02, gbq03, gbq04, gbq06, gbq10, gbq11)
VALUES (FGL_GETPID(), lc_fglserver, g_user,g_prog , 2, lc_gbq10,
cl_used_ap_hostname() )
IF cl_sql_dup_value(SQLCA.SQLCODE) THEN
UPDATE gbq_file SET gbq10 = lc_gbq10
WHERE gbq02 = lc_fglserver AND gbq03 = g_user
END IF
SELECT * INTO g_aza.* FROM aza_file WHERE aza01='0'
LET g_today = TODAY
LET l_operation = ARG_VAL(1)
LET l_operation = l_operation.toLowerCase()
LET l_primaryKey = ARG_VAL(2)
IF l_operation = "todolist" THEN
UPDATE gah_file SET gah09 = TODAY WHERE gah01= l_primaryKey
CALL cl_ppcli_CloseToDoList(l_primaryKey CLIPPED)
END IF
LET l_cmd = g_prog,l_arg
display l_cmd
DISPLAY "weblogin time_end:",TIME
CALL cl_cmdrun_wait(l_cmd)
EXIT PROGRAM
END IF
WHEN (( NOT cl_null(l_user)) AND (NOT cl_null(l_passwd)))
LET g_zx01 = l_user
LET g_zx10 = l_passwd
IF NOT user_validate() THEN
EXIT PROGRAM
END IF
IF NOT pwd_validate() THEN
EXIT PROGRAM
END IF
LET g_user = g_zx01
OTHERWISE
RUN "fglWrt -u"
OPEN WINDOW weblogin_w WITH FORM 'azz/42f/weblogin'
ATTRIBUTE(STYLE = "login")
CLOSE WINDOW SCREEN
LET ls_pic_url = FGL_GETENV("FGLASIP") || "/tiptop/pic/login.jpg"
DISPLAY ls_pic_url TO FORMONLY.logo
LET g_tryerr = 0
IF NOT cl_check_license() THEN
CALL web_err("INFO: Login Users Exceed Than TIPTOP License Allowed.\n Please Re-try Later or Cantact with System Administrators.")
EXIT PROGRAM
END IF
CALL weblogin_def('1')
INPUT g_zx01, g_zx10,g_chk WITHOUT DEFAULTS
FROM FORMONLY.zx01, FORMONLY.zx10, FORMONLY.chk ATTRIBUTE(UNBUFFERED)
AFTER INPUT
IF INT_FLAG THEN
EXIT INPUT
END IF
LET l_ad_server = FGL_GETENV("AD_SERVER") CLIPPED
IF cl_null(l_ad_server) THEN
LET l_ad_server = 'N'
END IF
IF l_ad_server = 'Y' THEN
CALL web_javaad(g_zx01, g_zx10) RETURNING l_err_str
IF NOT cl_null(l_err_str) THEN
CALL web_err(l_err_str)
NEXT FIELD zx01
END IF
SELECT COUNT(zx01) INTO l_cnt FROM zx_file
WHERE zx01 = g_zx01 AND zxacti = "Y"
IF l_cnt = 0 THEN
CALL web_err('zx_file get error. User account does not exist zx_file!')
NEXT FIELD zx01
END IF
ELSE
IF NOT user_validate() THEN
IF g_tryerr >= TRYERR THEN LET INT_FLAG=TRUE EXIT INPUT END IF
NEXT FIELD zx01
END IF
IF NOT pwd_validate() THEN
IF g_tryerr >= TRYERR THEN LET INT_FLAG=TRUE EXIT INPUT END IF
NEXT FIELD zx10
END IF
END IF
ON IDLE 30
LET INT_FLAG = TRUE
CALL web_err('Timeout for launching the program!')
EXIT INPUT
ON ACTION login
ACCEPT INPUT
ON ACTION forget
CALL weblogin_forget() RETURNING l_success
IF l_success THEN
CALL cl_err('密码修改成功','!',1)
ELSE
CALL cl_err('密码修改失败','!',1)
END IF
END INPUT
CLOSE WINDOW weblogin_w
CALL ui.Interface.refresh()
IF INT_FLAG THEN
IF g_tryerr >= TRYERR THEN
LET l_cmd = "Sorry, Error More Than ", g_tryerr USING "#&", " Times!\n\n"
LET l_cmd = l_cmd,"If You Forget Username or Password, Please Confirm With System Administrators."
CALL web_err(l_cmd)
END IF
LET INT_FLAG = FALSE
EXIT PROGRAM
END IF
LET g_user = g_zx01
END CASE
LET l_resetpass = FALSE
LET l_zx06 = NULL
SELECT zx06,zx10,zx19 INTO l_zx06,l_zx10_old,l_zx19 FROM zx_file
WHERE zx01 = g_zx01
IF cl_null(l_zx06) THEN LET l_zx06 = '1' END IF
IF NOT l_resetpass AND l_ad_server <> 'Y' THEN
IF l_zx10_old IS NULL OR l_zx10_old= " " THEN
LET g_msg = NULL
LET g_msg = cl_getmsg('lib-061',l_zx06)
CALL web_err(g_msg)
LET l_resetpass = TRUE
END IF
END IF
IF NOT l_resetpass AND l_ad_server <> 'Y' THEN
IF NOT weblogin_ver_passwd() THEN
LET g_msg = NULL
LET g_msg = cl_getmsg('lib-061',l_zx06)
CALL web_err(g_msg)
LET l_resetpass = TRUE
END IF
END IF
IF NOT l_resetpass AND l_ad_server <> 'Y' THEN
IF l_zx19 IS NOT NULL AND l_zx19 = "Y" THEN
LET g_msg = NULL
LET g_msg = cl_getmsg('lib-062',l_zx06)
CALL web_err(g_msg)
LET l_resetpass = TRUE
END IF
END IF
IF l_resetpass THEN
CALL FGL_SETENV("WEBUSER",g_zx01 CLIPPED)
CALL cl_cmdrun_wait('webpasswd')
SELECT zx10 INTO l_zx10_new FROM zx_file WHERE zx01 = g_zx01
IF l_zx10_old = l_zx10_new OR l_zx10_new IS NULL THEN
LET g_msg = NULL
LET g_msg = cl_getmsg('lib-063',l_zx06)
CALL web_err(g_msg)
EXIT PROGRAM
END IF
END IF
CALL weblogin_def('2')
LET l_notify = FGL_GETPID()
RUN "rm -f " || l_notify
RUN "udm7 weblog " || g_user || " " || l_notify WITHOUT WAITING
DISPLAY "weblogin time_end:",TIME
LET l_ch = base.Channel.create()
LET l_cnt = 0
WHILE TRUE
CALL l_ch.openFile(l_notify, "r")
IF NOT STATUS THEN
RUN "rm -f " || l_notify
EXIT WHILE
END IF
SLEEP 1
LET l_cnt = l_cnt + 1
IF l_cnt = TIMEOUT THEN
CALL web_err('Timeout for launching menu program!')
EXIT WHILE
END IF
END WHILE
CALL l_ch.close()
END FUNCTION
FUNCTION user_validate()
DEFINE l_cnt LIKE type_file.num5
DEFINE l_zx RECORD LIKE zx_file.*
DEFINE l_gbt RECORD LIKE gbt_file.*
SELECT COUNT(zx01) INTO l_cnt FROM zx_file
WHERE zx01 = g_zx01
AND zxacti = "Y"
IF l_cnt = 0 THEN
CALL web_err('Invalid user name or password!')
LET g_tryerr = g_tryerr + 1
RETURN FALSE
END IF
SELECT * INTO l_gbt.* FROM gbt_file WHERE gbt00 = "0"
SELECT * INTO l_zx.* FROM zx_file WHERE zx01 = g_zx01
IF l_gbt.gbt10 IS NOT NULL AND l_gbt.gbt10 > 0 THEN
IF l_zx.zx20 >= l_gbt.gbt10 THEN
CALL web_err('Password Error More Than '|| l_gbt.gbt10 ||' Times.\nYour account has been locked!\Apply For a New Password!')
RETURN FALSE
END IF
END IF
IF NOT cl_null(l_zx.zx18) AND l_zx.zx18 < TODAY THEN
CALL web_err('Your account has expired!')
RETURN FALSE
END IF
RETURN TRUE
END FUNCTION
FUNCTION pwd_validate()
DEFINE l_zx RECORD LIKE zx_file.*
DEFINE l_gbt RECORD LIKE gbt_file.*
DEFINE ls_tmp STRING
SELECT * INTO l_gbt.* FROM gbt_file WHERE gbt00 = "0"
SELECT * INTO l_zx.* FROM zx_file WHERE zx01 = g_zx01
IF NOT cl_webuser_validate(g_zx01,g_zx10) THEN
LET g_msg = NULL
LET g_msg = cl_getmsg('lib-064',l_zx.zx06)
CALL web_err(g_msg)
LET g_tryerr = g_tryerr + 1
IF l_gbt.gbt10 IS NOT NULL AND l_gbt.gbt10 > 0 THEN
LET l_zx.zx20 = l_zx.zx20 + 1
UPDATE zx_file SET zx20 = l_zx.zx20 WHERE zx01 = g_zx01
END IF
RETURN FALSE
END IF
IF cl_null(l_zx.zx17) THEN
LET l_zx.zx17 = 0
END IF
IF l_gbt.gbt01 = "2" AND l_gbt.gbt03 <> "0" THEN
LET l_zx.zx17 = l_zx.zx17 + 1
END IF
IF cl_null(l_zx.zx16) THEN
UPDATE zx_file SET zx16 = TODAY, zx17 = l_zx.zx17
WHERE zx01=g_zx01
ELSE
UPDATE zx_file SET zx17 = l_zx.zx17
WHERE zx01=g_zx01
END IF
IF l_gbt.gbt01 = "1" AND l_gbt.gbt02 <> "0" THEN
IF l_zx.zx16 + l_gbt.gbt02 < TODAY THEN
CALL web_err('Your password has expired! \nApply for a new password')
RETURN FALSE
END IF
IF l_zx.zx16 + l_gbt.gbt02 - l_gbt.gbt04 < TODAY THEN
LET ls_tmp = "Your password will be expired in ",
((l_zx.zx16 + l_gbt.gbt02) - TODAY) UNITS DAY,
" days.\nPlease update before been disable."
CALL web_err(ls_tmp)
END IF
END IF
IF l_gbt.gbt01 = "2" AND l_gbt.gbt03 <> "0" THEN
IF l_gbt.gbt03 < l_zx.zx17 THEN
CALL web_err('Your password has expired! Apply for a new password')
RETURN FALSE
END IF
IF l_gbt.gbt03 - l_zx.zx17 <= l_gbt.gbt04 THEN
LET ls_tmp = "Your password will be expired after next ",
(l_gbt.gbt03 - l_zx.zx17), " login times.\n",
"Please update before been disable."
CALL web_err(ls_tmp)
END IF
END IF
IF l_gbt.gbt10 IS NOT NULL AND l_gbt.gbt10 > 0 THEN
LET l_zx.zx19 = "N"
LET l_zx.zx20 = 0
UPDATE zx_file SET zx19 = l_zx.zx19, zx20 = l_zx.zx20
WHERE zx01 = g_zx01
END IF
RETURN TRUE
END FUNCTION
FUNCTION web_javasso(p_strSOK)
DEFINE p_strSOK STRING
DEFINE l_cmd STRING
DEFINE lch_cmd base.Channel
DEFINE l_user STRING
DEFINE l_str STRING
DEFINE l_xml STRING
DEFINE l_err_str STRING
DEFINE l_ch base.Channel,
l_xmlFile STRING,
l_doc om.DomDocument,
l_root om.DomNode,
l_list om.NodeList,
l_node om.DomNode
DEFINE l_i INTEGER
DEFINE l_file STRING
DEFINE channel base.Channel
DISPLAY "javasso time_begin:",TIME
LET l_cmd="sh ",FGL_GETENV("DS4GL"),"/bin/javasso/cmd.sh ",
p_strSOK ," 2>/dev/null"
LET lch_cmd = base.Channel.create()
CALL lch_cmd.openPipe(l_cmd, "r")
WHILE lch_cmd.read(l_str)
display l_str
LET l_xml = l_xml,l_str
END WHILE
CALL lch_cmd.close()
display "xml:",l_xml
display "l_cmd:",l_cmd
IF NOT cl_null(l_xml) THEN
LET l_ch = base.Channel.create()
LET l_xmlFile = fgl_getenv("TEMPDIR"), "/",
"ssoclient_", FGL_GETPID() USING '<<<<<<<<<<', ".xml"
display l_xmlFile
CALL l_ch.openFile(l_xmlFile, "w")
CALL l_ch.setDelimiter("")
CALL l_ch.write(l_xml)
CALL l_ch.close()
LET l_doc = om.DomDocument.createFromXmlFile(l_xmlFile)
INITIALIZE l_root TO NULL
IF l_doc IS NULL THEN
LET l_err_str = "Authentication of Single Sign-on failed!"
ELSE
LET l_root = l_doc.getDocumentElement()
LET l_list = l_root.selectByTagName("cas:user")
IF l_list.getLength() > 0 THEN
LET l_node = l_list.item(1)
LET l_node = l_node.getFirstChild()
LET l_user = l_node.getattribute("@chars")
ELSE
LET l_list = l_root.selectByTagName("cas:exception")
IF l_list.getLength() >0 THEN
LET l_node = l_list.item(1)
LET l_node = l_node.getFirstChild()
LET l_err_str = l_node.getattribute("@chars")
END IF
END IF
END IF
END IF
DISPLAY "javasso time_end:",TIME
IF cl_null(l_xml) THEN
LET l_err_str = "Authentication of Single Sign-on failed!"
END IF
LET l_file = "aws_ppcli-", TODAY USING 'YYYYMMDD', ".log"
LET channel = base.Channel.create()
CALL channel.setDelimiter(NULL)
CALL channel.openFile(l_file, "a")
IF STATUS = 0 THEN
CALL channel.setDelimiter("")
LET l_str = "#--------------------------- (", CURRENT YEAR TO SECOND, ") ----------------------------#"
CALL channel.write(l_str)
CALL channel.write("")
LET l_str = "Method: web_javasso."
CALL channel.write(l_str)
CALL channel.write("")
LET l_str = "SSO_SOAP:", FGL_GETENV("SSO_SOAP")
CALL channel.write(l_str)
CALL channel.write("")
LET l_str = "Request:", l_cmd
CALL channel.write(l_str)
CALL channel.write("")
LET l_str = "Response:", l_xml
CALL channel.write(l_str)
CALL channel.write("")
LET l_str = "exception:", l_err_str
CALL channel.write(l_str)
CALL channel.write("#------------------------------------------------------------------------------#")
CALL channel.write("")
CALL channel.close()
LET l_cmd = "chmod 666 ", l_file CLIPPED, " >/dev/null 2>/dev/null"
RUN l_cmd
ELSE
DISPLAY "Can't open log file."
END IF
CALL channel.close()
IF l_doc IS NULL THEN
RETURN "",""
END IF
RETURN l_user,l_err_str
END FUNCTION
FUNCTION web_err(ls_msg)
DEFINE ls_msg STRING
DEFINE lw_curr ui.Window
OPEN WINDOW w_err WITH FORM "lib/42f/cl_err_msg"
ATTRIBUTE(STYLE="show_log", TEXT="Warning")
LET lw_curr = ui.Window.getCurrent()
CALL lw_curr.setText("Warning")
CALL cl_set_comp_visible("group02", FALSE)
DISPLAY ls_msg CLIPPED TO ze03
MENU ""
ON IDLE 30
EXIT MENU
ON ACTION ok
EXIT MENU
END MENU
CLOSE WINDOW w_err
END FUNCTION
FUNCTION weblogin_ver_passwd()
DEFINE l_gbt RECORD LIKE gbt_file.*
DEFINE li_cnt LIKE type_file.num5
DEFINE li_ord LIKE type_file.num5
DEFINE ls_tmp STRING
LET ls_tmp = g_zx10 CLIPPED
SELECT * INTO l_gbt.* FROM gbt_file WHERE gbt00="0"
IF l_gbt.gbt05 > 0 THEN
IF ls_tmp.getLength() < l_gbt.gbt05 THEN RETURN FALSE END IF
END IF
IF l_gbt.gbt06 = "Y" OR l_gbt.gbt06 = "M" OR l_gbt.gbt06 = "S" THEN
IF ls_tmp.getIndexOf(g_user,1) THEN RETURN FALSE END IF
END IF
IF l_gbt.gbt06 = "M" OR l_gbt.gbt06 = "S" THEN
WHILE TRUE
FOR li_cnt=1 TO ls_tmp.getLength()
LET li_ord = ORD(ls_tmp.subString(li_cnt,li_cnt))
IF li_ord >= 48 AND li_ord <= 57 THEN
EXIT WHILE
END IF
END FOR
RETURN FALSE
END WHILE
END IF
IF l_gbt.gbt06 = "S" THEN
WHILE TRUE
FOR li_cnt=1 TO ls_tmp.getLength()
LET li_ord = ORD(ls_tmp.subString(li_cnt,li_cnt))
IF li_ord < 48 OR
(li_ord > 57 AND li_ord < 65) OR
(li_ord > 90 AND li_ord < 97) OR li_ord > 122 THEN
EXIT WHILE
END IF
END FOR
RETURN FALSE
END WHILE
END IF
RETURN TRUE
END FUNCTION
FUNCTION web_javaad(p_zx01, p_zx10)
DEFINE p_zx01 LIKE zx_file.zx01
DEFINE p_zx10 LIKE zx_file.zx10
DEFINE l_zx06 LIKE zx_file.zx06
DEFINE l_ze01 LIKE ze_file.ze01
DEFINE l_cmd STRING
DEFINE lch_cmd base.Channel
DEFINE l_status STRING
DEFINE l_str STRING
DEFINE l_xml STRING
DEFINE l_err_str STRING
DEFINE l_ch base.Channel,
l_xmlFile STRING,
l_doc om.DomDocument,
l_root om.DomNode,
l_list om.NodeList,
l_node om.DomNode
DEFINE l_ip STRING
DEFINE l_port STRING
DEFINE l_domain STRING
DEFINE l_file STRING
DEFINE channel base.Channel
LET l_err_str = ''
LET l_ip = FGL_GETENV("AD_ADDR")
LET l_domain = FGL_GETENV("AD_DOMAIN")
LET l_port = l_ip.subString(l_ip.getIndexOf(':', 1) + 1, l_ip.getLength())
LET l_ip = l_ip.subString(1, l_ip.getIndexOf(':', 1) - 1)
SELECT zx06 INTO l_zx06 FROM zx_file WHERE zx01 = p_zx01
IF cl_null(l_zx06) THEN
LET l_zx06 = g_lang
END IF
IF cl_null(l_ip) OR cl_null(l_port) OR cl_null(l_domain) THEN
LET l_err_str = cl_getmsg('azz1060', l_zx06)
ELSE
DISPLAY "javaad time_begin:",TIME
LET l_cmd = "web_check_ad_login(", p_zx01, " ", p_zx10, " ", l_ip, " ", l_port, " ", l_domain, ")"
LET l_xml = web_check_ad_login(p_zx01, p_zx10, l_ip, l_port, l_domain)
IF NOT cl_null(l_xml) THEN
LET l_ch = base.Channel.create()
LET l_xmlFile = fgl_getenv("TEMPDIR"), "/",
"javaad_", FGL_GETPID() USING '<<<<<<<<<<', ".xml"
DISPLAY l_xmlFile
CALL l_ch.openFile(l_xmlFile, "w")
CALL l_ch.setDelimiter("")
CALL l_ch.write(l_xml)
CALL l_ch.close()
LET l_doc = om.DomDocument.createFromXmlFile(l_xmlFile)
RUN "rm -f " || l_xmlFile || " >/dev/null 2>&1"
INITIALIZE l_root TO NULL
IF l_doc IS NULL THEN
LET l_err_str = cl_getmsg('azz1063', l_zx06)
ELSE
LET l_root = l_doc.getDocumentElement()
LET l_list = l_root.selectByTagName("status")
IF l_list.getLength() > 0 THEN
LET l_node = l_list.item(1)
LET l_node = l_node.getFirstChild()
LET l_status = l_node.getattribute("@chars")
END IF
IF l_status = '1' THEN
RETURN ''
END IF
CASE l_status
WHEN '0'
LET l_ze01 = 'azz1061'
WHEN '2'
LET l_ze01 = 'azz1062'
WHEN '3'
LET l_ze01 = 'azz1064'
WHEN '525'
LET l_ze01 = 'azz1065'
WHEN '52e'
LET l_ze01 = 'azz1066'
WHEN '530'
LET l_ze01 = 'azz1067'
WHEN '532'
LET l_ze01 = 'azz1068'
WHEN '533'
LET l_ze01 = 'azz1069'
WHEN '701'
LET l_ze01 = 'azz1070'
WHEN '773'
LET l_ze01 = 'azz1071'
OTHERWISE
LET l_ze01 = l_status
LET l_list = l_root.selectByTagName("status")
IF l_list.getLength() > 0 THEN
LET l_node = l_list.item(1)
LET l_err_str = l_node.getattribute("description")
END IF
END CASE
IF cl_null(l_err_str) THEN
LET l_err_str = cl_getmsg(l_ze01, l_zx06)
END IF
IF cl_null(l_err_str) THEN
LET l_err_str = "p_ze no error message description.\n(p_ze:", l_ze01, "; lang: ", l_zx06, "; User account: ", p_zx01, ")"
END IF
END IF
END IF
DISPLAY "javaad time_end:",TIME
END IF
IF cl_null(l_err_str) THEN
LET l_err_str = 'web_javaad run failed!'
END IF
LET l_file = "weblogin_ad-", TODAY USING 'YYYYMMDD', ".log"
LET channel = base.Channel.create()
CALL channel.openFile(l_file, "a")
IF STATUS = 0 THEN
CALL channel.setDelimiter("")
LET l_str = "#--------------------------- (", CURRENT YEAR TO SECOND, ") ----------------------------#"
CALL channel.write(l_str)
CALL channel.write("")
LET l_str = "Method: Weblogin AD Certification."
CALL channel.write(l_str)
CALL channel.write("")
LET l_str = "Request:", cl_replace_str(l_cmd, p_zx01 || " " || p_zx10, p_zx01 || " " || "*****")
CALL channel.write(l_str)
CALL channel.write("")
LET l_str = "Response:", l_xml
CALL channel.write(l_str)
CALL channel.write("")
LET l_str = "l_err_str:", l_err_str
CALL channel.write(l_str)
CALL channel.write("#------------------------------------------------------------------------------#")
CALL channel.write("")
CALL channel.close()
LET l_cmd = "chmod 666 ", l_file CLIPPED, " >/dev/null 2>/dev/null"
RUN l_cmd
ELSE
DISPLAY "Can't open log file."
END IF
RETURN l_err_str
END FUNCTION
FUNCTION web_check_ad_login(p_zx01, p_zx10, p_ip, p_port, p_domain)
DEFINE p_zx01 STRING
DEFINE p_zx10 STRING
DEFINE p_ip STRING
DEFINE p_port STRING
DEFINE p_domain STRING
DEFINE l_adpar java.util.Hashtable
DEFINE l_user STRING
DEFINE l_sb java.lang.StringBuffer
DEFINE l_err STRING
DEFINE l_ad_path STRING
DEFINE l_result STRING
DEFINE l_control ARRAY [] OF javax.naming.ldap.Control
DEFINE l_ctx javax.naming.ldap.InitialLdapContext
LET l_err = ""
LET l_result = ""
LET l_adpar = Hashtable.create()
LET l_user = p_zx01 CLIPPED, "@", p_domain.trim()
TRY
LET l_ad_path = web_get_ad_path(p_domain)
LET l_sb = StringBuffer.create()
CALL l_sb.append("LDAP://")
CALL l_sb.append(p_ip);
CALL l_sb.append(":");
CALL l_sb.append(p_port);
CALL l_sb.append("/");
CALL l_sb.append(l_ad_path);
CALL l_adpar.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory");
CALL l_adpar.put("java.naming.provider.url", l_sb.toString());
CALL l_adpar.put("java.naming.security.authentication", "simple");
CALL l_adpar.put("java.naming.security.principal", l_user);
CALL l_adpar.put("java.naming.security.credentials", p_zx10);
CATCH
LET l_result = "<status>4</status> \n"
LET l_result = l_result, "<description>", ERR_GET(STATUS), "</description>"
RETURN l_result
END TRY
TRY
LET l_ctx = InitialLdapContext.create(l_adpar, l_control)
LET l_err = "1"
CATCH
LET l_err = ERR_GET(STATUS)
IF l_err.getIndexOf("Connection refused", 1) > 0 AND
l_err.getIndexOf(p_ip || ":" || p_port, 1) > 0 THEN
LET l_err = "3"
ELSE
LET l_err = l_err.subString(l_err.getIndexOf("data", 1) + 5, l_err.getIndexOf("data", 1) + 7)
END IF
END TRY
IF l_err = "1" THEN
LET l_result = ""
ELSE
LET l_result = cl_replace_str(ERR_GET(STATUS), "\n", "")
END IF
LET l_result = '<status description="', l_result, '">'
LET l_result = l_result, l_err.trim(), "</status>"
RETURN l_result
END FUNCTION
FUNCTION web_get_ad_path(p_domain)
DEFINE p_domain STRING
DEFINE l_domain_path STRING
DEFINE l_tok base.StringTokenizer
LET l_domain_path = ""
LET l_tok = base.StringTokenizer.create(p_domain, ".")
WHILE l_tok.hasMoreTokens()
LET l_domain_path = l_domain_path, "DC=", l_tok.nextToken(), ","
END WHILE
IF NOT cl_null(l_domain_path) THEN
LET l_domain_path = l_domain_path.subString(1, l_domain_path.getLength() - 1)
END IF
LET l_domain_path = l_domain_path.trim()
RETURN l_domain_path
END FUNCTION
FUNCTION weblogin_def(p_chk)
DEFINE p_chk LIKE type_file.chr1
DEFINE l_result LIKE type_file.chr1000
DEFINE l_result1 LIKE type_file.chr1000
DEFINE l_cnt LIKE type_file.num5
LET g_zx01 = ''
LET g_zx10 = ''
CASE p_chk
WHEN '1'
CALL ui.interface.frontCall("standard","getenv","COMPUTERNAME",l_result)
CALL ui.interface.frontCall("standard","getenv","USERNAME",l_result1)
SELECT tc_zx01,tc_zx04,tc_zx05 INTO g_zx01,g_zx10,g_chk FROM tc_zx_file WHERE tc_zx02 = l_result
AND tc_zx03 = l_result1
IF g_chk = 'N' THEN
LET g_zx10 = ''
END IF
IF cl_null(g_chk) THEN
LET g_zx01 = ''
LET g_zx10 = ''
LET g_chk = 'N'
END IF
WHEN '2'
CALL ui.interface.frontCall("standard","getenv","COMPUTERNAME",l_result)
CALL ui.interface.frontCall("standard","getenv","USERNAME",l_result1)
LET l_cnt = 0
SELECT count(1) INTO l_cnt FROM tc_zx_file WHERE tc_zx02 = l_result
AND tc_zx03 = l_result1
IF cl_null(l_cnt) THEN LET l_cnt = 0 END IF
IF l_cnt >0 THEN
UPDATE tc_zx_file SET tc_zx01 = g_zx01,
tc_zx04 = g_zx10,
tc_zx05 = g_chk
WHERE tc_zx02 = l_result
AND tc_zx03 = l_result1
ELSE
INSERT INTO tc_zx_file VALUES(g_zx01,l_result,l_result1,g_zx10,g_chk)
END IF
END CASE
END FUNCTION
FUNCTION weblogin_forget()
DEFINE ls_tmp STRING
DEFINE lc_gbt08 LIKE gbt_file.gbt08
DEFINE lc_zx10_old LIKE zx_file.zx10
DEFINE g_mail_chk LIKE type_file.chr100
DEFINE g_mail_chk_t LIKE type_file.chr100
DEFINE l_success LIKE type_file.num5
OPEN WINDOW webpasswd_w WITH FORM "azz/42f/webpasswd1"
ATTRIBUTE(STYLE = "login" CLIPPED)
CALL cl_ui_init()
LET g_mail_chk = ''
LET g_mail_chk_t = ''
INPUT g_zx01,g_zx09,g_mail_chk,g_zx10_new, g_zx10_ver WITHOUT DEFAULTS
FROM FORMONLY.zx01,FORMONLY.zx09,FORMONLY.mail_chk, FORMONLY.zx10_new, FORMONLY.zx10_ver
BEFORE INPUT
DISPLAY g_zx01 TO FORMONLY.zx01
AFTER FIELD mail_chk
IF g_mail_chk <> g_mail_chk_t THEN
ERROR "验证码错误"
next field mail_chk
END IF
AFTER FIELD zx01
IF cl_null(g_zx01) THEN
NEXT FIELD g_zx01
else
LET g_mail_chk_t = ''
SELECT zx09 INTO g_zx09 FROM zx_file WHERE zx01 = g_zx01
DISPLAY g_zx09 TO FORMONLY.zx09
END IF
AFTER FIELD zx09
IF cl_null(g_zx09) THEN
NEXT FIELD g_zx09
END IF
AFTER INPUT
IF INT_FLAG THEN
EXIT INPUT
END IF
IF g_zx10_new <> g_zx10_ver THEN
CALL cl_err('New password verify failed.', '!', 1)
NEXT FIELD zx10_new
END IF
LET ls_tmp = g_zx10_new
IF ls_tmp.getLength() > 20 THEN
CALL cl_err('New password Exceed Maximum Length(20 symbols).', '!', 1)
NEXT FIELD zx10_new
END IF
{
CASE weblogin_ver_passwd()
WHEN "1"
CALL cl_err('New password too short to use.', '!', 1)
NEXT FIELD zx10_new
WHEN "2"
CALL cl_err('New password cannot include account.', '!', 1)
NEXT FIELD zx10_new
WHEN "3"
CALL cl_err('New password should include numerical.', '!', 1)
NEXT FIELD zx10_new
WHEN "4"
CALL cl_err('New password should include symbol.', '!', 1)
NEXT FIELD zx10_new
END CASE}
{
IF g_zx10_old = g_zx10_new THEN
SELECT gbt08 INTO lc_gbt08 FROM gbt_file WHERE gbt00 = "0"
IF STATUS OR lc_gbt08 IS NULL THEN LET lc_gbt08 = "Y" END IF
IF lc_gbt08 = "N" THEN
CALL cl_err('New password should be different with old one.', '!', 1)
NEXT FIELD zx10_new
END IF
END IF}
ON IDLE g_idle_seconds
CALL cl_err_msg(NULL,"!","Exceed Than System Allowed Idle Time.\n Fail in Updating Password.\n Do it One More Time.",20)
EXIT PROGRAM
CONTINUE INPUT
ON ACTION chk
CALL weblogin_chkmial() RETURNING l_success,g_mail_chk_t
IF l_success THEN
CALL cl_err('邮件发送成功', '!', 1)
NEXT FIELD mail_chk
ELSE
CALL cl_err('邮件发送失败,请联系管理员', '!', 1)
END IF
END INPUT
IF INT_FLAG THEN
LET INT_FLAG = FALSE
EXIT PROGRAM
END IF
IF g_mail_chk <> g_mail_chk_t OR cl_null(g_mail_chk) OR cl_null(g_mail_chk_t) THEN
CALL cl_err('验证码错误.', '!', 1)
CLOSE WINDOW webpasswd_w
RETURN FALSE
ELSE
LET g_zx10_new = cl_user_encode(g_zx10_new)
IF cl_null(g_zx10_new) THEN
CALL cl_err('Password encode error.', '!', 1)
CLOSE WINDOW webpasswd_w
RETURN FALSE
ELSE
UPDATE zx_file SET zx10 = g_zx10_new,
zx16 = TODAY,
zx17 = 0,
zx19 = 'N'
WHERE zx01 = g_zx01
CALL cl_err('OK', 'czz-110', 1)
END IF
CLOSE WINDOW webpasswd_w
RETURN TRUE
END IF
CLOSE WINDOW webpasswd_w
RETURN FALSE
END FUNCTION
FUNCTION weblogin_chkmial()
DEFINE l_result1 LIKE type_file.chr1000
DEFINE p_chk LIKE type_file.chr100
DEFINE l_cmd STRING
DEFINE l_top STRING
DEFINE l_tempdir STRING
DEFINE res LIKE type_file.num5
DEFINE l_xml RECORD
file STRING,
mailserver STRING,
serverport STRING,
user STRING,
passwd STRING,
checkauth LIKE type_file.chr1,
subject STRING,
body STRING,
attach STRING,
recipient STRING,
cc STRING,
bcc STRING,
sender STRING
END RECORD
DEFINE l_mlj RECORD LIKE mlj_file.*
DEFINE l_str STRING
DEFINE lc_channel base.Channel
DEFINE l_cnt LIKE type_file.num5
DEFINE
ch base.Channel,
l_status SMALLINT,
l_index SMALLINT,
l_temp STRING,
l_text STRING
INITIALIZE l_xml.* TO NULL
INITIALIZE l_mlj.* TO NULL
SELECT * INTO l_mlj.* FROM mlj_file WHERE mlj01 = "DEFAULT"
LET res = 1
LET l_cnt = 0
SELECT count(1) INTO l_cnt FROM zx_file WHERE zx01 = g_zx01 AND zx09 = g_zx09
IF l_cnt = 0 OR cl_null(l_cnt) THEN
RETURN FALSE,0
END IF
SELECT RANDOM INTO l_result1 FROM V_RANDOM
LET l_tempdir =fgl_getenv("TEMPDIR")
LET l_top = fgl_getenv("TOP")
LET l_xml.file = l_result1 CLIPPED,'.xml'
LET l_xml.mailserver = l_mlj.mlj03
LET l_xml.serverport = l_mlj.mlj04
LET l_xml.user = l_mlj.mlj05
LET l_xml.passwd = l_mlj.mlj06
LET l_xml.checkauth = l_mlj.mlj08
LET l_xml.subject ='ERP账号找回验证码'
LET lc_channel = base.Channel.create()
LET l_str = os.Path.join(l_tempdir CLIPPED,l_result1 CLIPPED)
CALL lc_channel.openFile(l_str, "w")
CALL lc_channel.setDelimiter("")
LET l_str = "您的验证码为:",l_result1
CALL lc_channel.write(l_str CLIPPED)
CALL lc_channel.close()
LET l_xml.body = l_tempdir CLIPPED,'/',l_result1 CLIPPED
LET l_xml.recipient = g_zx09
LET l_xml.sender = 'aaa@qq.com'
LET lc_channel = base.Channel.create()
LET l_str = os.Path.join(l_tempdir CLIPPED,l_xml.file CLIPPED)
CALL lc_channel.openFile(l_str, "w")
CALL lc_channel.setDelimiter("")
CALL lc_channel.write("<?xml version=""1.0"" encoding=""UTF-8""?>")
CALL lc_channel.write("<Mail>")
CALL lc_channel.write("<Protocol>smtp</Protocol>")
LET l_str = '<CheckAuth>',l_xml.checkauth CLIPPED,'</CheckAuth>'
CALL lc_channel.write(l_str CLIPPED)
LET l_str = '<MailServer>',l_xml.mailserver CLIPPED,'</MailServer>'
CALL lc_channel.write(l_str CLIPPED)
LET l_str = '<MailServerPort>',l_xml.serverport CLIPPED,'</MailServerPort>'
CALL lc_channel.write(l_str CLIPPED)
LET l_str = '<MailServerUser>',l_xml.user CLIPPED,'</MailServerUser>'
CALL lc_channel.write(l_str CLIPPED)
LET l_str = '<MailServerUserPassword>',l_xml.passwd CLIPPED,'</MailServerUserPassword>'
CALL lc_channel.write(l_str CLIPPED)
Let l_str = '<Subject>',l_xml.subject CLIPPED,'</Subject>'
CALL lc_channel.write(l_str CLIPPED)
IF NOT cl_null(l_xml.body) THEN
LET l_str = '<MessageBody>',l_xml.body CLIPPED,'</MessageBody>'
CALL lc_channel.write(l_str CLIPPED)
END IF
LET l_str = '<Recipient>',l_xml.recipient CLIPPED,'</Recipient>'
CALL lc_channel.write(l_str CLIPPED)
LET l_str = '<From>',l_xml.sender CLIPPED,'</From>'
CALL lc_channel.write(l_str CLIPPED)
CALL lc_channel.write("</Mail>")
CALL lc_channel.close()
LET l_cmd="chmod 777 ",os.Path.join(l_tempdir CLIPPED,l_xml.file CLIPPED)," 2>/dev/null"
RUN l_cmd
LET l_cmd="sh ",l_top CLIPPED,"/ds4gl2/bin/javamail/UnixMailSender.bat ",
os.Path.join(l_tempdir CLIPPED,l_xml.file CLIPPED)," >/u1/out/caozq.txt"
RUN l_cmd IN FORM MODE RETURNING res
if res = 0 then
let l_str = "Send ok"
else
let l_str = "Send fail"
end if
SLEEP 1
LET ch = base.Channel.create()
CALL ch.openFile('/u1/out/caozq.txt','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
RETURN TRUE,l_result1
else
RETURN FALSE,l_result1
END IF
END FUNCTION