Work around OpenWRT / Busybox shadow password quirks
[project/luci.git] / libs / sys / luasrc / sys.lua
index b3155c8..0bf92e9 100644 (file)
@@ -437,11 +437,23 @@ function user.checkpasswd(username, password)
        local account = user.getuser(username)
 
        if account then
-               if account.passwd == "!" then
-                       return true
-               else
-                       return (account.passwd == posix.crypt(password, account.passwd))
+               local pwd = account.passwd
+               local shadowpw
+               if #pwd == 1 then
+                       for l in io.lines("/etc/shadow") do
+                               shadowpw = l:match("^%s:([^:]+)" % username)
+                               if shadowpw then
+                                       pwd = shadowpw
+                                       break
+                               end
+                       end
+
+                       if pwd == "!" then
+                               return true
+                       end
                end
+
+               return (pwd == posix.crypt(password, pwd))
        end
 end