# == Schema Information
#
# Table name: access_control_lists
#
#  id           :integer          not null, primary key
#  policy       :string(255)
#  protocol     :string(255)
#  src_ip       :string(255)
#  scr_bitmask  :string(255)
#  src_port     :string(255)
#  acl_group_id :integer
#  created_at   :datetime
#  updated_at   :datetime
#  dst_ip       :string(255)
#  dst_bitmask  :string(255)
#  dst_port     :string(255)
#

class AccessControlList < ActiveRecord::Base
	belongs_to :acl_group
  include PublicActivity::Model
	SRC_INTERFACE_TYPES_ARR = ["All", "Wired", "Wireless(Bridge)", "Wireless(Router)", "Mobile Broadband"]
  before_save :check_and_update_uplinks_type_value

   APPLICATION_ARR = ["All", "Bitcoin", "Chat", "Cloud", "Collabaration", "Database", "Download FileTransfer", "Gaming", "Mail", "Media Streaming", "Network", "Remote Access", "RPC", "SocialMedia", "Streaming", "System", "VOIP", "VPN", "Web"]

   SERVICES = { "Databases & Cloud Services" => ["Amazon RDS", " Amazon Redshift", " Azure", " IBM Cloud", " SAP Cloud Platform", "SAP Hana"]}  

   APP_HSH = {"All"=>["All"], "Bitcoin"=>["mining","All"], "Chat"=>["signal", "qq", "irc", "unencrypted_jabber", "oscar", "whatsapp", "telegram", "kakaotalk", "wechat","All"], "Cloud"=>["nestlogsink", "http_activesync", "dropbox", "appleicloud", "ubuntuone", "microsoft", "googledrive", "cloudflare", "ms_onedrive", "lisp", "applepush","All"], "Collabaration"=>["slack", "lotusnotes", "github", "microsoft365", "git", "pastebin", "googledocs", "teams","All"], "Database"=>["postgresql", "mysql", "mssql-tds", "oracle", "redis", "drda","All"], "Download FileTransfer"=>["ftp_control", "nfs", "direct_download_link", "applejuice", "directconnect", "openft", "fasttrack", "gnutella", "edonkey", "bittorrent", "http_download", "thunder", "soulseek", "tftp", "afp", "stealthnet", "aimini", "checkmk", "rsync", "ftp_data", "smpp", "whatsappfiles","All"], "Gaming"=>["xbox", "battlefield", "steam", "halflife2", "worldofwarcraft", "armagetron", "dofus", "fiesta", "florensia", "guildwars", "maplestory", "warcraft3", "worldofkungfu", "nintendo", "starcraft", "playstation", "csgo","All"], "Mail"=>["pop3", "smtp", "imap", "hotmail", "pops", "smtps", "imaps", "gmail","All"], "Media Streaming"=>["kontiki", "rtsp", "icecast", "pplive", "ppstream", "zattoo", "shoutcast", "sopcast", "tvants", "tvuplayer", "qqlive", "ps_vue", "rtp", "youtube", "netflix", "lastfm", "youtubeupload", "spotify", "rtmp", "vevo", "twitch", "mpeg_ts", "iflix", "deezer", "ocs", "soundcloud", "amazonvideo","All"], "Network"=>["dns", "mdns", "bgp", "snmp", "dhcp", "ntop", "facebookzero", "ubntac2", "memcached", "modbus", "ayiya", "vrrp", "stun", "gre", "icmp", "igmp", "egp", "sctp", "ospf", "ip_in_ip", "icmpv6", "dhcpv6", "kerberos", "netflow", "sflow", "citrix", "radius", "sap", "gtp", "upnp", "llmnr", "remotescan", "whois-das", "eaq", "ookla", "doh_dot", "dnscrypt", "teredo", "opendns", "diameter", "targus", "dnp3", "iec60870", "bloomberg", "capwap", "zabbix", "s7comm","All"], "Remote Access"=>["xdmcp", "vmware", "rdp", "vnc", "pcanywhere", "ssh", "teamviewer", "telnet","All"], "RPC"=>["coap", "nats", "crossfire", "dce_rpc", "corba", "zeromq", "mqtt", "rx", "someip", "fix", "amqp","All"], "SocialMedia"=>["tiktok", "googleplus", "facebook", "twitter", "snapchat", "sina(weibo)", "instagram", "linkedin", "All"], "Streaming"=>["hulu", "appleitunes", "pandora","All"], "System"=>["ipp", "ntp", "netbios", "ssdp", "smbv1", "syslog", "smbv23", "ldap", "windowsupdate", "collectd", "bjnp", "applestore", "playstore","All"], "VOIP"=>["skypecall", "whatsappcall", "mgcp", "iax", "sip", "truphone", "skype", "webex", "viber", "tuenti", "messenger", "h323", "noe", "teamspeak", "ciscoskinny", "rtcp", "megaco", "vhua", "zoom", "kakaotalk_voice", "googlehangoutduo", "free_205", "imo","All"], "VPN"=>["ipsec", "pptp", "openvpn", "ciscovpn", "tor", "wireguard", "tinc", "hotspotshield","All"], "Web"=>["http", "datasaver", "yahoo", "tls", "usenet", "googlemaps", "google", "http_connect", "http_proxy", "waze", "ajp", "apple", "socks", "wikipedia", "amazon", "ebay", "cnn", "pando_media_booster", "quic", "googleservices", "websocket","All"]}

    ACL = {"All"=>"00", "mining"=>"2a", "signal"=>"27", "qq"=>"30", "irc"=>"41", "unencrypted_jabber"=>"43", "oscar"=>"45", "whatsapp"=>"8e", "telegram"=>"b9", "kakaotalk"=>"c1", "wechat"=>"c5", "nestlogsink"=>"2b", "http_activesync"=>"6e", "dropbox"=>"79", "appleicloud"=>"8f", "ubuntuone"=>"a9", "microsoft"=>"d4", "googledrive"=>"d9", "cloudflare"=>"dc", "ms_onedrive"=>"dd", "lisp"=>"ec", "applepush"=>"ee", "slack"=>"76", "lotusnotes"=>"96", "github"=>"cb", "microsoft365"=>"db", "git"=>"e2", "pastebin"=>"e8", "googledocs"=>"f1", "teams"=>"fa", "postgresql"=>"13", "mysql"=>"14", "mssql-tds"=>"72", "oracle"=>"a7", "redis"=>"b6", "drda"=>"e3", "ftp_control"=>"01", "nfs"=>"0b", "direct_download_link"=>"16", "applejuice"=>"18", "directconnect"=>"19", "openft"=>"21", "fasttrack"=>"22", "gnutella"=>"23", "edonkey"=>"24", "bittorrent"=>"25", "http_download"=>"3c", "thunder"=>"3e", "soulseek"=>"3f", "tftp"=>"60", "afp"=>"61", "stealthnet"=>"62", "aimini"=>"63", "checkmk"=>"8a", "rsync"=>"a6", "ftp_data"=>"af", "smpp"=>"cf", "whatsappfiles"=>"f2", "xbox"=>"2f", "battlefield"=>"47", "steam"=>"4a", "halflife2"=>"4b", "worldofwarcraft"=>"4c", "armagetron"=>"68", "dofus"=>"6a", "fiesta"=>"6b", "florensia"=>"6c", "guildwars"=>"6d", "maplestory"=>"71", "warcraft3"=>"74", "worldofkungfu"=>"75", "nintendo"=>"ad", "starcraft"=>"d5", "playstation"=>"e7", "csgo"=>"eb", "pop3"=>"02", "smtp"=>"03", "imap"=>"04", "hotmail"=>"15", "pops"=>"17", "smtps"=>"1d", "imaps"=>"33", "gmail"=>"7a", "kontiki"=>"20", "rtsp"=>"32", "icecast"=>"34", "pplive"=>"35", "ppstream"=>"36", "zattoo"=>"37", "shoutcast"=>"38", "sopcast"=>"39", "tvants"=>"3a", "tvuplayer"=>"3b", "qqlive"=>"3d", "ps_vue"=>"40", "rtp"=>"57", "youtube"=>"7c", "netflix"=>"85", "lastfm"=>"86", "youtubeupload"=>"88", "spotify"=>"9c", "rtmp"=>"ae", "vevo"=>"ba", "twitch"=>"c3", "mpeg_ts"=>"c6", "iflix"=>"ca", "deezer"=>"d2", "ocs"=>"da", "soundcloud"=>"ea", "amazonvideo"=>"f0", "dns"=>"05", "mdns"=>"08", "bgp"=>"0d", "snmp"=>"0e", "dhcp"=>"12", "ntop"=>"1a", "facebookzero"=>"1e", "ubntac2"=>"1f", "memcached"=>"28", "modbus"=>"2c", "ayiya"=>"42", "vrrp"=>"49", "stun"=>"4e", "gre"=>"50", "icmp"=>"51", "igmp"=>"52", "egp"=>"53", "sctp"=>"54", "ospf"=>"55", "ip_in_ip"=>"56", "icmpv6"=>"66", "dhcpv6"=>"67", "kerberos"=>"6f", "netflow"=>"80", "sflow"=>"81", "citrix"=>"84", "radius"=>"92", "sap"=>"97", "gtp"=>"98", "upnp"=>"99", "llmnr"=>"9a", "remotescan"=>"9b", "whois-das"=>"aa", "eaq"=>"be", "ookla"=>"bf", "doh_dot"=>"c4", "dnscrypt"=>"d0", "teredo"=>"d6", "opendns"=>"e1", "diameter"=>"ed", "targus"=>"f3", "dnp3"=>"f4", "iec60870"=>"f5", "bloomberg"=>"f6", "capwap"=>"f7", "zabbix"=>"f8", "s7comm"=>"f9", "xdmcp"=>"0f", "vmware"=>"1c", "rdp"=>"58", "vnc"=>"59", "pcanywhere"=>"5a", "ssh"=>"5c", "teamviewer"=>"94", "telnet"=>"4d", "coap"=>"1b", "nats"=>"44", "crossfire"=>"69", "dce_rpc"=>"7f", "corba"=>"a8", "zeromq"=>"b1", "mqtt"=>"de", "rx"=>"df", "someip"=>"e5", "fix"=>"e6", "amqp"=>"c0", "tiktok"=>"31", "googleplus"=>"48", "facebook"=>"77", "twitter"=>"78", "snapchat"=>"c7", "sina(weibo)"=>"c8", "instagram"=>"d3", "linkedin"=>"e9", "hulu"=>"89", "appleitunes"=>"91", "pandora"=>"bb", "ipp"=>"06", "ntp"=>"09", "netbios"=>"0a", "ssdp"=>"0c", "smbv1"=>"10", "syslog"=>"11", "smbv23"=>"29", "ldap"=>"70", "windowsupdate"=>"93", "collectd"=>"ab", "bjnp"=>"cc", "applestore"=>"e0", "playstore"=>"e4", "skypecall"=>"26", "whatsappcall"=>"2d", "mgcp"=>"5e", "iax"=>"5f", "sip"=>"64", "truphone"=>"65", "skype"=>"7d", "webex"=>"8d", "viber"=>"90", "tuenti"=>"95", "messenger"=>"9d", "h323"=>"9e", "noe"=>"a0", "teamspeak"=>"a2", "ciscoskinny"=>"a4", "rtcp"=>"a5", "megaco"=>"b5", "vhua"=>"b8", "zoom"=>"bd", "kakaotalk_voice"=>"c2", "googlehangoutduo"=>"c9", "free_205"=>"cd", "imo"=>"d8", "ipsec"=>"4f", "pptp"=>"73", "openvpn"=>"9f", "ciscovpn"=>"a1", "tor"=>"a3", "wireguard"=>"ce", "tinc"=>"d1", "hotspotshield"=>"d7", "http"=>"07", "datasaver"=>"2e", "yahoo"=>"46", "tls"=>"5b", "usenet"=>"5d", "googlemaps"=>"7b", "google"=>"7e", "http_connect"=>"82", "http_proxy"=>"83", "waze"=>"87", "ajp"=>"8b", "apple"=>"8c", "socks"=>"ac", "wikipedia"=>"b0", "amazon"=>"b2", "ebay"=>"b3", "cnn"=>"b4", "pando_media_booster"=>"b7", "quic"=>"bc", "googleservices"=>"ef", "websocket"=>"fb"}

  tracked owner: ->(controller, model) { controller && controller.tracked_current_user },params:
  { :attributes => proc {|controller, model_instance| { "acl_list(#{model_instance.protocol})" => model_instance.changes}}},organisation_id: ->(controller, model) { controller && controller.tracked_current_user.organisation_id }

  tracked assumed_by: proc {|controller, model| controller.user_assumed_by if controller}

  default_scope { order(:priority) }

  after_create do |acl|
    p ":::::::::creating accl"
  end

  after_update do |acl|
  end

  def json_build
    {id: self.id, is_enabled: self.is_enabled, policy: self.policy, protocol: self.protocol, src_ip: self.src_ip, src_mac: self.src_mac, scr_bitmask: self.scr_bitmask, src_port: self.src_port, acl_group_id: self.acl_group_id, dst_ip: self.dst_ip, dst_bitmask: self.dst_bitmask, dst_port: self.dst_port, src_uplink_type: self.src_uplink_type, dst_uplink_type: self.dst_uplink_type, log: self.log||false}
    #{id: self.id, policy: self.policy, protocol: self.protocol, src_ip: self.src_ip, scr_bitmask: self.scr_bitmask, src_port: self.src_port, acl_group_id: self.acl_group_id, dst_ip: self.dst_ip, dst_bitmask: self.dst_bitmask, dst_port: self.dst_port, src_uplink_type: self.src_uplink_type, dst_uplink_type: self.dst_uplink_type, policy_ly7: self.policy_ly7, application: self.application, host_iprange: self.host_iprange, port: self.port, form_type: self.form_type, application_value: self.application_value, src_domainly7: self.src_domainly7, src_bitmaskly7: self.src_bitmaskly7, form_type2: self.form_type2}
  end

  def check_and_update_uplinks_type_value
    self.src_uplink_type = "All" if self.dst_uplink_type_changed?
    self.dst_uplink_type = "All" if self.src_uplink_type_changed?
  end

  def self.update_redis

  end
end
