####################################################
# by wiebe @ QuakeNet
#
####################################################


####################################################
# newpass:help:msg
####################################################
bind msgm fvlomn|fvlomn "help newpass" newpass:help:msgm
proc newpass:help:msgm { n u h t } {
  if {[matchattr $h bkZ]} { return 0 }
  lappend o "newpass: usage newpass <oldpassword> <newpassword> <newpassword>"
  lappend o "newpass: changes your password. the newpassword must be: 1) at least 7 chars long   2) at least one digit   3) at least one upper case letter"
#   4) at least 3 or more lower case letters   5) at least one non alphanumeric character (any char other than a-z A-Z 0-9)   6) at least 6 alphanumeric chars (a-z A-Z 0-9)
  if {[string equal [info procs cnotice] ""]} { foreach l $o { puthelp "NOTICE $n :$l" }
  } else { foreach l $o { cnotice $n $l puthelp "newpass: " } }
  putcmdlog "($n!$u) !$h! help newpass"
  return 1
}


####################################################
# newpass:msg
####################################################
bind msg fvlomn|fvlomn newpass newpass:msg
proc newpass:msg { n u h t } {
  if {[matchattr $h bkZ]} { return 0 }
  set o [newpass:newpass $h $t]
  if {[string equal [info procs cnotice] ""]} { foreach l $o { puthelp "NOTICE $n :$l" }
  } else { foreach l $o { cnotice $n $l puthelp "newpass: " } }
  putcmdlog "($n!$u) !$h! newpass \[something\]"
}


####################################################
# newpass:newpass
####################################################
proc newpass:newpass { h t } {
  set t [split $t]; set p [lindex $t 0]; set x [lindex $t 1]; set y [lindex $t 2]
  if {[matchattr $h b]} { putlog "newpass: a bot using newpass command?"; return "" }
  if {[passwdok $h -]} {
    set p [string range [md5 "[rand 999999999] $h $t [clock seconds] [dcclist]"] 0 9]
    lappend o "newpass: your password has been set to '$p' - you must change it at once!"
    lappend o "/msg $::botnick newpass $p <newpassword> <newpassword>"
    lappend o "newpass: the new password must be at least 6 chars long. mixing lower & upper case letters, digits and special chars."
    setuser $h PASS $p
  } elseif {[string equal $y ""]} {
    lappend o "newpass: usage newpass <oldpassword> <newpassword> <newpassword>"
  } elseif {![passwdok $h $p]} {
    lappend o "newpass: password incorrect."
  } elseif {![string equal $x $y]} {
    lappend o "newpass: the new passwords do not match."
    lappend o "newpass: usage newpass <oldpassword> <newpassword> <newpassword>"
  } elseif {![newpass:valid $h $x]} {
  lappend o "newpass: changes your password. the newpassword must be: 1) at least 7 chars long   2) at least one digit   3) at least one upper case letter"
#   4) at least 3 or more lower case letters   5) at least one non alphanumeric character (any char other than a-z A-Z 0-9)   6) at least 6 alphanumeric chars (a-z A-Z 0-9)
  } else {
    setuser $h PASS $x
    lappend o "newpass: your password has been changed."
  }
  return $o
}


####################################################
# newpass:valid
####################################################
proc newpass:valid { h p } {
  regsub -all {[][\\^$.|?*+(){}]} $h {\\\0} h
  if {[regexp $h $p]} { return 0 }
  if {![regexp {[^\n]{7,}} $p]} { return 0 }
  if {![regexp \d+ $p]} { return 0 }
  if {![regexp {[A-Z]{1,}} $p]} { return 0 }
#  if {![regexp {[a-z]{3,}} $p]} { return 0 }
#  if {![regexp {[^a-zA-Z0-9]+} $p]} { return 0 }
#  if {![regexp {[a-zA-Z0-9]{6,}} $p]} { return 0 }
  return 1
}


set scriptdb(newpass) {
  "provides newpass command"
}

