modules/admin-full: rework wifi CBI maps
[project/luci.git] / modules / admin-full / luasrc / model / cbi / admin_network / wifi.lua
index 87f7d8e..fdeea99 100644 (file)
@@ -17,7 +17,6 @@ local nw = require "luci.model.network"
 local fs = require "nixio.fs"
 
 arg[1] = arg[1] or ""
-arg[2] = arg[2] or ""
 
 m = Map("wireless", "",
        translate("The <em>Device Configuration</em> section covers physical settings of the radio " ..
@@ -30,24 +29,25 @@ m:chain("network")
 local ifsection
 
 function m.on_commit(map)
-       local wnet = nw:get_wifinet(arg[2])
+       local wnet = nw:get_wifinet(arg[1])
        if ifsection and wnet then
                ifsection.section = wnet.sid
-               m.title = wnet:get_i18n()
+               m.title = luci.util.pcdata(wnet:get_i18n())
        end
 end
 
 nw.init(m.uci)
 
-local wnet = nw:get_wifinet(arg[2])
+local wnet = nw:get_wifinet(arg[1])
+local wdev = wnet and wnet:get_device()
 
 -- redirect to overview page if network does not exist anymore (e.g. after a revert)
-if not wnet then
+if not wnet or not wdev then
        luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless"))
        return
 end
 
-m.title = wnet:get_i18n()
+m.title = luci.util.pcdata(wnet:get_i18n())
 
 
 local iw = luci.sys.wifi.getiwinfo(arg[1])
@@ -55,7 +55,7 @@ local tx_powers = iw.txpwrlist  or { }
 local hw_modes  = iw.hwmodelist or { }
 
 
-s = m:section(NamedSection, arg[1], "wifi-device", translate("Device Configuration"))
+s = m:section(NamedSection, wdev:name(), "wifi-device", translate("Device Configuration"))
 s.addremove = false
 
 s:tab("general", translate("General Setup"))
@@ -70,7 +70,7 @@ back.titleref = luci.dispatcher.build_url("admin", "network", "wireless")
 
 st = s:taboption("general", DummyValue, "__status", translate("Status"))
 st.template = "admin_network/wifi_status"
-st.ifname   = arg[2]
+st.ifname   = arg[1]
 
 en = s:taboption("general", Flag, "disabled", translate("Enable device"))
 en.enabled = "0"
@@ -82,11 +82,11 @@ function en.cfgvalue(self, section)
 end
 
 
-local hwtype = m:get(arg[1], "type")
-local htcaps = m:get(arg[1], "ht_capab") and true or false
+local hwtype = wdev:get("type")
+local htcaps = wdev:get("ht_capab") and true or false
 
 -- NanoFoo
-local nsantenna = m:get(arg[1], "antenna")
+local nsantenna = wdev:get("antenna")
 
 ch = s:taboption("general", Value, "channel", translate("Channel"))
 ch:value("auto", translate("auto"))
@@ -276,7 +276,7 @@ s = m:section(NamedSection, wnet.sid, "wifi-iface", translate("Interface Configu
 ifsection = s
 s.addremove = false
 s.anonymous = true
-s.defaults.device = arg[1]
+s.defaults.device = wdev:name()
 
 s:tab("general", translate("General Setup"))
 s:tab("encryption", translate("Wireless Security"))
@@ -593,19 +593,70 @@ port:depends({mode="ap-wds", encryption="wpa"})
 port:depends({mode="ap-wds", encryption="wpa2"})
 port.rmempty = true
 
-key = s:taboption("encryption", Value, "key", translate("Key"))
-key:depends("encryption", "wep-open")
-key:depends("encryption", "wep-shared")
-key:depends("encryption", "psk")
-key:depends("encryption", "psk2")
-key:depends("encryption", "psk+psk2")
-key:depends("encryption", "psk-mixed")
-key:depends({mode="ap", encryption="wpa"})
-key:depends({mode="ap", encryption="wpa2"})
-key:depends({mode="ap-wds", encryption="wpa"})
-key:depends({mode="ap-wds", encryption="wpa2"})
-key.rmempty = true
-key.password = true
+wpakey = s:taboption("encryption", Value, "_wpa_key", translate("Key"))
+wpakey:depends("encryption", "psk")
+wpakey:depends("encryption", "psk2")
+wpakey:depends("encryption", "psk+psk2")
+wpakey:depends("encryption", "psk-mixed")
+wpakey:depends({mode="ap", encryption="wpa"})
+wpakey:depends({mode="ap", encryption="wpa2"})
+wpakey:depends({mode="ap-wds", encryption="wpa"})
+wpakey:depends({mode="ap-wds", encryption="wpa2"})
+wpakey.datatype = "wpakey"
+wpakey.rmempty = true
+wpakey.password = true
+
+wpakey.cfgvalue = function(self, section, value)
+       local key = m.uci:get("wireless", section, "key")
+       if key == "1" or key == "2" or key == "3" or key == "4" then
+               return nil
+       end
+       return key
+end
+
+wpakey.write = function(self, section, value)
+       self.map.uci:set("wireless", section, "key", value)
+       self.map.uci:delete("wireless", section, "key1")
+end
+
+
+wepslot = s:taboption("encryption", ListValue, "_wep_key", translate("Used Key Slot"))
+wepslot:depends("encryption", "wep-open")
+wepslot:depends("encryption", "wep-shared")
+wepslot:value("1", translatef("Key #%d", 1))
+wepslot:value("2", translatef("Key #%d", 2))
+wepslot:value("3", translatef("Key #%d", 3))
+wepslot:value("4", translatef("Key #%d", 4))
+
+wepslot.cfgvalue = function(self, section)
+       local slot = tonumber(m.uci:get("wireless", section, "key"))
+       if not slot or slot < 1 or slot > 4 then
+               return 1
+       end
+       return slot
+end
+
+wepslot.write = function(self, section, value)
+       self.map.uci:set("wireless", section, "key", value)
+end
+
+local slot
+for slot=1,4 do
+       wepkey = s:taboption("encryption", Value, "key" .. slot, translatef("Key #%d", slot))
+       wepkey:depends("encryption", "wep-open")
+       wepkey:depends("encryption", "wep-shared")
+       wepkey.datatype = "wepkey"
+       wepkey.rmempty = true
+       wepkey.password = true
+
+       function wepkey.write(self, section, value)
+               if value and (#value == 5 or #value == 13) then
+                       value = "s:" .. value
+               end
+               return Value.write(self, section, value)
+       end
+end
+
 
 if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then
        nasid = s:taboption("encryption", Value, "nasid", translate("NAS ID"))