hiddifypanel 3.0.0.dev64__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev66__cp39-cp39-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/websocket.py +9 -3
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/asset.py +17 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/clean_ip.py +125 -3
- hiddifypanel/panel/cli.py +172 -3
- hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
- hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
- hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
- hiddifypanel/panel/commercial/__init__.py +50 -4
- hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
- hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
- hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
- hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
- hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
- hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
- hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify.py +655 -4
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/init_db.py +393 -3
- hiddifypanel/panel/usage.py +85 -3
- hiddifypanel/panel/user/__init__.py +25 -4
- hiddifypanel/panel/user/link_maker.py +416 -3
- hiddifypanel/panel/user/templates/clash_config.yml +1 -0
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +6 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/en/LC_MESSAGES/messages.po +194 -190
- hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/fa/LC_MESSAGES/messages.po +123 -120
- hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/zh/LC_MESSAGES/messages.po +123 -121
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/RECORD +74 -76
- hiddifypanel-3.0.0.dev66.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
- pyarmor_runtime_000000/__init__.py +0 -4
- pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,124 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xe6\x16\x00\x00\x12\t\x04\x00\xf0f\xc1\x81}\xfb:h\xdf\xfcR\xef\xe1YF\xca\x00\x00\x00\x00\x00\x00\x00\x00\x92\x84s\xd9\x10\xcfk\x12\xc675\x04\x85\x03\x8b1\xb1\xee\xd9\x7f\x19\\>\xb0\xcc\x8en\x19,\xa8\xbb\xac\xdfW5\x84\xb1\x96\xf4v{q\x7f\x02\x11\xbb`a\xe9CUq\x98\xc4\x10\x88\x90u\x1e\x86q\x08\x0c\xe6\xbc#H\xa5\xc6\xa0\xc6\xc1R\xb3\x0b\x95\xc9\xbb\xae\x05\x80\xec\xc6,\xcf\x9ea\x0b~Q\xae\x97\xbb\x13\x1c\xda/\xd0\x1f\x82\x1e3/\xd8\xe9Z\xc7\xb9\x18w0t\xec\'\x17\xf22\x95\x0c(\xcaM\xab\xe5\xd5u\xba}\x97\x87\x82\xb6O:\xfe\xcc\xeb\xda\x14\x92\n\xab\xa4\xd9t\x07*\xfcH\xa3\x01\x1fI\x96\xbf(\xd9\x17K3UU\x86w\x8eSy\xc2Y\xda\xe2\xcd!\xca\xdb\xec\xab\xb7\xd2\x03\xdf\xc9z\xd3\x1f)\xb6e\x1e\x14\xb7\xc4\x90\xdaw!l\x81\xffX\x92\xb6VO#P\xb5\xa9\xcc\xb9\xdf\'!\x87\xf2x\x17s\xd0\x81\xb1\xb8\xe7 \x00\xd9\xb8\xc5\x1e_\xb4yh\xd6\xc0j\xde!\x9f3\x1d\x92\x16\x9c\xb2!\x05\xa2\x89\xca.\x05\xe4O\xf5\xb6\xd0\x82\x85\xf1\xeeR\xac\xb3\xc0\xb0\x0b\xb2\x08\xc3\x93\x9d\xa6\x06\xf8>\xb6\xc0\xfdR\xc7\xc3Y]\xe3\xb8\xb6\xf0\t\xca\x0b\xf3\xc6\'\xd4\x04wh\xac\xaa\xfe=\xe2\xbd\xbbx\x85\r\xa7p\xf9\x0e6Dp\xb7\x02?\xcb\x06\xdf\x8au\xe2,Z\x9c\xb1\xd1t\x12\xff\x82\x8d\x93\xd6cv\x06f\xf9;\xcfF\xf4\xd1\x98\x94\xc3\x9e\x9c\xc2L\xb1f32\x08\xb7]\xc3\x85,_eft\xda*\x04\x9cDxv\x1d$\x05\xb0\xbe\xc3\xd7\x89\xe2\xd7\xc97Q\xe8F\xc6P\xfap\xdeN\xe5\x00>\xd7\xd5\xa7\xc1\xa9q\xad\xaa5\xc7#\xdb\xe7\xbd`y\x05\xd7SX\x8b\xaf\xfb\xc2\x91\\\xda\x03"\x9f\xdc\xb5\xfci\n\xbdz`P\xfa\xc1\n11\x86w\xa8\x0b\xaf\x05\x8a\xdf\xb6\xd4N\x95)\x04I\xb3`\xbeH\xb2=r\x99\xb7n\xb2\x10N^\x9a\xb4B\xd6\x01\x87\x165\x8c\xfd?\xa1\xa2\xdc\xb5\x89\x8bW\xf0\x95\x90\x16\x1c0O\xc4\xcb\xa0\xd7\xf8\xf1\xe6\xf4&\x8f\x1b\x89\xf1\x9b+\x81j\x8c\xbbW\xc3\x03O\x1a^\xfctXb\xcc~\xf1\xe5\x9c\x1eU\xd7\x06=\x856\x00\xa3s\xd6\xb3\xb9\xd0\x9cU\xc9\xf9\xcf\xd2\xc9;\xbb:\xfd\x0b\x10\xee\xad\x1c\x97\xb5\xf9\xee1\'~\x89S\xc2\x99\xd1\xd0=t"2\xec\x98\x92\xcc\x102\x17\x16\x0c>\x13w\xc5\x91\x80+\xe4L=\x8f\x1co_&Kz[d6\x9f\n\x81\xc4|\xa0\x8d~\xb0\x07\xbe\xd6[\x1c\x01\xab\x185\xa5\x9a\xa9\xd8T\xab9Q\x92\x879\x90pZ\x9d\\?~\xf8\xc3|f\xd5\xc4\x84\x9b\xfb\xb20Sp\xcfc\xe5\x1d"\xa9\xbf+\xb2j!\xd6\x88tWDuz84I\xa9\x98\xbck\xd3\xba\x99-\x03\x08\x93G\xeb\xab\x9d\xbc\x88.\xda\x14\x1fX\xf1\x00\xae\xbaY\t\xdf\xdc\xe1\xad\xccj\x03xt\x0eB\xae\x9e2\xd0c\x81_7\xe4\xb3]\x06{\xcf\x93\xc7&\x87\xfbg\xb0h\xda\x98\x08\xaa`\xf5\x12\x1b\x08\xf8\xb5\xe4\x9d\x05k\xc8\x80\x96\xe7\xaa\xd5\xa7\x12Y^\xd4\xc5YDUQ\xd9b_\xc8\xeb\x13\x02\x0f\x84\x19\xba\xd7\xde\xe9\x07\t\xf6\xac\xa5\xa2\xedY\xca]\xff\xcek\t\x0cc\x04,\nN\xf9[t\x93K\xa5\x83\xdbI\x03n\xa1\x08\xbeIZ\xe6\xf0^\xc1\xf7\xbb\xe91\x04\x08\xc6\x92Z\x92#`\xd7\xc8d\x85\x86x\x14k\nB\xf6\x06X+Y\xd7\xf4\xba\xf8\xdb\xf7\x10h\x83\x16<`}a\xc5\xc2\x97(@\x86\x97\xc4\x0f\xeaM\xebo\x15\x10\xe0\xd6\x88:\xd7\xaa.\x14H`$\xf3\x198#\x89\x97\x8b\xf8J5v\xc1\x035-\x7f\x8c4\x899\xe6?\xce\x07\x87\xf6\x1a\x8e\xa9\x9ez~U\'\x16A\x11\xcf\x19zJ\x16x\x1f\xe1\xe4\xd3\x91*\xe6%a\x04\xbb\xf4\xb9NB\xe8\x04\x9c(\xe2Rb\xf7\xf4\'T\x86\xe61\xf0/s\xdbyis\xf5\x9a\x05\xa9\xefJ\x97X\x8f<,\x9be\xddM\xc7\xc7[\xc4\xcf\x9eF\x8f\x17k~\xf1\xdf\x16\x02\xc0\x8c/Uf(\x9a\x10\xfed\xce\x88\xcc<\x93\xe9\xe7\x05\x96d\x1b0\xb1\x12\xc5@\xc4\x94\xc2bD\xdfe\xc2\t\xdc\xb9c_tg\xe6/{Pe\xc4F\x84\x08\x91l\xef\xec\xa9\x83U\xd8\xb0\xca\x9d\xf57;\x84\xdb~\x930\x1d%\xfe&~\xb0\xdd*\x92\xa5\xfc\xc67?\x13y6p\x18\xb4\xd8!\xea\xeez\x8b\xf6w\xccB\xa2\xa7\x06\xd1Vn-\t/\xd8B\xb1\xc2\xe0]\xcf\xde\x89\x04\xf8\r\x96\xec\xe4kF\x11 \xf0\xc7\x8c\xc9\xf8\xa4, \x944g\xe3\x96\xfc\x1eu\x13[[\xccE\xb9\xbb\x15--\xfe(\x1c\xd7\x1f\x1e\xf4ad\xd1/Ir3\x97\r\x8e\x01\xc8\xed\x1a\xe5}\x93\x0b\xdc\x19\xc0g)|\x03\x12\x81\xd6\r\x8a:K\x88\xb4\x10\xa1+\x8c\xf1\xb9\xcf\xe2\xcf\x86\x85.fC\xcf\x83\x12\x91*\xc9\xdbN5\xbc]Qw2\x8c`\xaa\xef\x12v/\x8a\xde\x98\xae\x1eJx\x9f\xe1\xa4\x0cH\xee,5n\xc3\xf4B\x1fS+\x02\x16\x9e#\xe4\x84(b\x86/\xc50fd\xcb\xfb^\xc6?\x8e\x8d\xf0\x8f\xb6&\x93\xf3K\xc9\xe9\xe1\xb6\xa6qtp\xcd\xf4P\x1a|\x0c\x07\xe7\xef\xa9\xb6\xfav\'\xfaI\xa2G\x02^J\x92\xbc\n\xb9\xa9\x9c\x0c\x82\x1d\x16\xf6\xac0\x86\xafJ\x01\xe012^\t\xd7\xfcx\x89\xe3\r\t\xfd\x9dg\x8e\x14\x04\xfb\x88\x87\x9b\xb5\xaf\xb7\xbejd=i+<Z\xe3\xde\xf4[\xe1\xfej\xf0)\xfaQ-\x88\x13\xe3\x0cu\x8cnJ\xba\xe0\xb80!\x04A\x0b\x01\xed\xb89\x96\x0fmq"\xda\xe7"|\xa6\xa3l\xeb\x99:\x93\x9f\x02\xdcYm\xd7\x94\xba\xa2\xd88\xacF\x93>\xf4\x8b\xc1\xc1})\xa6\x024DG\xed\xdfa\x01\x08\xd9xv\xfb\x9ew\x9ex\x02(\xa8K\xf5d\xb1M\xa6\xa3\xfe\xc1\xd39K\x90\x00\x9f\xae\xf7\x04\xa1\r\xf3\xdf\x93\xb0\xf25\x0b\xdb)c\xce6\xc0F\xd3z\x11\xd8\xd7\x9d\xd0\x85\xd4l\xde\x94HVeg\x93HO\xe3-\x9d/,\x19\xfb\x00\x85\xf3n\x9e\xbc=\xd5\xa7b\x7f\x07b\x80\xa9\xe7NW\x0e5\x12\x02\xdd2\xe1\xbb\xd1\xdc\xd5!^/\xb9\xcf8Wo\xb9\rQ\xf3k\xb0n\x02\xdb\xce\x8a\x9e\xdc\xf2\xf4X\xadF\xf6\xb8\x9a\xf0\x9a$\xb3l\xe7\xe4\xca\xc00\xca_\xf8\x94\xc8^l@t\x96\x8cUL\x04dLL\x8a\xb0\xdc1\xf6\xf3\xb7\xf4hE\x16\xa9\xc6q\xaa\x84\x95\x1dB!\x1b\xcf\xc9b@TG!9\x9b\xa0\x1c\xa3\x85\xd3\xb2\xfbL\xbcg\x00\xecP\x80\x81Y\xbf\xae\xe4\xf3\x1eV\xf4\x1c\xa6\'\xf2\xe4\xee9\x8a\x1eE \xed\x99\x0b\xf1^\xf6\r\x9d\xfbP\xe9\x1d\xf6\xd0`\x90\xf7F\xbe\xf6\xaa\xf44<X\x11\x97\x89\xf4D\x03\x1f-\x9d\x1d\xf8\xb9\xec\xbch\xfd\'\x88tV\xea\x17\t#%\x84\x91?\x06Lg(\xa6H\xca\\\xda\xacE\xa5:Bt\xec\x81\xa0"y\x7f\x1b\x8b\xb4\xb9\xb5\x91\xc5r^/\xf37#\x07\x05.$:\x13\x16yK\xd6\xc0\x979!\xa5\xf6\xf3\xeb\x8e\x95\xe4\x81\xb06*\xb25\x8f\xa3\xd7\xdf\x0b\xce\x1bvjI.P\xe84\x13\'\t\xb15eS\xf5\x87\x15\x0fI\xa2\xa9)\xb5o_\x85\xb6X0^a\x07\'\xd2*-v\xce\x0c\x87\xaa\x14\xbfA\xb8\x1f\xb3A\xf2\xc2\x02\xfb\xad>$\xb3\xfb\x90\xf8\xa7{M]\x1bW?\x18\xcb\xdep\xc8F\x058H\x17\xc8\x98\xcd\x89V?\xc9\xe1\xc7\xf9\x9f\xfc\x17q\xc2\'2J\xde\t\xc5\xe9\x16Q\xe9p \x81\xadFa\xe6\x1a\xe0\xfa\xd8W_\xbaZ;\xc6\xce\x8e\xdcc\x9ek\x7f\x8f\x1bi\xb2\xbd\xc0r\x11\xc5\xd2\xf3t"t\xebX\xc6J\xb8h\xceSTc\x1e\xb4\xdav\xb0\x81\xf9\xc8\xe2\x08@y1r\xe8f+\x06\x14(!#*\x88\xc8\xc6\xd4b\xbdM\xf3\xaa\xdb\x99\xe5Z\xbcx\xedc\x94p\xf1\x1d\xff\xc8\x8a8\xb5\xdc\xf6\xe8\xd5\xdf\x7fT\x1e\xce\xa3\xb7\x84kd\x0freR\xef\x0e*\xa1\xf8\xf15\xe5\x91v\x8fs\xab*\xc8)\r\x0c\xeb:\x9ahM\xa9\xbc/\x85pw\xfb\xf2\x06-\xdd\x1d\xa4?\xd4\xb6T\x9e\xa0\x19\x04\xf0k\xbb\xe7\xec\xf8\x93r\x174\x9a\xe3\xaa.z\xf1\xdf\xcep\x0f\xa2\x08\xb5\nw\x96\xc1\xfb\xf6\xd1:d\x9f@\xaf\xadIs#\xb7%k\xa5o=vmtn\x92\xa4x\xa4\xac,\x9d\x9d\xb8J\x16\x16\xe4\x1eP\x99\r4\xad\xb4Ce)\xcd\xaf1\xeb\x81\x18U\xc5\x19\xc2a\x01\xeeL\xc4\'\xf0\xc5z\x98w\xfen\x06l\xd5\x93xN\x9cG\xc8\xec\t\x17Q3\x1f`\xd0u\xd2\xc0\xdf\xb3\xbe\xa7\xdd\x1b$\x11\xc5F\xcaxB\xb6_\x0bF\x0b6x\x9f\xff\xda\xbd\x0e\xe7\xf5\xd1"=\xbf\xd3\xa6\x07\x0f\x01\xf7\xa3&\xe1\xc1\x7f\xb2A\x8fp\x08\xd9@5\x94O\xa90\xa3\x04S3\xfe\xd5:\xc9\x08\xba\x1c\xca\xec\x1c0-\x97\x0e\xc4\xe8,ly\xe7\x01j\xb2\xf9\x81$`(\xe7\xfag\xaf\x1a%\xb1\x85q\xfcJ\xe3sE\xe5!\x85\xcfu\xca~\x15\xc8\xa2\x17\xf2y\xe5t\x1f!\xd0\xce}\x0bT\xe7\xcf#\xe8[\xd5|\xf3\x19>L8P\xcc\x1b\xa0\xc7\x95\x07<\x1dj4\x85y\xe6\x0b\x9f\x1d\x83\xd2\x91\xc0c\xe9\xd0\xba\xee\xf2<\x95\x17p\xa5tt\x81\xc0*\xf1\xbdj\x17r\xaf\xaa\xce\x8d2\x06,t\x9f\x0f\x9a\x88\x8c\xe7\x9a[\xadw\xe8\x1c\xfe\x13VC\xe4\xbf\xea\xae\xe9T\xf6 \x97\xc2\xd1\xa0\n\xd3\xf4\x87\xfe\xe9\xdaikB\x9a\xef$\xf8\x03\n\xb8\xd9\x1c\x89\x19\x8b@\xca\xd3\x12?yQ\x8f?5X$\x0b\xb0n\xc6\xf4\xadw2RV\x81+\x9eSj\x10\x0b\x1f\x91R\x83\xb9\xd1\x18\x13\t\xbf\x05\xf1\xba\xb2L\x8d\xee<\xf9}&\xef2N+\xc9\xf0\\\x00\xc5m\xbe\xd5\xfd\xf8cSx\x9a\x90\x04\xd2\xaf\x1a\xc9d\xe5\xc9\x92\x84\xafNF\x08\xff\xc4&w\x94\xe5\xddo\x86\x123e\xa7\xe5\x8ck\xf3\x1c \xa4\xf7\x0cFU\xc2h\x1e}\x06%m\xf4\x17\xe6;\xd31\xc1\xc7E\xb8\x15\xe1\t\x1azi\x1a\xfeYc\xae\x90\x1f\x86\x86\xd5\xf0>\xa3Q8JJ\xee%\xfdl\xb1\x82\xd5\xb8yv@\xae3%\xad\xe8\x17\x8d4\x19\x88L\xf0"+\x8a\rE\xafo\xad[\xc3\xf9\'\x16\xd7Tp\xcc\xabj\x17@\xe3pJz\x0flR\xd9F\x97\x8b\x05a8\x060\x9e\t?\x05Ej\x9d\xdb\xd4\xf3\xa3|@YZC:\xf8\x9b\xe2\xb0\x80\xf6\xdf\xa7\xf0\x03:m\xd6\t\xc2\x05\x93\xb6m\xa9\x1e\xd5\xea\xfc\xb8\xbe\xe1\x0c|\xcfY,\x9d\xfe%\x8b\xc9\xb9k\xa0q\xfd\xeb\xf7i\x9b\x10\xa1\x8b\xb8\x05qc\xdf\xa6\x88\xe3\xe0\xa8\x13>W;\xbeo$\xeb\xa3\xa9Qqj\xea\xc3\xffq0\xbb\xe2\x10\x12j\xccd\xc5G9\x1f\x82T\xb2aVt\xef\xd5\xc0\xacv\xcfV\xca\x01\xc3\xa5\xf4*\x0f&\xfbu\xac\xe7r\xd8}$\x85\x93Fb\x18w\xfa\x8b\n\x9a\xe8\xc6\x0b- 1\x84\xb6\xcd.gkf\x9d\x14\x1b\xc5v\x9d\x1e\x98\xe1\xd7B\x17y%^\n\xf9\x89k\xee\xac\x10\xfeP)\x14\x99Z\x9dN\xfc\x9c\xc1\xfcF\xc5F3m\x8b]\x92\xf4\xcd\xbaA\x8b\x82D1\xf2J4\x13J&\x15a\xe0=mt\x18\x1f\x19\x8e \xb0\x94\xb7\xf9\xcf>;W\xdf\xe0@\xba;=\xd9\xb6\xd8w\xb2\xd4\x87\x14\xc9"I)\xaaL\x05\x83a\xad\x19\x13uk\'\xbb\xc5f\x13\xc8\rq\x1e\xf7\xe89\xd5;\xc0\x95\xa0\xb4/\xfd\xb2h\x18\xb3\x80B\xc3\x12?-\xf1H-g\x02%\x8c\xb3\xc4\xeb\x89y\n\xbc\xbcC3\x17\xea,xF\x9f\xb5k\xa2d_5\x1dV\xa5\td\xa6\xbfE\xd5P!G\xf0\xb3\xb1\xbbw+\xdaQj\x8f\x15+\xbck`-O\xf0Cd\r\xc0\xc0\xed\x1e\xae\xfa\xc9\xfbz\xe5\x17h\xc4\x15HV\x08\xad\xc8\xb1\xfa\x83j\xcb\x87\x05\xe6\x84\x97\x7f\xe8\x8f\xfb\xb8\xf0e\xa2i;\xaa\x89U\x16\x89\'\x01N\xf7q\x00\xf5\xe7+\x8fhAo\xf6\x94\xaeM\x80\xec%\xde`\x03i\xb9\xc8\xdf\x10\xd8#\xac\x03nm\r\xc8\xed\xc3\xf9t\x0fwL\xea\xa9\xc8\xa1\xa2\x16\x99\x84\x12E\x160\xd0\xbe\xbb\x01T\xe8\x9e52\xbe\xf4Jo\x19\x1f\x0b\xb9\x1e#\xffZ\xffTI\xeb\xee\x99\xf6\xfb\tk\xbc\n\xc3\xce\x81v\xa5+{\xd3U\x9d\xd3 %8p\x96\x08\x8b\x90\xa1\xc6&\x9c~b\x99\x95\xc7nNIW0\x00\x9f\x8a`\xe21\xf3\x84/\xbf\xfe7\xe9\x93\x92\x91\x05\x1e\xcf\x93\x97\xd2Nz\xfaA\x17lA\xdb\x01\xefS*s\xe8\xb7\xc08\x8f\t\xb0&\xb1\xc0f\xd3#Ev$",ch\x97\xea\xcd\x16\xbcp1\xf4\xbe\xa4\xf4-\x8d\xb6\xf7\xd3\x8b^i\xe93\xa9[ \x01*\xd5\xe2\xb9{)\xa9\x19;\x1b@\'Ci\x1d\xe1\x89\x0cL;\xa0\x19P\x1f\xd2\x1aV\xeeVkFMF#\x9a\x8b\xb5\xb7*\xd0q:D\xdc\x17\xa5\xb7\x8cu\x91\xe2\x81\xe3\xde\xce\xe8\xcb\xd1\x90\xea\x80\x84g\xf6=\xd1\x9ct\x89\xdd\x99\xaf>\x1b\x83\x17\x9dy!a\xdb}\x02Ff\xbe\x8f\xed\xff\x93\x9b\xd9\x93Z\xf0\xd9\xe1\x05\xb0\xf3\xe1\x88\xc1\xb3t\x00,\xd2\xa7\xb2Y%\x9a\x1e0\x85\x0e08\xbd\xd6Ib\xc5\xfbe\xaf\x1e\x07\x8cC\x12\xfe\x947\xeb\xcd\x88Z\xfa\x87Y]\x9b\xdd\xe1N+I\xfcc\xe4\x16:Cz\x0c\x8dd0;\x9f\xf2\xbb\xf2tvn\x99-\xf37\xe2\x1eu=\xc5\x05\xad\x97\x9eeH\xea\xa3\xbffH\x11\x7f\xa2\xa67\x04\xa3\xe2x8F\xa8\x9f\x02K\xdbr\xfa\xf2\x11\xa9\xc5\xfcr\xdd\xb6~\x8dY[k\tp\xda,\xcb\xa80a!\x95\xfb\xc1\xe0\x01\xeb\xbd\xbc~^\x10f\xef\xcaU\xc2\xe5\x9d\xa5\x96v\xfdn\'\xe7L\xcf\x9d\x03\xf0\xe2\xc4\x1f9\xae\xf6\xef\xe5h\xc1d\x17\xb3/\xbb\td>@\xde~x\xa2\xe55\x9dp\xaf\xb8\x9c`\xda\xf1\x19\xed\x81\xc0\'\xf9\x9b\xed,M\xf4L:\xbb6\x11\x10\xf5\x1bS\\\x7f\x96\x16\xa7\xd1\xce\'Cc\x1b\x15kJ\xc1W\xcd\x9e\x1b\x00\x7f\xc6\xac0+p<\x0f\x07B\xc1\xd9}\xb1r^7\xb8\x05"\x19\xd0\x8e\xc6\x13\x1cE\xb4:\xcequ"r\xe0|\xcd\xb0/\xba\x8a6F"K(\x86\xf1V\xe6)\x82-f\xa7N\x0e[\x8bt\x1dQin]v\xa0\xcc\xc8\xe1J\xb9\x99\xec\xfe\\AR\'O\xf1\xb1\x96\xfbg\xd8?\xc0\xdc\xf8/{\xa6p\x12@\x8d\xa4\x94\xd2\xb2.g\x89\xc1\xe45rls\x9a\xe4\xbf\xb5\xde\xf3R\xe4e\xbf\xba\xa24\xaa[\rz\x8d\xa9\xa6\xd8pPN_\x93\xb2S\x1b\xd0\\`\xb9\x0f\x8a\xba\x9cV\xb8:>\xf1\x98\x1cW\xed\x82\'K\x9af2\x9byA\xc8\x13\xd4c\x0b\xa4\xe1\xc3\x13\xfa\x84\xba\xce\x8c\xf4u\xb0\x7f\xdb\xees\xfeg\xf0\xc3\x11\xc8i\xf5U=/\xcf\x19\xa1W\xd2J&\xc2y\x89&\x0ei\xfa\x17\x08<$\xf9\xd9\x8d_z]\x18\xc8\xc4\xc4l\xa0\xa9\xc1^X\x08\xd9\xcf\xb6\xaf$\xb2\xea\xf7\x8f\xb9D\xbc;Bk\xa2\xab\xb1-\x84\t:\xccK\xf8\xd9\xd1\x98\xe0,\xb6\xb2\xa3\xd5\rf\xf1Rd\xd8\x11M\x83\xb0\xd9\xd1&\x04J\x08~C\x00!?o\x0fX\x90p.\x01\x94\x8e\xab\x88/Mca\xcb\xed\xfbl\xe3kk\xc47\xd9\xb9\xa6N\x1b\xa6\xd0\x90\x1e\x91;Z\xc6\xa6\xb8Uiy\xdc\xc4\x8cI\xae\x8foCT\x15S8\x01\x12\xa4\xd4)\xfb\xfeY\x8a\xb6\xba\xf7\x82\x0b\x10&T\xad\x18\xd2DJ\x8d\xd7\x81\xfe!%\xf6\x13\xa8B\xe9\xfe\xb4\xd4\x17`G\x14\xa6\x8c\xd1\xff\x085\x1e\xdc7\xd8\xf3^\x05"0\x91\xc53\x89h\xc9_\x8d\xe5\xd89\xafJ?7\x88\xd1\xf3\x04\xcf\x7f\xdd\xbe\xdas\xc8\xba\xe5\x8c%\xf1r\xefy\xa0\x1a\x97\xb0\xa7nh\xbc\x9aYX\x1bx\x15Yvx\xe5\xf4\x988E\x0e\xf7Z\xa6\xe7\xc1Nf4)\x8e\xdb\xa8R\xfeI\xa7\xf8CKL\xeeS\xdd\x0b\xed\xd1R_R\xa5\x11|W\x96\x8dF\x00`\x88>E\xdf\x9as\xa7\xc3\x1f\x04Rl\xf0\r\xc2\x84\x19\x9a\xd8:\xb7c\xbe\x80\x01:U\xba\x13eH\xda\x801\xc1^\x90Oq\xe4+\xefS\x93\xc1\xa7g\xd3Q\xdeI\xf5\x7f+\xbe\xe68$g#\xb8qZ2\xad\x87p\xe1S2\xb4\x9bN\xda\xd8\xb7\x01\xe3PN\xd1\x8b-\x95\x99\xaa\xe3\x86\xdf\x9fB\xe6\x8d\xeeA\xf4\x9e\xf1Na2\xc2<\x81i,"B\x8fk\x83C\xceAG\x17\xeb\r5\x17s\xca7\xd9\xb5\xc1\x12\x9d\xa6.\xb62\\Vq\x00\xfe6\xf4\xb1\x15)\xa6\xe7\x02\x8cm\xcc\x0f\xec\xc0p\xf4]u\x99\xa3t&\xeb\x1f\xffT\x97A\xb3a\x86\xa7\x96^\x8c\xc3\x93\x0f\xe12\xbb7\xdc\xb2\x1a\xd7BO\x04\xe9\x8bA\xfb5\x11\xda\xeb\xf1\xb4\x03\xfb\x15\x84\x16#\x89\xbfIl!=8\x92j\xe5\xc1G\x01 \xad\x0e\xf0\x7f\xe1h/\xba:h\xc8\xc7%\xf5\xdcfS\xa3\xa9\xc6\\\xeciw\x85\xbb\x07lk\n+G\x95\x04\xd3\xce\xde\x86\xa5\xcf\xd5n\xd5\xa8\xc6%\xe1P\xfb\x1bZDj\x96\xfcp\xb6\x08gAnA\xbc\x95\xeb\x1fU\xf8n\xb6\x85[5\xfe)#>\xea\x02\xefP\xd8\x9b\x8b\x90c\xc6\xb3\xf6.O8\x96\xc4K\x83\n\xb8\xc5An\xf3\xb3\xddrJl\xe2\x0ef\x1f\xbd\x06\x9f+\xbe\xa9!\x13=\xd2\xb7H-5\xc06\xbe\x84G\xba\xaa\x81n2\xd7\xa1\xaa[\x98c\xe2v\x82uX\x06\xa2Ph\xfaOa\xa6\x0b\xc9\xa8g\x11y2G\xd3{\xd2\x1c\x93\xe4\xe1\x80/DT{8@\xc1\x97T\xca4\xcc\xa2\x9f3\xaaj\xdc\x17(,\xb7\xe9\x9c\xea\xf0\x8d\x90G\xeb\xb1o+\x009\xce1\xd8\xfay\xecB\x13(\xa3t\x8e\xee!\xf8\\\xaf:~\x91\xdd\xc4\xef\xd9\xf6\xf3l\xd5\xc6\xe90\xa6\x02\x1a"\xa0#\xd5\x9f0\xb93\x94b\x95\xe1\x15\xcf\x96\x15\xf0\x8fpd\xd1$\xc8\xaf\x7f\\\x92\xfe\xea\x1b\xdeD\xa4\xd5\xdf\xaf\xe5\xed\x19\x89\xfc\xca\x9a\xe4\x1a\xeeM\xd9\n\xe9\xf7\xef\x9c\xab>\t3\xcb\xb2\xd2\x14n\xb3\x91\xc5\xee\x7fC\xeb\xfa"z\x15{\x17T\x85n^Y\x8a_\xe4c\xb7\xffS\xa2X\xf7U^\x82\xf1\xbaJ2r\x94\x83a\xd2\xceFr\xac\xba\xabd\xff8\xa5\x9f\xb4\xe1H\xa9@\xe7\xe9x\xee\x0f\x03\x83\xd8\x1b\xc4\x12:\xe8\x0f8\xa0nf\xc5\xda\xe0d\x95\xb3\xd1\xb9f>U\xc3|_\xd5\x04p\x85z6\x19\x85S\xbf\nPzIdDx\x15h\xd9\x1f\xd7!\xe5\x12x#,;\t[;\xf9\xa6=4\x1523\xe4|\x93\n\xd3\x90\xc5\xd2\x87\x12O\xde\x8a\xa5\xc1\xc3\x84!\xa8O0\x0f\x1b\xa7z"?h\x00O\x1dJ\xa6\xd2\xda\xc3;\x08\xd5\xfd\xfd\xd4\xd3%1\x81\xde\x81\xd5\xd57\xe7\xa0E-wf\x18}\xc2\xce\xdc\x9a\x05H\xd6K\xef\xfc\xa10\x81.TE\x96Ai\xf9[=\r\x11>~\x03\xc0\x10x\x88F\x9c\x82\x0c\x9d\xcaj\xf7\xcfZ\xdb\xcd\x7f\xd1]\x08!u\xb6!\xb7\x91\x9d\xe7\x95H}\x9bC\x95\xb4\xc2\xb9\x19.\xb9\xef\xc11\xe5\xe9\xc5\x05\x9b\xeb\x10^\xf7\x1e\xd9\xe4\xf1\x05\x10\x16-L`\xd7\xc9\xb6\xf2zt|q\x86X\x10\xaa\xfa_\xfb\x97C\xcd\xa4\xe7e \x95\xf7\xce\\\xdb\xc7\x11\x1b\xf6l\xa0\xe7LG"M\x97<\x9e\x8a7\x8b9\x95=\x1b\x16\xa83L\xe4\x11lx\x7fW\x10\xc0@\x11H\xec\n`dV\xf4\xfd\x8fOj\xff\x89\x8f\x7fwv\xe2\xf9\xad\xd1\x85_\xc9\xb0V\x07\x82\x1d\x1b\xd7\xde!\x0f\xfc]\xc7\x06\xa6\xf8<k\xc6\xa0\n\xfa!\nfQ\xf1\x80\xec\xe6\x1e5\x9b\xab\x11\xbb\x8384\xe9\x9f\x86I\xb0\x97\x02c\x905_\x0b\x8f\x13\x81W\x9a\xc2\xb4\xc5\xb5\xabW@\x18p\x8e9\x83\xac\xfdN\x1b}u\x97\xfc\xae\x17\x81ad\xa4N\xc9T\xef\xc9}Zk\xd7\x17k\xc8\x04:\xf4o\xd2\x90\x91\xe9J\xabK\xf5=\xf5\x86\x12\xa07)\xed\x08X"!\x17b\xee\xa1`\x10\x90\xf6\x94H\r\x12\x86|\xb6[\x08\xb7\x97W\xc8PMwQxEd\xf02\x18\xe0\xa7W3\xd8\xbdm\x82\x08\xcc\xe1\x17k\xfdJ\x99M#V\xcc\x82C\x0c=5\x97\xceu\xcf\xad\xf1\x1a\xd5\x8a$r\x1d\xd0\xb1\xd7\xf920\xd1\xa0\xbfT\x8f(\xd1\xd1\xca\xda\xe8\n\xfdC(\xf4(\xfae\xe8\xd7#\xd9\xd4\xdd*P\xf6N\xf3\xebr\x9d\xf7\xdb@\xf7?B\xe88*\xd5&\x1d;\x983\x03\xb3\x10\xbcB\x0c-\x814\xe2\x16\xe8S4sG\xf6=N\xea[ @\xb4\xd4,\x06\xed9\xff\xb6\xc5>x\xfa\xba\x8f\xd7O\xeb7\x1bLO{\xbdS5\x08T/\xea\xee\xf2[z4\x94\xf9\xad\xc2@6\xce\x8a\x1e\xea\xb3\xe5\xc5\x9c\xfd\x9c\x18\xd7\x9c\x84\xa5\xf8\xbfM\xd57\x89D\x9eg#\x04\xee\xefs\x11\xbd\xe5\x1f\xba\xf5\xa4\xf0\xbb\xc6g\x85\xe9\xd0PE\x84&f\x12M\xa5O\xecR\xb5\x03=\x81/91\x88\xf5\x10\xdd%\xd9\\\xe6@\xc5Pqyk\x8a\xdbv\xd2\\\xfa\x92\xca\x00N\x1e.\xac\xf5E\x9e\xb4\xbf?j\x96yB;4\x1d\xfb+jQ\xda\xcclK@.AM\xec\xd44\x80\x9f\x13\xe2\x13\x18\t\x0b\xd6\x9a\xf5\x0ev+\xf1\xbe\xbd\x9a\x07\xac\xad\xb3\xd8p\xe4*\xc5\x8d\xd9r5/\xc2\x07\x05\x14\xf3?\x89s\x87\xcf\x91\x03Kc\xed\x91\x92,\xbf\x01~F\xea65\xd4&\xcb\xack\xaa:\xbc\xce\xbb\x04\xb3\x0eu\xa3\x14\x92\x90\xbe|1\r\xf6:\xe5z\xf9l\x10dR)N.\x01\xbc\x1e$\x14)d\xca\xef\xb9\x8e\xbc\xbc\xc4?n\xa4!\xd6\x80\xa0\xa2t\xda\x07\x071\xc8\xd2KPE6@F\xcdH\xc8\xde*)`[\x02=#\xf6s_{^\x10\x9fC\x13\xe7\x1c\xc7\x0f\x80/%m7\xb1\xbax\xcf\x88\x86t\xe3\x0eK\x86z\x9a\x1a\xac\x0e\x052\xa2+R\xf8FEC\x87Dv\x99\xb3\xe51\x80\x94\xfc\x8d\xf4\x06K\xbf\xb9\xb4L\\\xb3\x9cC\xe6\xaf\xa2\xf4\x84\xfe\xa4\x1a\x85W\xbc\xe5jF\xdczb\xfe\xfa9\xc3-\xd0\'_G\xbb\xa9H\xed\xd6P{g\x9a\x1dZ\x93\xc7\x00\xf9\xab\x17\x1e\x9bG\xd5\xa2\x18Fa\xd33}7}\x01\xe5\xe3>\xc1\xa3\x83\x15T\x8bUg4d\x7f2\'4}\x8d\x15\xc7}0\xcc\xce^\x05\xb7;\xcdh\xa7D\x9b\xd6\x7f\'[W=\xc9c~i<\xbc\xaa>\xf2\xbc\xd1\x04\xe0\xc87\xc2\x04_\xc8\x9fNS\xde\xfe\xbd\x97\xfb\x87\x86\x01/\xc4(DD!\xba+x\xe5\x97V\xc0\x18\x90\xf6\xcfL\x8a{&vH\xcbl\t\xfa\xa0\xc1\x9e\xec?F\x87\x05B\x80\xf9\xb2b\x049\xe7\xea\x9am@\xecw\x7f\xbe\xd7;\xe9\xe6-\ru\x90\x8fi)\x1d\x07\xb6\xff\x89\xeb\x93\x98\x85\x91e1\x1b\xd98.X\x03\x0ea,l\x06\x95\xf8>r!x\xc1\xed\x18w\x86\xb1>\xbb\x8c\xa5:\xc1\x10\xcf\xad\x81\x0b\xe6e\xb7\xa6\xab\x9e\xacWM\xc2!\' \xf9\x86\x03\xcc\x95\xc5\x11\xb3\xf2\xb2W\x8ch\xa8\x10^\x86\x93v\x85\x94.\xa2\x02\xeb\xd5\x1d\xcf\x83\xb0\x0c\xb8\x03Q\xf21\x91\xe8\xfd\xd2D\'M\xde\x1aB6N#\xb7f\xa6I\x86_$X.\xc7\xba+\x99\x1fwR,\x96\xc1\x93\n\xb2Z\xf0X\x87t\x83p\xee.\r}\xf3tn\xb7\x9e\xbeu]\xbaR\x9dD\x97\xfa\xe1V\xc6\xb8\x14\n@\xcd')
|
1
|
+
from flask_admin.contrib import sqla
|
2
|
+
from hiddifypanel.panel.database import db
|
3
|
+
from wtforms.validators import Regexp
|
4
|
+
from hiddifypanel.models import *
|
5
|
+
from wtforms.validators import Regexp, ValidationError
|
6
|
+
from .adminlte import AdminLTEModelView
|
7
|
+
from flask_babelex import gettext as __
|
8
|
+
from flask_babelex import lazy_gettext as _
|
9
|
+
from hiddifypanel.panel import hiddify
|
10
|
+
from flask import Markup
|
11
|
+
from flask import Flask
|
12
|
+
from flask_sqlalchemy import SQLAlchemy
|
13
|
+
from flask_admin import Admin
|
14
|
+
from flask_admin.contrib.sqla import ModelView
|
15
|
+
from wtforms import SelectMultipleField
|
16
|
+
|
17
|
+
|
18
|
+
from wtforms.widgets import ListWidget, CheckboxInput
|
19
|
+
from sqlalchemy.orm import backref
|
20
|
+
# Define a custom field type for the related domains
|
21
|
+
from flask_admin.form.fields import Select2TagsField,Select2Field
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
class ChildAdmin(AdminLTEModelView):
|
26
|
+
column_hide_backrefs = False
|
27
|
+
|
28
|
+
list_template = 'model/domain_list.html'
|
29
|
+
# edit_modal = True
|
30
|
+
# form_overrides = {'work_with': Select2Field}
|
31
|
+
|
32
|
+
column_descriptions = dict(
|
33
|
+
domain=_("domain.description"),
|
34
|
+
show_domains=_('You can select the configs with which domains show be shown in the user area. If you select all, automatically, all the new domains will be added for each users.')
|
35
|
+
# current_usage_GB="in GB"
|
36
|
+
)
|
37
|
+
|
38
|
+
# create_modal = True
|
39
|
+
can_export = False
|
40
|
+
form_widget_args={'show_domains':{'class':'form-control ltr'}}
|
41
|
+
form_args = {
|
42
|
+
|
43
|
+
'domain': {
|
44
|
+
'validators': [Regexp(r'^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$', message=__("Should be a valid domain"))]
|
45
|
+
},
|
46
|
+
|
47
|
+
}
|
48
|
+
column_list = ["domain","show_domains_list"]
|
49
|
+
# column_editable_list=["domain"]
|
50
|
+
# column_filters=["domain","mode"]
|
51
|
+
# form_excluded_columns=['work_with']
|
52
|
+
column_searchable_list = ["domain"]
|
53
|
+
column_labels = {
|
54
|
+
"domain": _("domain.domain"),
|
55
|
+
# "mode": _("domain.mode"),
|
56
|
+
|
57
|
+
'show_domains':_('Show Domains'),
|
58
|
+
'show_domains_list':_('Show Domains')
|
59
|
+
}
|
60
|
+
|
61
|
+
form_columns=['domain','show_domains']
|
62
|
+
|
63
|
+
def _domain_admin_link(view, context, model, name):
|
64
|
+
admin_link = f'https://{model.domain}{hiddify.get_admin_path()}'
|
65
|
+
return Markup(f'<div class="btn-group"><a href="{admin_link}" class="btn btn-xs btn-secondary">'+_("admin link")+f'</a><a href="{admin_link}" class="btn btn-xs btn-info ltr" target="_blank">{model.domain}</a></div>')
|
66
|
+
|
67
|
+
def _domain_ip(view, context, model, name):
|
68
|
+
dip = hiddify.get_domain_ip(model.domain)
|
69
|
+
myip = hiddify.get_ip(4)
|
70
|
+
if myip == dip and model.mode == DomainType.direct:
|
71
|
+
badge_type = ''
|
72
|
+
elif dip and model.mode != DomainType.direct and myip != dip:
|
73
|
+
badge_type = 'warning'
|
74
|
+
else:
|
75
|
+
badge_type = 'danger'
|
76
|
+
return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
|
77
|
+
def _show_domains(view, context, model, name):
|
78
|
+
# return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
|
79
|
+
res=""
|
80
|
+
for d in model.show_domains:
|
81
|
+
res+=f'<span class="badge">{d.domain}</span>'
|
82
|
+
return Markup(res)
|
83
|
+
|
84
|
+
column_formatters = {
|
85
|
+
# 'domain_ip': _domain_ip,
|
86
|
+
'domain': _domain_admin_link,
|
87
|
+
'show_domains_list': _show_domains
|
88
|
+
}
|
89
|
+
|
90
|
+
def search_placeholder(self):
|
91
|
+
return f"{_('search')} {_('domain.domain')}"
|
92
|
+
|
93
|
+
# def on_form_prefill(self, form, id):
|
94
|
+
# Get the Domain object being edited
|
95
|
+
# domain = self.session.query(Domain).get(id)
|
96
|
+
|
97
|
+
# Pre-select the related domains in the checkbox list
|
98
|
+
# form.show_domains = [d.id for d in Domain.query.all()]
|
99
|
+
|
100
|
+
|
101
|
+
def on_model_change(self, form, model, is_created):
|
102
|
+
model.domain = model.domain.lower()
|
103
|
+
|
104
|
+
|
105
|
+
dip = hiddify.get_domain_ip(model.domain)
|
106
|
+
if dip == None:
|
107
|
+
raise ValidationError(
|
108
|
+
_("Domain can not be resolved! there is a problem in your domain"))
|
109
|
+
if not hiddify.check_connection_for_domain(model.domain):
|
110
|
+
raise ValidationError(
|
111
|
+
_("Domain is not correctly mapped to this server!"))
|
112
|
+
print(model.show_domains)
|
113
|
+
if len(model.show_domains)==Domain.query.count():
|
114
|
+
model.show_domains=[]
|
115
|
+
|
116
|
+
hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
|
117
|
+
|
118
|
+
|
119
|
+
def on_model_delete(self, model):
|
120
|
+
if len(ParentDomain.query.all()) <= 1:
|
121
|
+
raise ValidationError(f"at least one domain should exist")
|
122
|
+
hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
|
4
123
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
124
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,55 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from flask_admin.contrib import sqla
|
2
|
+
from hiddifypanel.panel.database import db
|
3
|
+
from hiddifypanel.models import ConfigEnum
|
4
|
+
from wtforms.validators import Regexp,ValidationError
|
5
|
+
import re
|
6
|
+
import uuid
|
7
|
+
from .adminlte import AdminLTEModelView
|
8
|
+
class ConfigAdmin(AdminLTEModelView):
|
9
|
+
can_export = True
|
10
|
+
column_default_sort=('category',False)
|
11
|
+
column_display_pk = True
|
12
|
+
can_delete = False
|
13
|
+
can_create = False
|
14
|
+
column_editable_list=["value"]
|
15
|
+
column_searchable_list=["key","value"]
|
16
|
+
form_widget_args = {
|
17
|
+
'description': {
|
18
|
+
'readonly': True
|
19
|
+
},
|
20
|
+
}
|
21
|
+
def on_model_change(self, form, model, is_created):
|
22
|
+
if model.key==ConfigEnum.db_version:
|
23
|
+
raise ValidationError('DB version can not be changed')
|
24
|
+
# if model.key==ConfigEnum.decoy_domain:
|
25
|
+
# if not re.match("http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/?", model.value):
|
26
|
+
# raise ValidationError('Invalid address: e.g., https://www.wikipedia.org/')
|
27
|
+
if model.key in [ConfigEnum.admin_secret,ConfigEnum.ssfaketls_secret]:
|
28
|
+
if not re.match("^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$", model.value):
|
29
|
+
raise ValidationError('Invalid UUID e.g.,'+ str(uuid.uuid4()))
|
30
|
+
|
31
|
+
if model.key in [ConfigEnum.telegram_secret]:
|
32
|
+
if not re.match("^[0-9a-fA-F]{32}$", model.value):
|
33
|
+
raise ValidationError('Invalid UUID e.g.,'+ uuid.uuid4().hex)
|
34
|
+
|
35
|
+
if model.key==ConfigEnum.proxy_path:
|
36
|
+
if not re.match("^[a-zA-Z0-9]*$", model.value):
|
37
|
+
raise ValidationError('Invalid path. should be asci string')
|
38
|
+
|
39
|
+
if model.key in [ConfigEnum.tls_ports,ConfigEnum.kcp_ports,ConfigEnum.http_ports]:
|
40
|
+
if not re.match("^(\d,?)*$", model.value):
|
41
|
+
raise ValidationError('Invalid path. should be comma seperated integer e.g., 80,81')
|
42
|
+
|
43
|
+
if model.key==ConfigEnum.http_ports:
|
44
|
+
if "80" not in model.value.split(","):
|
45
|
+
raise ValidationError('Port 80 should always be presented')
|
46
|
+
if model.key==ConfigEnum.tls_ports:
|
47
|
+
if "443" not in model.value.split(","):
|
48
|
+
raise ValidationError('Port 443 should always be presented')
|
49
|
+
|
50
|
+
if "domain" in model.key:
|
51
|
+
if not re.match("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$", model.value):
|
52
|
+
raise ValidationError('Invalid domain: e.g., www.google.com')
|
53
|
+
if len(Domain.query.filter(Domain.domain==model.value).all())>0:
|
54
|
+
raise ValidationError(f"Domain model.value is exist in domains section. Use a fake domain")#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
55
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,71 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xb5\x11\x00\x00\x12\t\x04\x00\xd4;~K{\xc1HOi*;%\x10\x02\x86\x96\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xf1i{\xae\x0c\x0cf\xf5\x14\xcd\xc5\xa6\xc4\xf5N^{\xe9\xd0\x04\x9d\xb2B;\xac\x96^\x9d\xaa|b\x9cU\x93f%\x9f\xab{\\A4[#\xe6\x1fH\xfe\\\xf7 \xad:X\x96\xab\xbf\xc9\xc1\xb5Y\xc7\x8ei\xb4"\x82\xa8CT\xf3\x08KL\xd4z\x0e\x97\x1b\xbe\xef\xe55\xa7aa\xda+\x11\x19\x83\x062\xb7\x8fz\x95-\x83}\xc0\x07W\x19U\x89v\xae\xc7\xd4\x17\xd7j\x8f\x83<\x9e\x9d;|\x97\xe2\x0b\xff\x9d-\x18\x88\x85\xb2\xcf\x0c\x9fKw\xa5\xbaD\xcaz\xfftW\xab\xb0G\x08=\x1e\r\xc1\x0e\x92h\xd7:\xa5\xf4\xe4\x10\x10\x11_\x04\xc3\x1a\x00Lu6\x9a\x8b\xe8\xe1T\x90a\x07n(n\xf8\xa3$`\xe5\x9crR\tnd\xd4\xcf\xf5\xe2&s\x92Ca\xad\x1c\xf7\x9e\xe6\x99!\x9b\x8de\x12/\xeaJ\x18\x08\xc1\xc1\x0b1\x96`Pv\xdeY\xbb\x0ck\xcf\xb3\x93i\x15j\xcc\x11)\xc9\xb0T\x96p\xae\xb5\xff3\xa0\n\xad\xd1p\x19\xef\xc5\x81U\xe4/\x05\xa91\xd3\x9a\xf8F@\x93-\x8a~C\xdf\xcd@Kn\x91\x0f\xed\x12\xc3\x14\xf7\xbb\xa70\xc8+\xf6o\xb4\x9cC\x19\ns\\\x9dq]\x12\x05\x88Q\x1d\x87\xa1+\x962jSy\x1b\xf1\xf9$\xf8\xd6\xff\xa8\x83i\xe1Z\xba\x8e\xb7*\x00\xd8\xf7\xd1$\xc6\x02\xb9\x07l\xb2\xce\x83Q\x91\x8e\x83\x91g\xd9\xfa\x88\xedV\xd8gRDN~\xd1\x8c\xcc\xc4Ll\xcat:jA>HyL\xac\x85u4[\x9f\xa5\xd2[\xd5u\xbf0\xcd\x03\\\x10\x06\xfbP\xcd,;\xfa\xce\xcd\xeb4\xdeHsy\xd9\x01\xb7\xaeQ9\x94pdJ\xd7\xd5\t\xb7\xcco\xfeC\x99[\xcb*yEEhc;\xf2\xcc\x03\xc6\x7f\xbb\x12\x85\x8c]\xc3,y\x9bG3\x1f\xb7\x8a\x82\x96d\xcd\xf9\xed\xd00\x11k/V8B"\xdcJ\xafH\x0f\xe3\\\xe69\xef/N\xce\xf3k\xf7\xb5\x0b\xff\x8f\xdfq\x17,?6\xe4\xf00\x07h\\X\x88y\x81\xbcd\xb1%\xc1\x856\x8c\xd7\xf9\x8b\xd0\xf6s\xddH\xda\x94H\x15\xe9\x95\xfe\x98\x98\x84\xcf\xd5\x8a\xf2N\xfb\x16*\xe6\xc7\x9d5U\xca\xf8\xe8\xd0\x16\x13\x90nn\x05\x17\xf5\x946E\x9e\x86\xbdL\x82L\xc0\xdb\x1a\x91(\x04\xac\xfa9\xb7\x15\xda\xb8\x9f\xcb\x12\xbe\xbfz8\xfav\x19\xc2\x06 \x93\xc1\xb4\x91\xb2K\xc9\xce\xcb\xb4L\xda\xdf\xf6\xdb\x1cP\tr{\xba?\xf4\x8eX\xe3c=\x0bwX\x1ei\x03\xc6\x16&\x88!\x19G\xd9\xb7r\xd5d\x84\xa5/\xf0V\x08W\x86\xea\x92\xbc,\x8d\xd9\xa8\x9b\x8cR,)7\xc9L?V(DPM\x93\x04\xd3D%cBrV\xa5Y\xa5\xa34Ve\t8vq\xb65\xaf3\xe7U\xa5`\xa9\xc6\xb7\xd8\xf1%\x8f\xa2\xef\x1d\x8d\x84"\xee\x81\xa2\x85!\x15\x91\x1a\xa9}\xce\x82\x05\x07\xff\xc1:\xbd\xfd4\x86i\xb1\xfa\x89e~\x06\xfd?M\xa3\x9a&wI\xdf\xd2\xec\x86\xdd\xeb\x05\xee\xc8\xf3\xa9Gv\x9f%\xed\xa5\xa7Y\x8e\xae\xc1\x9c\x12\xa3P\x19\x1d\xf7&L\xdcB\x01\xbf\xa1o\x9d1\xc0\xf4\xd3\x88\x9c\xf9\xa2\xff\xfeK\xad1WsJ\xac\xb8\xd2\x1br\xe1\x05\xad]S\xee\xeb\xdf\xdf\xe0/Oi\x1a\x86\xb6Ynq\xae_\x16\xd1\xb2\xc8^-\x1d\xd6\x15\x0c\x0e\xec\xe0I}\x1d4m\x1e\x8d[\xb9\xac\xa8\xcd\xcfc\xfe\x88\x18\xb0b\xdeu\xd7\xd2\xef\x90z?Ci\xed\x9e\xe4\x8c|\x0f\x04E\xd7E\xb8\r\x0f\xef\xc1\xc9\x9a\xd1\x1d&\x13\xa7\x9c\xbfA\'\xf1<\x02=\xa8\xe8\x16\xd2l0\x83\x8f\x83t\xe1^\xa3[\x16<\xa1jp\x04\x14V$\x1b\xfb\xb2\\\xe2\x02~\xba\xddmj\x1c\xc6\xe0PZ2\xf9\xd9\xa7\xdd\xbe\xb1\xee\xf4\x1eI33_\xa8^C\xf6\xcf$\x11\xc8\xe3\xc9x\xc1J\x86N\xe1^\xc7\x99\xf2 \x14\xa2p\xb1\xc2\x14u\x1e\x90\xc1\x94\xed\x01\x82O\xc0\xc7\xcf\x97:\xf9\'k\xc8\xd9\x07\x17\x88\xb2\xeck\xa5\xb6\xd6\xdds%U\xf3\xbe\x9e\xf7\x8a&z\xff\xafb\xa1[\xe8\x0c\xc6ZH\xef\xb6<\xc0\xcaPu$,d\xf8\xf6\xa1\xbcm\xd4P=\x8c\xe3Q\xc7\x9f\xb9\xda\x89 |\xba\xe7\xe1\x93\xb9.\xfe\xac)\x84\x07\x91\xda\xaf8W\r)\xd3\x8c\xf0\xd2\xa7\x13\x83\xafl\x04\x16\x9fXn\xb0)v\xdd\xbcV\x1cj\x1a8V\x02\xae)\xe2\xc0\x07G\xdf\r\xde\xffkw\x08\t\x04\xa8\xa4\xd4 \x02\xcf\x88j?\x11C\x99\xabsZ\x06L"\xd4"\xd19\'4\x1d\x99&\xc16:\x93\x8eh-:Oj\x00\'N\xf6\xdc.\xe3\xf0\xfe\xf1\x99\x1d\x9b<\xb8TO>\xcc\xd9\x07\x82G\xb8,\xb7\xa7\xa8\xde\xee\xfcb\xf9\xd9>G\xb8\x8a\xd9\xc3\x97\x8bi\xbf\x128T\xf9\xd6\r\x8eq\x1e\x0bI\x85N\xdf\xd7\x9cx\x9e\xd7\xfb\xdd!\x9b\x17\xc3iP\xf4:\x8eO\xdcc\x99\xa0\xcf\xd0\xb6D\xd6\xf8\xbc\xd9\x93p\xd2\xc7\x04+\x11\xb4\xb7="[C\x93#\x92x\xd3\xbb\x98\x065\x0f\x7f\xcc\x04ja\xea\x05j\xdf\xa9\\4\xb2\xdc\x89\xe3\x8eD3n\x04\xdb\xf7\xac6\x911\x89\xd4\x955\xe1@\x05\x05K\xa1\xb2\x17\xf86\xff\x8c\xd4\xe1"Q\x9c\xc7\xbd\t@P\xa2\x1bh\xa8C~\x1f\x01\xdd\x1d\xea\xd1\xf3\x90g&\x99\xd8&O-B\xb3qB*N|-k\xa3x>\xe3\x9a\xc0<\xae\xa00\x06j\xd3\xd4\x9e\x9fc\xe5\xa7\xca\xb2\xfa#c\xa3l\xc3X9\xef\xb1]\x95\xc4\x94\xbb\xech\xb0\xf2\xbf\xd1#\xf7`=p\xc7\x00/\xfd\xe1\x81Q\x05\xc0\xa4\xbc\xb2\xf3<nr\xa1y\xb3\x9d\x1dO\xcf<\x1c_,\x0bV\xa3\xcd\x15\x18\xccI\xdc\x16o7\xb6P\xaf\x1ar\xcd\xcf\x90\x0b\xbc:3\xbf\xbc\xd7\xc1\xb9\xec\xbez\xcc\xda\xb4\x0eaq|\xa6\x94\xfe}\xc6!\xa4\xfe\x0b\xb4\xf5K\x0eP"\x83\xb3\x82\x89\x90\x1c\xfc0\xa5X\xa2\xe1\xdbk\xefu\xdd\x14t*\x99W\x87\x17\x9b5\x1c\xe0\x91\x08[\xbe\x83\x16\x1f\x12\xd0\xa8C\x15\xb7\xde\x16-\x8bs>#\x18x\x0e\x16\'W\xb7\xccV\x8c\xb6\x98\x05\xf2\xb77\xd8\x01\xf4d|\xce\x1e\x8d\r`\xc0\xef\xa5\x8e\xc2\x00,{E\x02\xde\xe5\xa1Vy\x08Dy\xe7\x06\x92\xbf\xafF\xc0\xc8\xffzV0l\xae\x1e*rcAy\xa5eS|\xa2\xe4V\x1f\x123\x06\xee\xe3\xe11\xda\xdazNy\xfd\xb1\xcdKf\xbdU\x0ecT\x88\x9co3~\xf4\x06\x1f\x93\xd2\xdev\x93\xa2\x03\x11\x83$\x82\xa4\x0e|\x0b7\x06@\xb1q\x94~g\xbd\x9a\x0b4\xf5\xc8\xdb?\x01T\n6Y*\xe6\xd5\x94\xc4\xf1\xbc\xf8\x9e\xd6W\xea\t\xc7y\xb9\x86\xf5\x19\xb3\xfb\x88X0\xca\x0c\xe0R\x0e\xadlP8\x03\xd1E\xe0\xed\xeb\x95\xc2\x14\x98\xce\xca\xbd/\xe1\xb7|\x1c\xf3\x1c\x7fGK\xf9p\xce\x8b\x99\xe2J\xac\x028\xddZ\xd2"\x068*\xcd+\xbd\xebj\xde_\xa5\xcdP\x1d\r9\x16$\x88!\x88\xd8\xa0\x99LVVP\xf4/\x01\xdb@\x01\x19\x81\x93\xbe\xe4\xeb`\'\xb9h\x8f\xe1\x07W\x08\xe0\xaa\x98\xc4\x0e\xba\x97\xcf\xbe\xd6u8\xfe\x08\x00|\xa3\xcd_\x88e/\xdd\xa7\x86\xc3?\xebf\x89V8\x149\x99ouJ\x16^5\xaey\xd6\xb1#>c\x94\xa3\x99\xab\xe9\x91\xd6n\xce~\xd6M\x97\x1c&/\xb3V\r\x06\xb9\xc2W\xf3\x8brm\xf6\x04\xd7\x92}2Ee\x8fx\x03O\xd3\x01\x88v!\xed>\x9a\x9eg\xf4\'CU\xa8=@4s\x92\x17\x9d5\xa1\x99\xb7\xbeq\xf4F\xc2\x1a!3\xef>b\xc5p0QJY\xf4\xa5k\xecB\x95l\x8f\x02\x0e\xa1\n\x19\xd5\x00\xbft\xc6j0D\x0f\x90\xa3\xdaJ\xbb[\xe1S|$\xd1\x9d5\x8fs\x02vZ`K\xfd\x04\xe2Uq\x19hd\x89\xa7w\xf4J,\xcb\xf6p\xaa\xc6\x877l\x9cg\xe5\xc6\xc2g_\xca\xad\x9ef\xd9\xd8\x98\xa1\'xt\x90a\x7f\xe8\x1a\xf5\xd7\x83\xf3\x03\xa4\xfc\xdf\x07\x1c\xb2\x06$\xa1HI/\xa6\xe1\xd6\xdb\xcdD\x04\x84\xd8\xf6\x8a:\xf3\x9c}\x00\x98\xfa\xbc;J\xe9b\xfb{x\x02\xa7Wc\xc7\xf1[\x01P\xa5;Z\x10\xf2-\xb1U:\xd8\n\xd3\x8aM\x9b\x9b\xf3/\xd3\xe7\xcc\xc6\xe8\xb06\x17\xb6X\xbe{\x04\x84\xe9Y\xe7\x97\xa5\xe1\x1f\x1e\x07d|\x99\x9d\xf4\xc8W(\xfe[>\xfb\xe8\xebB+E\xbaz"[\xf5^/7o\xde\xd3\xc0l\xb8GC\x98\x92}D*\xdf\r\xdfo\xc9\xa7\xecl%\xe8\x9b\x19\x83\x93\xd0\xe4\xb1D\xf9\xf9MC\x1e\x92\'\x05\xb71\xf8\xd5E\x82wr\x12\xfeT\xc1z\x99\xb6\xc5\xba\x1d\xe3\xe2\x9c\xf8$U\x02\x00\x84\xa0&\x03\r\xe5\xde-\xdd{\xc5\x1a6\xf0\x1dy\xab!\xbdee\x90\x1b\x82^LO\x87\xd8P\x0e\xab{\x1b\x02\x81V,\xf6\xceL\xdc\x9b\x8d\'\xd5\x94TI+d%\x13j\xb1\xde\x91\x1b\xf6u\x1b$\xb1\xd2\xb5\xce\x0b}\xe0u\x9dq\xa4\x1b\x87\n\x18\n{\x9c\x16X\xa8\xbc\xcd\x98\xb7\x8b\xf5\xb09v\xfb\xd8x+\x17\xb1\x95p\x1d\xc6\xa7\x10\xc3\x8d\xfe3\xbc\xcd\x18RI\xd6\n\x9a\xd2\x8e\x11\x0c\xd4\x19a\r\xb4\x9e^\x8a6\x98\xe4T\x81\x9bn\xbbJ&\x9e^\xfd\xe6\xd3\xa4j\xd71\x80\x0e\x9c\xe5\xa3?\xaf\xfd\xc6\xc9k\xa5\xfa\xc2\xfe\x84\xb0\x1e;y\x16x\x94\x07\xa7n\xf4^\x17\xf4\xf9\xd5\\\x94Y}\x88\x92\xad\xa0\x06\xa09\xa2\xa1\x80\xf83F\x9ed\xbdV\n\xb6\xe9\xf39ED\xb7V&\x1f\xa6u=$y\x16"k\xe2p\x12\xa8}\xe6\xb4t\xb3\x0bj\xd13&B\x19I\r5\x9a#\xfd`\xaf+\xd2Kb\x9eP\x9a\xf5\x07\r(V0\xea\xa0\x02\xe6\x81\x8eG\xbb\x99\x08\xf4\xd6/\x93\xf1X ;\xb1\x92EZe\x85Lf(\xd3\xe4\xbc\xc8\xa5\xbdt\x05\xb9\x92\xe4:\t\x13\xdc7\x9a {\x11\xfd\x0e\x98\xde\x88\x1d\xca\x7f\xfe62\x1e\x8c\xab\xcfYI\x1a2\xdc\xe1(\x93K\x90\xd6\x06G\x83[\xc6K\xeb)\x9a5\x0c\xe4\xca\xd6@\x15M\x85\x0cQO\xd5\xfeu\xad\xc6\xact\xf1ll\x88\xea\x8b\xc5KZP\x01\x0b\xa0\x9d)=\xf1\xbb3\xce\x82\x92\xc5\xe9\xb2<,\x96\xfc\x0fi\x9e\xed\x8a\x9f\xeb\xfe\x0e\xefSw\x86\xa9\xadO\xba\xdaGF\xd0izxO\xa0\xd8\xa3p\xf5\x0eq\xde\xe3k-\xbb\xc5\xe5m\x8d\xab\xd6\r\x16\xd9&6\x8d\xbc\xf6\xbb\'\xb4<\xf9\xa3j,\x99\xec\x90|S\xef\xe5\xae~4\x8d\xb2\xcd\xca\x84b\xf2\xb0\x89@\x9b\x95\x85\x8f\x8dr*\xa0\x96h_\x08\xa0X\x96\xfc\xa9(j\xe7\xa48\x98\xd4FK\xdds\xd2\x8b\xe0j/y\xc5\xf2\xe4[\xbc;*\xcc\xed\x03iO\x8ev\xbd\xc2V\xdcb\x80\x08\xf5\xe5\x80\xf9&l\x8c\xbc\x8e\x96Wo\xf0\xb6\x1c\xaa\xfd?`q\x10\x8e\x92R\xea\x8d\xfd\x8fm\x9f`\x1f,\x12\x1a\xc8\xedE\xd3\xa1\x84\xe1\x16\xd6\xa7H2\xe4]\xa7`\xda\xe9\xbe\xbf\xed\xe1\xbfo\t\xc3\xb7\x1d\x86N\x92\x8a\x0b\x8f=\xe4}\xa61\x12\xb7\xcf\xe5\xfd\'\xe9z\xbd*\xbf\xc0\xbe8\xcf\xe2W`\x95\x10\xe3\xc1\x01s"\x89\xfdM\xe0\xa6LA\x13\xff\x9dz3W\xc35P\xa3,AwC0D\xec\x81\xeaZ\t\xb3\xcaN9\xce\xeb^V\xf8\xe9B\xb0~\x80\xcbsQu\x00\xa5\x18\x07s.\x14\xff\x94D\xbd\xd2I\x90m\xbdT\r\xd7tnE\xe4\x04\x90\xb4\xf8-\\\x8b\xaa\x8f\xb2\x7f\xb4\x1es{\xeb\xc0\xd9\x1b\xe64\xc77\xed\x02\'\xff\x84%\x87hB\xed\x87<\xe2EG\x92\xe1%2z\x16\xe1Y\xf1\x08\xf8\xeb\xf8\x1f\r\x03@\x8d\xdb\x07\xbe\xf2\xd1\xffW\xcf_ipa"T\x0e\xb8\xef\x1bh\x10\xaa\xd6\x9f\xb2\x87\x0f,\x1f.gf\xf3\xb1+T\xcd\x89SV\xf5\xad\x1ct\xc6\x8e\x1f\xf6\xa6\x01\xb2\x17\xcb\x9c\xba\x8e\xc9\xd8\xc6\xd8\xb1\x80\x88\xae\xe8?\x98\xfa|\xf5\xb3S\xa8j;r \xc46\x84e\xc4\x98A\x1c\x17\xca\x05\x12\xfa\x81\x93\x0c;!\x8c\xc43#\x06\xcbW\xc1\x15\x97\xf7A[\x8e\xea\xedG\x94\x1a\xce\xbb\xe3\x12\x8b\x8f\xd4\x8c\xf7h\xc1\xd0\x07\xe9\x8b\r\x8f\x16\x07\x06\x8c\xe5\xef\x0b\xcaP~\xb1\xfe\x08\xc2\xaas\xe0\xf8K\x12Z\x80\xb1I\xaa\x02\xdc\xd0v\xe9\xfa\x9f\x9a\xb0\x981\x02e\x8c\xe3\x80\xd1\xae\x17\xd6\'\x06Gr\x97\x03\xe0!\x99\xf00\xdb\xfa(_H\x80\xed~D\x19\xdf\xc3\x11\xa4\xb1\\\xf5\x91L\xae\xe7x\xa5\xc4\xc0\x13\x89\x90ws8Sk\xd8~=\xbd0\xd9\xed\x950\xc4.7b2\xe9\x85\x12\xb7\x95f\x8a\x966\xaeea\x81\n\xd3L\xf20\x95\xd3p\xbe<\x88i\x0c\xcd\x1f\xeb\x1d\xach\xff!f\xc9q\xdd=`\x00\x9f\xa79{\xad\xcbU\xfc\xd7\xb3\xd3\'\xfa\t\x1f\xc9vY}\xda\xcc<\x93\xe7\xab\xf2\x8ail\x0f\x8f\x9e \x0cj\xda\x01Lp\xb1\x8e\xd9\xf0\xb3\x9eF\xc7\x96\xf1p}\x16\x81\xb1\xe6\x94<3\xa69\xe1\xc5\xefC\x0e\xe1\t\xe2s\x8c\x82\x11\x13Ss\xef\xa6\xe1\x87\x8b\x18J\xd2\x1by\x13\xab\x04\xe0\xd7v\xd0\x14o\xb57\xae\xaa|"\x83\x9d\xc3\x0e+7\xf9\x8d\x1e\xf5\xe7\x846\x194L\x02\x9a6\x08\tl\x96\xa1%%\xe1\x0e\xa9\xe7\xac\xf5,\x8c\x94f\x16\x0e\x13k\x81K#|\xe5\xdef\xc4k\xd8E\xd2pU\x1e\xbc\xc5\x8a\xd2\xbe\xecLD\x19\xa3\x9f\xcc4\xf7j\x0c\x1c\x8c\xdb%\xa3}\x87f^v\xa5n]s\xfa\xf4\xb9\xd5e\x07\xc5#Du\xb9\xec\xbdr\x9fi\x96u\xeb\xdc\x1a2\xd6\x1e\xa5\x14\xf1,\xc4\x92\n\xfd\xcd\xc2\xb6\x98o[\xe1\xae\xac\xbc\x92\xb6j\x83\xc9T\x1b\xd9\x1d\xb9\xfb\xd4\xf5\xbb\xba\xb2\'\xdf\xb25\xb5z\x0c\xad\xb4\xd2;!\xa2\xbe\x83w\xae\xdaH\x1f\xb7\xa7\xc1\xd8Rb\t\x91O\x0f\xbc\x83Rd\xe8V\xfc\x07\xbfGH\xcb\xf8w\xd4)\x0e\xd3\xe1\xec\x8aU\x1b\xdfy\xa9fQ\xec/\xa5\x13\x1d\xf4\x1e\x8c\xb9\xa4\xd8d\x12\xdd\xd4\xe6\xf7\xb7\x9c\x80\xfcK\xd3\x98\xfd\xf5p6\xab\x87\xbf\xac\x0bo\x89=\x92\xee\xfc\x9e\xd4\x1f\xfa\xfe\x8c\xb9<\xb7eD{,\x82|\xdau\xdd\xdb\xeaHg`\xe55\xe4$\x0c\x95\x0e\xb8F\xf3\xc8o\xce\xdd\x0e\xad\x0f"$\xef\xc1\x8c\xda\xcaG\x7fr\xa2@P\xf8\x94\xc3A\x86\xd2^\x8f5o\x859\x0b,5E\x12\xd9\x0bl\x07R\xe3f\xc6\xb3*:\x8f:D#cCMIN\x04\xd3\xd7C}?\xda\xc0(\x8c\xf45l2\xf4\x1b\x01\xa4z}\xbe\x9c\x812N\x87\x1cca\xf1\xbc\x14\xc1\x0c\xd2T\x95\x99dif\x92\xf0\x83\x8a\x1c\x12\x83\x1d\xba<\xcc\xa0\\\xbf\x1d\xb1p\xdf\xc71\xa5\xf9\x9c\x06Z\x05\xf7r\xdfX\xe0\xaa\x1e\xe1\xd2\x17Q_\xd6Nl\x0bs\xc1\xd0\xa8\xba\xfb\xbaq?\x1f\x04\x1b\xdf~\xfd\xbb\xdd\x87\xff\x96\x97\xd2\x17\x8b\xb0#\xb6\xd1\x08\x8d\rH\xb9\xc0\xc3\xfe]\xa7:\xb8<\xdb\xb9\xcc<\x8e\xf5\xe0\xfd\xc4`\r\xd5/\xa7\x9d\xe3e\xce_\x91c\xa5\xccJ\xdb3\xf1\xd5v\x02b\x8a\x85\xb2\xc1\xd4\n\x1f\x81\xeaE\xe3\xd3.\xdc\x81y\xd1&\x9d\x8fbD}\xa5\x0c\x95T{;UY\x10q\x08\xf5\x87\xfc\xbf\xfe\x97yP\x94\xd8><\xd2\xe1\x11H\xado3\x9e\x1e\xbcn\x16\x15\xe6\xdfF\xfd&\xfa\xe2_\xb9\xc4\xc2.\x1f\xf6\xfc\x10!\xf4O\xa8\xfa_m\x0f!\xbdv/\xf7S\x8fU7\xbf\xd3Z\xff\xb2\x86\xfaQ\xea\x01wE~Z}?\xb8\xac\xcd\x0bE\xd7I\xc5>\x1f\xbdI\x0c\xbeUly\xb0\xa0\xc8\xe0\xaa\x96\xdb\xd6\xa5Y\x8f\x95\xb0\x08\xcf\xacI*~\xb3\xa4WKQ\x12r\xc2FP\xb0%k\xc6\xda\x90\xd9>\xed\xc4u&e\x94\xb5\xdcb\xb3\x85W\xe9\x87\x93\xa0~\xba\n\xe9\xd5(x\xfd\xc5n]\x05a\xdf\xc0\xde\xcfA\\\xa9\xbb\x00\xbf*\x93\xe0i\x95]\xb5V\xfb\xa3L\xbdA\x88a\x90M\x80~i\xa7\xa6x)- v\x1d\xfaT\xc8\x83\xe4?r`M\x87\xce\xd1z[\'\x93\xeb\x9f\x9c\xb05Lqk\xcd\n\xac\x9e\x91O\xcdy\xf0\xb4\xe1\x03kP\xbb\xb3\xcc\x06\x13"nP\xd4k\x02\x18\xceyV\xe8\x1d)%\x1d\x98\x1d\x94\x1aR\xa6\xcfd\x121\xbe\xe6E\xef\x1cS7tVX\x13\xbf\xd4\xa6\xa7j\x05\xf0\xe8\xc1\xe0\xda$sk\x89\xe4\x8f$\xc1\xd0c\xdd\xabM\x93\xd0\x83\x06(\xf8\xb2$\xce\x89\x9b\xd6T\x1d%@\xb7\x1e\xe8r8\x0e\x7f\x85)n\xc2,=\xc3\xfe\xa7$\xb2\xc2X[I\x86\xe9g\xf5\xbdA=\';]\xebI=r\xfb\xa9\xa4n\xc3\xa19\x80"\xa8W\xe7\xf7l^\x051\x83B\xbb\x91c\xda\x9a\xe33\xabl,ai\xe4[mS3\x87\xbd\xb7M+a3\xd6k(\x9b\x7fAN6\x7f\x8c}5Ar`\xa0\'\x98\xa9\x0ePF\xfa\xaa\xb3\x98Z\xb9/Wg@\x90\xab\xae#_\x1e\xac\x19P\xc9\xe0\x84\x8bw\xcc\x0f#m3\xab\xec\x0bP\x1c\xe4I\xaa\xac\\\x8c\xdc\x8f\xfb1\x1b\\\xc5D`)\x853\x96?\x17\x84\xa3,R\x12\x1av\xcc\x9d\xa5\xc7To\xec\x89{H\xba\x93,\xa0\xbe\xb7/\x80\xe7\xdd\x9b\xcd\x87zo\x94\xce\x00\xb2\xa8\xf1\x83\x92|\x08#\x10\xff\xb5\x0f$\xdb\xb2\x03\xaaM\xdd\xff0\x9a#\xde\x05\xea\xf2kJ\xc2lD\x12*\xd5k\xdb\x966"Yb\xc2LX\x12\xbe\x1f\xf7\x80\x9a*\xaa\xd7){&\xe7n}C\xd7\xb0\xb3\xb0\xc0~\x06R\x84\xb2B\x8c!\x122@8\x0f\xf8\xc0g\x9f M\x14\xebt\xa3\xa3\x9aX\xf4\xbd\xcc;Q\xc0=\x04\xa8\x80v\xbe\x03O\x8b\x0c\x9b\x83\x0b+\xab\xb9\xc4\x97\x1f\xecX\x90\xd3x\xea\xca\x86\xb0fg\xafG\x07\xa2\xc1iM\x84`D\xc0"\xaf\xe3\xdf\xa8\xe1\xa2\x19\x89X\x1c\x99\xce\xcem\x06*\xd9\x0b\xfeT\xba!\xb3 \xa3zvS\x9b\xad\x9c\xdf\xe2~,\x99\xc836\x00&\xb7\xf9>\x8c\xbbr\xd1\xf0c\x1e\xfe\xea%\xd9c\x11\xac\x82Z\xc2\xc1\x83F\xcc\xb3\x97\x97a\xf3t\xb8\x9f\xe1\xae')
|
4
|
-
|
1
|
+
from flask_admin.base import AdminIndexView,expose
|
2
|
+
from hiddifypanel.panel.hiddify import admin
|
3
|
+
from flask import render_template,url_for,Markup,request,jsonify
|
4
|
+
from flask_babelex import lazy_gettext as _
|
5
|
+
from hiddifypanel.panel import hiddify
|
6
|
+
import datetime
|
7
|
+
from flask_classful import FlaskView,route
|
8
|
+
from hiddifypanel.models import *
|
9
|
+
from hiddifypanel.panel.database import db
|
10
|
+
from hiddifypanel.panel.hiddify import flash
|
11
|
+
class Dashboard(FlaskView):
|
12
|
+
def get_data(self):
|
13
|
+
h24=datetime.datetime.now()-datetime.timedelta(days=1)
|
14
|
+
return jsonify(dict(
|
15
|
+
onlines=User.query.filter(User.last_online>h24).count(),
|
16
|
+
total_users=User.query.count(),
|
17
|
+
stats={'system':hiddify.system_stats(), 'top5':hiddify.top_processes()},
|
18
|
+
usage_history=get_daily_usage_stats()
|
19
|
+
))
|
20
|
+
|
21
|
+
def index(self):
|
22
|
+
|
23
|
+
bot=None
|
24
|
+
# if hconfig(ConfigEnum.license):
|
25
|
+
from hiddifypanel.panel.commercial.telegrambot import bot
|
26
|
+
|
27
|
+
if hconfig(ConfigEnum.is_parent):
|
28
|
+
childs=Child.query.filter(Child.id!=0).all()
|
29
|
+
for c in childs:
|
30
|
+
c.is_active=False
|
31
|
+
for d in c.domains:
|
32
|
+
if d.mode==DomainType.fake:continue
|
33
|
+
remote=f"https://{d.domain}/{hconfig(ConfigEnum.proxy_path,c.id)}/{hconfig(ConfigEnum.admin_secret,c.id)}"
|
34
|
+
d.is_active= hiddify.check_connection_to_remote(remote)
|
35
|
+
if d.is_active:
|
36
|
+
c.is_active=True
|
37
|
+
|
38
|
+
return render_template('parent_dash.html',childs=childs,bot=bot)
|
39
|
+
# try:
|
40
|
+
def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
|
41
|
+
domains=get_panel_domains()
|
42
|
+
sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
|
43
|
+
|
44
|
+
if def_user and sslip_domains:
|
45
|
+
quick_setup=url_for("admin.QuickSetup:index")
|
46
|
+
flash((_('It seems that you have not setup the system completely. <a class="btn btn-success" href="%(quick_setup)s">Click here</a> to complete setup.',quick_setup=quick_setup)),'warning')
|
47
|
+
elif len(sslip_domains):
|
48
|
+
flash((_('It seems that you are using default domain (%(domain)s) which is not recommended.',domain=sslip_domains[0])),'warning')
|
49
|
+
elif def_user:
|
50
|
+
d=domains[0]
|
51
|
+
u=def_user.uuid
|
52
|
+
flash((_('It seems that you have not created any users yet. Default user link: %(default_link)s',default_link=hiddify.get_user_link(u,d))),'secondary')
|
53
|
+
|
54
|
+
# except:
|
55
|
+
# flash((_('Error!!!')),'info')
|
56
|
+
h24=datetime.datetime.now()-datetime.timedelta(days=1)
|
57
|
+
onlines=User.query.filter(User.last_online>h24).count()
|
58
|
+
total=User.query.count()
|
59
|
+
|
60
|
+
stats={'system':hiddify.system_stats(), 'top5':hiddify.top_processes()}
|
61
|
+
return render_template('index.html',onlines=onlines,total_users=total,bot=bot,stats=stats,usage_history=get_daily_usage_stats())
|
62
|
+
|
63
|
+
@route('remove_child', methods=['POST'])
|
64
|
+
def remove_child(self):
|
65
|
+
child_id=request.form['child_id']
|
66
|
+
child=Child.query.filter(Child.id==child_id).first()
|
67
|
+
db.session.delete(child)
|
68
|
+
db.session.commit()
|
69
|
+
flash(_("child has been removed!"), "success")
|
70
|
+
return self.index()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
71
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,196 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xe4\x1f\x00\x00\x12\t\x04\x00\xad0\xacK\xfe\xe6\x04\t:1$\x9f\xa2\xfa\n\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x181\x7f\x9b\x0b,\x13i\xab\x8e=M\xa6\xbd\x859Y\x82\x95+\x9f\x8cd\xe2\x1d\xa6uiw>H\xea~\x08\x97;jtU%g.\x98\x8c\xb7\xc6p\'x\xe6\xf5\xac\xee\xb5kr\x08\xd9\x9c>\xde\x96\xa9\xd7m}\x02\xf8\xff\xb2\xe8\x90\xdf\xf8\x1e\x99w\xb4q}\xd0\x9c\x08/\xf0!\xde5\xe9\xf3\xbb\xf9\x92.0\xb0\x8d\xd0\xa2\xf8\xac\xc7\xfd\xc8$\x8cBh\x00\x80\x1cm}\xd8\x1a%pX\x85\x81\x12\x95R\x1b\x98\xbc\x9a_\x18\x05\xb7\xedO\xceP\x86\x9e\x9f\xbc\xeb\xe6\xff\xc46M\x16\xbd\x88\x0c\x9b\xcc\'\x92\x9d\x8c\x02B\n\x05\xfaCo\x14K\xbfD\x1f\xf91\x7fZ\xdf\x96\x049XO@f\x15\xa20\xaf\xbd\xa5#Q=\xddy\xfa?\\\xef\xb6G\xfd\xd7mk\x00\xd2[\x1d\xfb\xba8}\x90\x17\x13*.\x9d\xa5\xb3_\xc67L%\xdf\xf3p,\xbdfs\xb8\xb1eB\xefbr\xfca\xd6\x9f\xee\xfc\xc5\xdb\x13\xeb\x8c\xae\x7f\xa9\xbe\x9f\xcdn\xd7\x0e\x11{\x1e\xd4h\\{\xcf\xb4n\xcd\r\xa5\xa1L\'R\xeb\x16h\xe8tju?x\x9a\x1aL2}\xd1\xdf\x9d\x102\xe2\xce\xfa\xaa\xac\xa1\x93\x8anBw\x80\xdc\xc3\xf9H+t\r"\xdd:\xfa\xfb3\x01\xb7\xf9_\xcb\x16[\xe2\xf1[\x0cEc\x9b(\x99d\xab\xc1\xb8\xbc\xd6\x15\xe6E?\xf6\x06Rt&\xe9\xa3]5\xd0\x1d\xaeHAR{\x80\x0b0\xfe\xa2\x9awUo\xe7\x1b\x99\xc7ywA\x1cq\xda\xab\x8fz\x8d\x02G\x98\xfb\xf5\x93\xb2\xfc\xab\xcc?\x97&\xff\xcc\n\xe0\xa8U\xb4\x84\x08B,\xc0\xcb\xb2BI\x97\x8a\xa9\xa8\xcb++9\xfc\x8b\x96\xf5q\x1f^\x16\xb2\xc9\xc5\x00\x98!2L\xed\x16\xef\xa9\xf8T\xeb\xed-\x8d\x8f \xfe\xf1\xcd\x10Z\xb5\x0ep\x81\xa7,\x11E\xcb\x86"\x9d?\x85\x7f\x1f\x0f\xedy\x16\x98\x05\xe2\x16L\xf7\xc5*\n\xd5\xdbI\x8cpG\xf2\xc1\xd0\xa9\x18\x0b(\xf1\xa4\x01_\xf8\x9a)K\x8e1\x98\x0b\x90\xf3\xe9\x14\x9e\x0b\x10\x94\xe4\x06\xa9\xc2\xef\x92VA\x95\xf0\xb0\x8cF\x07\r\xcbi\xdd1\x10&\xeb%J\xc4\x01\x08A/d?O4\xa2I\xe3j\xfd\xc9#\x8c\x7f,\x88\x06\x055.\xc8\x9bO"8\xdb_\xc0dBfW\xf3\xb2\xb4\xe3\x14\xf6\xca\xcf\xa9\x7f\x05`\xfa\x98MO\x11\x9f\xe4O\xbb9M\x02>\xf4\xdf\xeb\x81m\xbc\xc69\xf5R\xf3:\\\x80Lj<u\xcf^\xe7\xb5\x00A\x86\x87f%\xde*)\x8b\x1c\xf9\xf4\x9d*\x19\xc5\xa2\xfd\xef~v\xc5\xe6\xa2\x9d\x1b<}\xe4\x14,\xfd\x03\x95\xbab\xcbW\xa5K\x13\x1bz\r\x83\x8b\xbek\xbb,a\xc4J\xff*\x05\xb5A\x18\xc1\x1d\xcf\x8f\x99\xe5\x11+2\xa5\xb3\xfdM\x8a\xd1\x96zY/\x06YEw\x9bg\x87w\x8af\x80\xca\x0fD\x83V\xf5>\x9b\xacs\xb5\x9c\xef\x05\xe9\xfe\x00\xdaf\xb7\xb5\x15\xf8\x91A\xdf,\x82\xb9\x87u\x020\xa7\x8cInyv1\xed\xf8\x9dF\xe6\xacCR\x91\xde\xbd&\x9a\xa3\x86\x1c\xf4\x80\xbc\x04V=q\x8c\x80<[M\xcah\xc7\xe84\x85\xd6\x12\x81\xee\xe17\xae\n\xa9nz\x87\x0f\x81jVhh\xe0eh\xb4\xf1\xeacEc\x19\x9d\r\x8f\x97\xd8\x1e\xd9\xe0Z\x166\x14\x9c\x9bo\xd8\x81\xc3\x85\xacjnf>p\x11c\xc7\xaasZ\xf2M\t1]4\x80L\'\xac[\xd5\x0b\xc2IHk\xc52\xceYs\xa5\xc39\x11\x81\xda\x08\t\x89%\xd9\x98`F\xd7\xf2\x95J=\xfbc\x06\x8b7&\x97\xd4\xd1n7\x88u\x8a-\xdd\xfbV\xe36\xca(\xdb\x93Wn\xe7\xb0,\x03a\xbav\xcc\xd5\xcaK\x9a\xbe\xb6\xfd\xbe\xeb\x96^Y#\xab\x17\xeb\x84\x08j\x14\xd5\xb3>\xf2\x11\x00\x96Iw\xdc\xac\xb8\xb4\x9c\xe4\xdd\xd1is\xad\x90-"\xfa\x92-"E\xfc\xb1p\xe8O+*I\xca\x035\x96\x9b?\x08&\xb0O\x08\xd8\\f\xe6]\xee\x82\xadh\x98\x8a\xa6\xbbW\xaf\xa7\xdb\xb8\x0f\x9b\x19&\x86\x9e\x9e\xfa\x82f\xc3\xd4\xd1\x11EU\xd9\x85+{\xb1<f\x10i\x0f0\xd1\xefX\xd2qW\xe8\xfb)\x10\x8d\x9f\xb3\xd5\x80/\x90C\xc0i\xe3\xf2\x85\xf4\xba\x0b\'\x8fA:\x13Z&\xd7\x06\x9c\x1f\x0c]\xb7\xf3`%\xb5h\xd9{Y9l#\xc9\x89\x03\x85\x8a\x83\xb7\xde=\x9e8\xfa\xb8+qs&\x0eL\\\'\xf2\xc3b\x10\xf9\x9a\x96I\xee\xa5\xf7\xf4\xf1\x13(\xe1G\x13\xff\xb1\xfa\x15t}\xb0_"\xdb\x8b\x08\x1f;)\x0e<\xf6A\xcd\xe5\xa3`a\x0c\x07\xdb\x9b\x8a\xb1\x0c\xb6~\xf5Jx\xc6\x08\xfc\x0fdG\x90\xf8A74\x8c\xc3\xf1I\xc2e\xf0\xc6\xb4\xab\xbc\x8f\xf6\x82\xa6Z\x16\xdbw\xf8-I\xa0\xd4\xd7\xe0\x074Ln\xf0:\x86\x1c\x14T\x9f\xacm\x06e\xb2\xfe\x88G\xff\x04\x17\xba\xbe\x02\xd5-\xd6\x7f\x13\x8e\xacY\xe6AD\xe8\xd1w\nF\x8e\xbd\xec\xb7\xa5\x0f\x07\xa8 \xf1Y\xe2>\xdb0\x12\xbf\xb3\xd4\x03\xfc]\x027n\xa5\x16\xfb\xbaUY6\x9a\xd2it\x0e\xe7)\x12\xbe$U\xac\xdfPhi\xd1\x8d?\x0c\x01\xa1|\xb0K+\xbbl\xc4\xa1\xf7\xe0\x16\xd9E\xd5x\xc9Jm\xfe\x1c/\xd6q\xa2\x81\x15\x07\x9b\xad\x01\x9b?\xa4\xe6\xfd%h\xbb\xc7G\x1d\xc4m\xa0\xef\xd2\xad\xe3S[C\xf5g\xdb\x88\xb6\x0bc\xb2_\x98\xbc\xdf\xfc\xcc\xe8\x13\x15\x92k\x9fC\x92(\xfe\xf1\x1cv\xc8v\xe3\x7f\xedY\x8e\xc8U\x11\xf6\xcd;\x9cN\xa1\xa5\xd8\xaa"U\xae\xdas\xc8Af\x97Q\xda\x802\x06\xb9\xdd\xba\xd1\xf3{\xc6\xbd\xb8\xe4\x18\xde\x90\xbc5\r\xcf*w\xbd\xb3/6j\x8d\x85r\xack\x83\x03\xa9`s\xa6\xb6gaHR\xd9\xc8~wW\x08\xb7\x96)\xf5\x90f.m\x96\xd1\xbe^\xc1\xd7\x17\xa4b\x1b\x85\xca\x16v\x0b\xd3\x7f\xdf\xd5\xed3Z\x07E\xa3T\xb3L]:c\xd4}q<\xa7>\x0c\xd8\xd9\x14o\x00=\x9c[\x18\xceJB\xc4\xfe\xbb\xfe\xd9i\xea\n#\x9a\xcey\x85Km 7\x1f\x87H9\xe5\xb3=\\\xb6HZ\xc5&0\xcc\xf5\xcfR\x8b\x7f_\x0e\x18G~\x80\xdb/\x0b\x01\x1a\x18\xb8\x91S\xc1\x8927\xc8\x1f\xe9\xec\xc3e\x81\x80\xf6Gpa%\xf8\xdc\x1f\xfc\xea0\x0bHt\x0e\xd3d\xe5\x1c\xdf\x02\xdf\xaa\x8c\xab\xa2\xd5g\x9fRu=U\xaf\xa6\xdeP\x8a>\xfa\x83K\xd5\xca\xf3\xae\x85\x9f\x89\x12\xa0\x88\xd6\xcf\xe3\x88\xa4|\t\xa6\x8e\xd6\x9a\xa2\xa3\xaePz\xb8\x1f+\xbb\x0c\x10\x8b\xc4b\x10^\x95\xb1N\xdeN\x90\xe2@I\xdd\xc5_o\xbd%=xz1\xb7\x99&>\xd6k5MC\xaf\x8c>\x86r^\xc7\xe4\xb5\xde\x81\x01\x14\'\xb9\xa7ax6\n\x0f\xbb?\x1eb\xd3\xa9@l\xad\xabH\xc08_\xbe\xb06-vOb\x06\xe5.y\n\x01\xa9\xd6 \x1e\xads;P\xe7q\xa2\xf4\xe9 :/\xf2\xfan\xe3\xd6\xefJ\xb9Hs\xa1\xeb[5\x00E\xa0\x81\xd3W\x9a7o\xa7\xff\xf7\xf5tom\xcc;N\x81x>\x0b\\\xce\xe2\x8f\xd4k>\xdedh\x87\x153\x81\xcb"\xc6\xec\rz\xdf\x05\x16\xe4\n\xd4\x1f)\xa5f\x97\xa2\xeaE\r\xd8\xff\x19\x18\xbf&\xec\xdd\x1c\xe4\x8e\xcdV\xa6?\x81F<\x02\xe4"\xb4)1U\xc4 \xf4s\xfb\x05]\xcf\xc59jp+\xb0\x06x\xfcs\xf0\xea\xe2\xc2Y\xc8\xe4n\ta\xa2\x1a60\x8b\xe8s\x1c\x0e\xde/\xc8\x01pD3\xbcm\xe2\x1c\xd9}\r\x17\xa0\x86\x93\x17\x18j\x95a\x97Y\xe3\xc9\x18\xc2\x997\x0bj\xd0\x8a\x8e\x0c\x1b\xcd\x08X\x95\x90J\xe2\xa9\xbb\x81\x1c\xadv\x10f\x14\xa4\xc2n\xecMt<1\xe7\x8e\x85=j\xc8#&>n\x92d\xb4\xf7\xe7\xdc2w\x90\x8f\xbf\xda\x03\x1c.\x1ehh\r\xfa\x0c\x0f\xe7\xbb6\x13\x98\xee\xe7y\xbf\xb9\xa2\x9c\x9a]\x84\xab]\xcf\xd2\x0c\xee+\x81*\xf99\xd3\x97p\x9d\x12FI\xb0j\xd8\xe9\xa9o\xa7\xb5\x9f\xc3I\xcf\xa76\xab\x05\xa0\x99`\xec\xae2\xb2\x08\xa7\x0c\x08~\xf3\x9b\xd6\xfb\xe6\x04S\xb2#CA\xe0z\xd1N\xa5\x9f\x973F\xee">\xe56\x03J\x83\xcb\xf2\x01\x92>8\x9b\x1e/O=\x9b\xe4\x03\xe2K\xd1\x7f\xadj\xd1\xc9\xfd\xd8J\x14\xa0E\x92\x94\x89\x0c\xb8}A\x0f\x9b\t*KD\xb3\xb6\\,I\xd9\xb4\x1b\x02\x8d\xb5\x0b\xb6^\xed\x1c`yk\x11\xa1R\x16\xe5qcy\x1aNVr\x85\xcdSg\xdbV\x90HH\xec\\{8u\xd8R\x91\xad\x1f\xca\x96]\xbd\x80\xda\x0bd>e\xf1\x8e\xce\xe8\x0f\xa6\x04\xf5)\x06\xfb\xdf}\x83H\xdc\xaf\x8f\x8e\xbf_\xb4\x99\x1a\x98\xad0\x13\x8ao\x08\x81\x92=\x97\xc8p\xcc\xc2\x0fy\xeb\x14\xe8Q\xc6*\x84-\xcb\xe06XR(/_\xfd\x0e\x00\x9b\xed@\x80\xc3IN\x12\xed\xc0\x8a[\xc7\x87B\xf8N\xe5\x1bR#\xe6\x11r\xa7\x9d\x1f\x91Q.\x9d\xfc*^\xc3\xd5\t\xf5\x1f\xd4\x11?\xa3\x01k.\xb7\xea\'\xee\x040(N\xec\x92\x96\x9dCS\xd7\x84\x89\x94\x04\x00/LGI \x18g\x95\xbd\x81z\xdb\xa44\xd9\x86\x9a\xc1o\xe9Q\xc5\x1c\\"w\xb6\x12\xb0\x89\xf09E\xbd\x14\x88\xbcG\xf3\xc0\x1ek\x96\xb9V\x0eeM\x15G\xbc\xaf\xea\x9d\xe6\x05\x94)\xe5z\x80R\x06\x03t:\xe7t;\xf8!FW\xe7\xce\xa2~I\x9ar\\\xb5\x0c\x9e\x15\xb8\x0e{\x06M[[\xed\x10\x15\xec\xe1 \'\xe4\x19^T\xc7\x94\xe7\x8d\xfb\xae\x89l\x83\xc2\xae\xd2t\xfc0D\x15\n\xd9S\xc6\xe5\x89\xcf\x9a\x9e\xff\x96\x8ee\xfd\x8eb8m\xb7\x88[\x9e@09z\xde0p:|08h\n\x048o\x8f\x8b;\xe1\x00\x08\xae\xc5\r\nVi\x0b\x89\x0102b\xf6\xec=\xf4\x8d\x9d\x8ai\xb5\xb4\xeem\xe9\xceJ\x95[#\x97\x8e\xd5+*\xe2>\xec\xed_\xe1\xa4\xe1E\xdf\x06\x99\x96\xde\xedA&0\x06\xae\xfe\x95\xd8\t\x80\xc0\xcc\xda\x9f\xc1;\t\x10\x19\x93\xf5\x1b\x80\xcc\x1d\xef49\xd9\xa6\xe6\n\xb7\x89\xe1\x12\xc4`\xe2y\xd4l\x00\xb45\x978m\xf7\x8d\xd0\xb0%3!OT\xc6\xcf\x7f\xcb-n\xc1\x0e\xf1\xf3\x012\xca\x08A\xe8\xfe85%\'\x88\x91[:\xf9\x14\x92\x04\x0f\x0b\xa5\xc3xR\xba\x89qWc\xbb!\xcb\xa6\xc4Q1\xa73\xa7^\x86\xc8\xe3\x08+\x8d\xfb/\x03o\xf3\n\x89I\x92\x14\x87\xe2\xd5E\xfc\xe7\n `\xad\x8a\xd9\xebDK\xc0u\xa7n\xb1\xeen\x1c\xb0,\xf1\x7f\x04\xb9\xd0\x9d\xcf<\xa5\xc3\xe3\xbc\xf3\x90E\x0c^\x18R?|\xd4Z\xc9C A\x8e\xcbE\xdd\xf0\xa5\xcb\xec$\x06g\x84N\x0e\xd4\xbe\xd4\xdc\xb7&"4\x84/\xa0r\xec\x9dk\x1bU\\\xfen\x97\x07G\xc8\x16\xf5\x1c\x9649\x12\xe4k\x93\xd5\xeb\x03\x11\x15%\x86\x93\xad\xc4\nF\xa7\xc2\xc0L\x9a\xf5\x8b\xc3\x90\xfc\xf7e\xa3\x88\xff\xb2\xae\x0f\xbb\xac\xfb1\xab\xb4\x810-\xb9\x94\xd4\x9c\xc0\xa2B\xc5\x1d\x19\xa4\xa4,\xe9rE`Ue\xaa\x1aS\x102l\xcf\x90\x7f\x89\xae\x95\x80\xf4i@\xa9\xaa\xdc\xb1#\xac\x0c\xa7j\xe2\x10\xce\xaa\xb4\x9a\xdc\xed+\x9d<;\xc3\x89\\\xad\xba\x86\xa6\x00\x05\xa8\xe9\xe3g\xb4\x9e\x85\xcbll\x08Yc\xb2\x00HX\xd4\t+\xf0\x85\x90\x94{\xfa\x7f\x0e\x8c\x96tV\xfd\x8c\xa8\x89\xd2d2pT\x9a\xfe\xa5VA\xf6v\xa7C\xf5\x16\x8a\x04\xa3\xc5\x0eM7\x87\xf9\x03\x81\xf5:d\xdb\x02\xb5\xa7\xce\x813\x89\xdf\x9eb\xf0\xaa\xf5\xa3\xe6\xe4X`\xbd0\xe8\x98\x06\xb4\x17R\x82\x08Pe\xb8\xa3!\x05ae\x04a\xd4\xc3\x01\x8b.\xeb-\xb6\xd2\x7fj\xff\x8f\xe9\x8d?_\x80\xf6\xb5@\xef\x07\x0b\x92\x7f\x13_\xf6=\xea\x1bP\xf3\xfcv\x01\xfc%e\xd3\x04\xc1\xd9\x94K\xf57\xb3;9\x05\xc7\xd9{\x15A\xdf\xa8\xf4\xc7B\xea\x8eE\xde=\\\xfev\x96Z[iJg#\xfb\xcf:\x14,\x8b\xb1\x03[$\x14\xf7m\x183\xdb\xc6J\xe8\xe7\xf4\xb6DU}\xcaO-7\xb6P\xff\xd7\xfb\x87\xfdR\'3T\xa7\x87\xad\xe9I3\x19\xb8\xfd\xe8\xee9lh\xcf\x8bl\x83\xf9k:\xf0G\xe8\xfa\xa1\x89\xe2\xf9\x8f\xa8\xb43\xba\x01g\xc2\x9a\xb0+Y\x18M\x9e@\xd5\x1c\x9c\xd1Ch\x9dT\x80\\\xbb\x85$\xd1\xccJ\xd1\x8e\x8f\x84\x0b[\xb9\x86\xd4L!\xe4\x17\x84fMA;dP\xf6J\xef\x98K\x98\x12*{\xb8\xbbu\xab\xdb\x93\xe9\xd7ItF\xbf\x07n.\xbeS:~IP\xfa4\xa4\x1d\x91\xdeo"l\xb6\xc9w\xae0\xa7\xa1gZ\x92.\x16\xa6\x18+\x1f\xb9\xaf\xf0~k\x8fSv\xf9\x0bT\x10\x9b\xe4$f\xae\x04@%\x81\xfd\xe0n\xafM\x8cS\xc9\x14{\xdb\x943I\xcbi>\xea\x80n\x91\xe0\x95\x00\x18L\x07\x84iV\x1e\xae\xb3e\xb7\x17\x9ds\xc8\x1dZ\x1b_\x9a\x1b\xe0;\xe2Q}\xaf\xcb\x8d\xb0|t\x01\x96\x0bz\xe4\xe6]N\xb5>\xb1\xf4\x83\xe2\x84\x8b\xbb^g\xbdi\xb5\x06\x96\xfaI\xb8\x1f\xc5e\x9b\xe34\xcb>9\x9aI%G\xe8\xfd\x8c\x11\x9e\xa8\x06\xc4L\xc3\x18Pr\xabC\xf1\xef\xd5*}\xd8I\xf3\xe7\xf1PxY\x8fB\xac@}\x9c\xaa&\xb1\x9fV\xed\xff/U\xe6-2\xb6\xa31\xf2\x96\xf7\x87b\xe4\xf4\xb4Y\xe00:>I\x17=u\xf5g=T\x159T\xcbh\xab\x87\xf8\xed=\xb7\x0e\xde&\xea!\xe8\xbb\xec4\xad~K\xba-\xb1>3C\xa7.\xee\xfd\x91\\\x06\x1e\xad\xadx\xe9\xe3\x9f-%`\x83\xd4\xff\x01X\xc8:\xd1\x15\xda\xa0!\xc8\x8c!\x00/k^\xee\xa3\xd8<\x99\x7f\xb1\n\'\x87\xda\xb4e\x07\xc9m9\x89^\xbc\x03\xe9s_\x7fx\\\x9ezD\x9dj\t\x0c\x86jF\xcaO\xf6q\xcc\x944\x14`^\xedb\x9d-\x94\xad\xc1\xdf\x00M\xf1\x95\x97\x11|v~\xa7-W\x97\xf4v\xffy\xff_\xf3\x98\xa5\xda;\xbe\xae\xd0t\x92bW\x82\xedM\xe9KV*\xae\xdcB\x1aoe\xac\xa9\xee\x00\xb5\x1fV\x987X~(2\r^\xa3\xca\xa61d\xea\xf7\xba\xfc\n\x8f\xd4\x07;b\xb2<\xbc\xd0\x1c}\x93\xc6\x9f$\xcd\xcf#\x8a\xfc\xcb\xef\xde\xdbm\xaf?S\xd8?\x95\x108\x80\\\xcdx\xebx\xd2\x857%h\x98\xf1\xd8\x10\x04<)\xa4\xdf\xc5\x95\xea+\x9c\x9c\x07\xc4\xa5 \xe5\xcd`U\xfe\x110:9\x8a\xd6ph\xdb\x07\xaf\xdbk*\x87\xb9\xbe}\xda\xf3\x12\x1d\xea]\xe7\xc1\x7f\xe7\x89!\xd8\x80q\xc5\x88\xc8\x06n\x83\x84\xfc\xbej\xdb\x85G[\x15\xf1\xcc\x8e\xd7\x1bmy\xeb\xb7c9\x85\x99\x98\x9b\x11QP\x9c\xa9\\\xa7\xb2\x08\xcd_\xa9\xca\x8b\x11Z\x8es\xbf\x82\xac\xd3e\xa0C\xec\x05\x10G\x97THm\x85C^\xd2\xab{o\xdd\xeb\x92\x90O\xbd\xf6,\xb27\xe0Q\xe2m\xc8\xbb\x89T.\xe9\x82lBv64\xd8\x80dm\x8e\x8fH-\xc5\x05\x82(\xab\x9d\xf3o\xc4\x03\xec\x12N\t\x8e\xab\xba\xa8\xf6j\x10\xc9\x94\xd4\x84\xfb\xb3\x8a\xf0\xbd\x99\xd9\xe5\r?\xe9\x1av\rO\x91\xd4\xa4\xf6I\x9d\xf8\x89\x89\xdc\x05\x86i\xd6J\xe8\x0e\x8c\rB\r\xbdUa\xec6\xd7K9-D\xc1\xe3f\x82\xd2U\xc9\x18\xed]\x0bz\xf4\xad\xecV\x12Q\xde\xa5\xbf\xf9\xc7G\xf5^\x8b\xc1n\x07)h\xccd\xe6\x0b\x14\x8a\xff2\x86\xddc,`\xf5q\xe6ofk/\xf7\xf8\x93\xd1\x0f\xa0\xb0\x90\xc5T\x98\xaa\xe6\xee\xa8\xef\x91\xd9\xef\x80 M$=\x04j\xec\xd8\x8e:\xb6\xa8D\x0eDE\xee\x16|&_\xf7\xc9\x13\x1e\xcah\xaa\xbfIRj?\xfa&\xb7\xfc\xb1\xf9\xcaL\xc9V\xd3<\xae\x97\x03\xd1\x14S$\xc1\x0f\xf2\x8a_\xe1V\xe0\xd2\xbe8\xebMGm\xc9\t\xbd\xd4\xec\xc4.\xf2\xef+\x80\xf8\x0c\xe6,vh6V\x18B@fb\x8f3\xf7\xdd\t\x1a\xd2(\x96\xe7f\t\xe7n,\xa6E%S"\x10\xa9Q\xc2\x034rG\x10\xb7\xd1\x15\xd2V\xbdS\xf5=\xded\xa2\x89C\x15\xc2J\x9b\x12\x1fk\xd5\t\xbag=\x9a\x16\x81\x93\xc7\x82\xda\x9b\xb0\xc0\x8f\xc2\x94\xdb\xe8)\x0c\x16\x04!g\xe8>4YNU\x9e!y%D\xca\xa6e)\xa0\xe7vH\x17:X\x01\x1f:]\xcdJ\x9d\x99\x98\x7fb\xa5\xb6C\xea\xc1\x0e\xabd\x83\xe66`w\x19\x82\x1d\xddNd\xe4Q\\\xabD:\n\n\x89\xa61L\x852\x904\xd4\xa1\xc1\x8dcg)\xdb\xdc\xd8G\x8c\xe7\x1c\xbd\xa3}\x9aF\xcf\xf4\x8a\x13\x91A\xda8\xca\xe4O\xd1\xf1\x81\xf4}\\R5N\x84\xf2\xf9\xae R\n@\xb1\xdb\x93\xbdm\xdbeJ\x1e\t\xef\xb5\x18\x12\xa8\x085\xb2M\xdcbU\xb9\xe8\x9f\xef\xee)\xba\xc8\x07\xbe\xdc@r\xec;\x8a/\xc2m -/\xc7\xa4\x0c3\xfd\xed\xe2q\x7f\xb4\xfe\x8f\xc4\xc3\xf9\xc4kD\xb3N\x1d\xbbc\xfe\xf7=\x83\xa4\x14\xe7\x06u\xc1\xf2\xa5p\xb3\x05ht\xd4\x0e[\xb0\xca\x90\xac\xe4\x1d\xc7\x89\x15Y\x02\xd4\xa5\x94 \xaa*\xc5\xcf-\xa9\x9a\x8a~&5\x8f\x9aD\x1e\xd9e\x05 0\xd4\x05\x16\xd3\x19\xf2W\n"\x1b\x07\xab\x87\xa6\x9e\xa2\xe7v\xfb`\x8d\xd9\x05\xa3\x99\xa6vA\x9cKgA\x8fq\xd2\tKK\xdd\xb11H\xe6e\xf3\x7f\xd0D\n\xca\xbb\xa6\x9f\x81\x81\xbf}\xa0\xad#w\x8c\x0f\xa2\xcc\xc7\x8c[\xdes\xe1\xf0\xee_\xf40\x99\xc2\xdf\xd8\x80J`Q\\\xca\xb58kI!A\xc6\xae\x86\x11\xaa\xc0x\xde\xad\xae\xff\x1e\xf8\x1dY\xbd\xd8Y\x1eL~\x85\xe7\xf7s\x07\x99\x9d\xcf\x0cT\xaf >\xee\xa5\xb0\xc7\x15\xe8\xbd\xea)nt\x99\x92\x80\x80q\xcd\xec$Q\x0c`\x80\xd5\xf2jT\xe2M\x16\x99[\x9a\xe3\x84\xccE\xfexr\x1eVp>d&\xd5\xa7\x0edw\xb4\x84\xc1F\xc7q.{\xb8E\xf6\x18a\xfbe\xa1\x02^%\xb1\xe2\x96\xc7Dl\xeb\xdd\xf82\xa4o\x95]o%\xfbUl\xf8\x99o\xcb\xf6\x8a|\\\xe1\x12gyeE\xea,\x8a\x02\x19\r\xc5,\xcb\xabu\x1c\xcfei8\xc8\xbf/;q8r\x9e\xcf\x00;\x96Gx\x03\x92a;\xc2?\xce\x8e#K\x87Z\x89#\xacL\xd3HA\xc9)\xe1\xe3^\x9b\xf4\xda\x1a\xa6\xben\x96S\xca\x9e\t\xf7\xa7\xf3\xdd\xd5\xa3t>\xff\xa1\xde*i\x85g\xd4\xd1A\xacS{\xf8\xa6\x1a\x91\xffE\xf5\xa1\x0e\xc1i\xa3\x99\xe7\x0cX\x11\x17F\xc3oB\x1f\xe0\xdf\x85\x0b}>\xcc\x81sb\x94pm\xef\x1e\xe49\xf7\x1a\xc4Cn5\x81\xdb\x1au\xe19\xb0^\x86\xa2\x81@\xf5\x04\x93\xf4c\xa3\x15+\xe6\x1aMx\xb3\x7f\xcf\x90\xe0\xdf\xd0h\x9a\x04#\xe3\xfb/Y\xf2&\xe4\x065s\x8c*:(\xe3\x89\xa3\xa6X\x1c5\xe7\xe8\x1f\xb3\x0c\x12;\x0cD\xaar\x88\xa1\xbb\x19t\xacS^\x05V\x9a0\xdfL\x98mu\xa7\x0b\x9cg#(+\x8b\xc4s\xfa\x92\x9c/\xec\xfa\xd0xG\xfe\xa7\xd6D\x1d%\nO \xfce\xab^\xfe\xdd\r\x05\x93\x00\xa5\xacQ\x11b\xad\xd7\xf2%\x9a=\xce\xf1\xc5TG\x0b\x07POL\xcc\x83\x99(0\xe1 /j\xcaEWI\x93\xe2\xc1\xb8\x168T\xdaD\xd4\x8b\x13\x07,\xfc\xbb+|\x10?oT\x8bl\xf47\x83:\xcc\x82j\xc7 (\x98\xdas\xf6\xf6\xeeJc\x19\xa5\xc3\xee\xda@\xca\xa0\xc85\xcaW\xd3Q\xee\x1e\x84l\xca\'\xa4\xe9\x1a\x842\xcb\x8c\xb2s\x99\x8eH4sZq\xd8L.H\x11\xcft\x83\xec-\xfa\xcc_M\xa7\xe4Jd\xb9\x87\x97\x10\x87\x9d\xfd\xbc\x8e\x8e\x81\xd0S\xaa\xf8\xff9\xd0,vV\xfb\xb4\xfb\x89\xeda\xc5s\x1e|\xc7\x94\xa30W\x9az\x06m\xf5\x14=9_\x9d\xeeL \x065\xe0<\xfe\xde\'\xd1J\x1cb\xfc_K\xc6\x9dg\x00\x00\x99\xf9Cs\xc3L\xbc\x9e\xd0\xc0\xb3\xb4\x9a\xea\x1a\x15%-+\x85_FC\x03\xd7\xa5\xb0\xdc\xe6\x0e\x0f\xf6\xf7\xa8\xe65Hh\xb9\xdc=\xee\xe9\x01Z_\xad\xc8\x9d##\xd9e\xbc\x19\xdd5\xbf\xceusm.\xb4U1]\x86+\x18\xda\xcf+\xb7\x04\x1ft\x9f;\x89\x02\xd9\x94a\x01,x-\x8a\xb6\xaf\x97\xf3C\x03\x02p\xf6\x84\xd2\x87ob/\xd4,s\x04p\x1c\x1a\xf3USf=N\xcf\xbf\xef.\x9c\xce\xaf\xf2\xce\x87\x94W\xb9\xa0\xc2\xb6\xb0\xbd\x03\xcbp_\xeb\xd4\xaf\t\x1a\x9f\xce\x94^ 2\xd3i\x8c6\xbb\xef\xf0\xcc\xaed\xd8\xf1ohv\xa3k\xb0\xd2\x17\xe8n~6\xfdY\xab\xee\t\x94\x91\rE\x94\x7fW\x12}\xac\xb6\xe1\x05\xc0\x0e\x1c\xef6\xd2\xb7NX\'\x9a\xa0\xbd\x86\xd2\xb8\xa6\xc3\x8c\x80Wq(\xb6M\x19\x89 \xde\x1d\x0b\x93\xa0BB\xc1\xc6Z\x91\x12\xf4&\xf9o\xe6\x16u\xe8\xa2\xf6\x03 >\x1f\x05\xff\xa1\x1a\xd4Vs\xd6\xad.G\xd2\x92\xc2QB\xb73*\x98zz\xea\xecp\xc2\xbb_\xe8\x9c\x17r\xfb\x15\xe8\xbb\xa9\xb3/\xa7\xb8\x0c\xc5\xa4f\xa1\xc0\xc5g\xe4\xe9\xf0\xb0\xd8\xff\xff+1O\xe1\xf7\t\xa6uf\x80\x84\xbeE"\x1b-\x0b\xc2\xaa\x04Q\xf6H\xee\x96\xb6\x1c\xe5k\xbf\r\xb7\xd9P\xe5\xd6\x9b\x8e:Ov\x8eDt\\K\xa5\xb8\xce\xcf>\xe6B\xe3\x85V\xd2\xcbxj\x01y\x14\x0f9=\x97C5\x07\xe2\n`\xd1$\x1c\x82i\xff\x91\xc3\t5\xfb\xae\xe2~v\x029`\x1aH\xcf\xe28\xea\xd7\xe16Do\x9e\x89\x04K\xc6\r\xd2\x9b\xac\xdf\xef99z\xb2\xe1\x9fk\x12e\xf0\xe9\x00\xd3\xb3\xcd0\r\x08\xa6&\xc0\x19m\xa1y\x9e\xde\xcbJ\x15\xf3\xdeY\x8cX\xb04\xf3W$\xa1\x00\x14>\x8c\x94\x1e{\x11\x11!\x9c9w\xfe\x0f!b\xb1\xaf\xf7\xde\x10\x14\xc0\xd9\xdb,0\x12\xe4$\xe6\x8f_G\x9c\xb8\\"\xa4v\xae9\xc6-\x9c\xc1\xe6\x12\xff\x95\x01\xb8[\xd6uL\xab\xdc\xfc\xaeF#\xd8\x9f\x08\xd0\x80\x80_\x83q\xb3\xb9\xb0\xae\xfd\xae\xab2^\xb4\x1a\xa1\xbc\x95<!}\xbc=\xe6\xee\xe3S\xba\x1e\xbd\x0b\x00]\x8b|\xa5\x94^i\xc5"\xd8\x7f\xb4\x8a\xf2z\xe0\xceA\xb0\xbd\xc3\x9107Xz\xa9X\x84\xa1\xaa\xcfPt\xc6}\xaf8\xf5\xb4\xbb\xa3\x94w\x14\xc9\xc4\xd3\xeao\x0f\x83\x1d\x05d\xb2\xadm\xaa\xaf\xc8[\xa6#I\x9c\x8dE\xcaed&\n\xd3&v\xfc\x84\xc0\x92\xc5\x9c\x04\xb5\xf7\xa7A\x1d\xae\x9e .\xbd\x94\x01\x1b\xba\xe6\x9a\xea\xa0a\xc8X\x00\xc2\x95~4\xdf@v\x15\xbe\xb4Zh\xdd&\xdd\xfc\r\x7f\x02\xe4H\xc5u\'\x83\xf1C\xd2\xe1uT\xf0\xb6lv\x9d\xb5\xf3\x9b$\x97\x02\x07\xa8\r\'\x0b\x17yO\xae\xb8\xb9\x1f\xb5\x08\x18=e\xd7(\xf2E\x91\xc8s\x01\x1f\x1a\xebu\xbc\x8f\x1a\xb6\xe8\xe9\xf7\'+/\xdf\x99\xea\xa2\x11\xce5\x0c\xd7\x99u\xd5g\xfb.\x14\xad\xcf\xa3B-\xf2\x9an\xe4%\xebf\xa3,a\x8c\x8d\x9aT\xf1\x1aaHw\x95Z\x99\xa7\xba\xcfG\xed\x18\x8a\x03\xeb\x00\xe5;Y\x17\xaf\xa7\xb3\x13aAY\xfc\xf1e*\xe5|XA\x0e\xa7n\x07L\x02\xaaq!\x0ef\x84\xa4\xf8\xfaG\x9c.\x92\x0fTJ\x9c\xd8\x87a\x03\xb6\xa4N\xc34\xf7\xf3\xe6[\xc1\x0b=_\xdaEB\xb7\xf0\x98\x17`\xd5\xfe|8\xe0c\x91{\xb5\x80\xeeD\xd3\x18\xdd\n,n\xc1\x1d\x1cce\xcb\xcd\x10\x9d\xc6\xa6\x95,/#K\xac\xa0s\xed#\x02)^\xe7\xe5e\x8b\xd9\xeb\xb8m\xc5\x12\xc4\r\x12\xe1\x88AW\xde\xf4\xf3\xc9\x8dq\x99\x1dY\xa8Y\xd5\xa8\x14\x93\xe56\xf4\x02\x83\xbc\xfc5\x1e\x9e/)X\xe3\xd7\xe5\x87\x0e\x14\xcb:\xd5\xc1\ru\xa0z\xf9\'\x87\xda\x8d\xd1\x1c\x0b\x03\x95p\x1c\xa5\xaa6\xa8\xeb/\xea\x91\xc6\x98GK!\xbeK\xd0D\xaf\xcc\x07&\x07q9\x93x\xfd\xb3\xb8\xf9\xcd\x14\x8e\x11\x97XQK\xe1\xa3\xf4z.g\xcc\xa5f&\xd0\xde\xd4>z\x0eamS\x97;\xb64w\xe0~gv\xac\xdfH\x1a\x99Q\xf7\x83p\xbf \t\x8a\x11\x86\x957\x89\xad*\x08U\xcaao\x8cm\x0f\x8d\xf6.h\xfb5\x97\xfd\x9d\xb5>d\xbcf_\xa6Z6\xec\x99\x1aN\xa1<=\xdby>\x06\x11wB\xe7)\n\x87@\xb6\x8b\x91S\x83\xb9\xcd@O\xd4\xd7\x11&\xffHV\x87W\xe1"~\xf2l\xd8UsK\xf5D\xd4x.\xfb\xcb\x9e\xdap\xc2V\xfe3\xacP\x7f8\xdb\xc4\xa0y\xc2\xcc4\x86\xb3=]\x91\xcfC\xdf[\xe1\x8e\xd09/4wc\xeb\xd7\xc1*\xaf\xfb\xa2\xd0\xd2]0\xadg\xc4\xed\xbc\xcd\x1b\x1e)\x8d\xb8_(\x94\xf6\xdbxx\xeeTX\xe0\xed\xa8D\x7fK\x1a\xee\x1f\xb8\xc3\xaf\xb1\x9c\x86\x88v\x85\x19\x86\\\xb1qQ\x04F"!m\xf8\xf3\x8d\x13\xd5\xd8\xbc\xe9\xf1\x05\xfe*\xb1X\xc5\xf1\xa5\x0e\xbcL*"\x9b5\xbc\x92\xcdE\xffI\xdc\xa1\xcbU\xac\x13c\x1e`[\xc3\x05\x92hR\xf3\x17\x07)\xb5hR\xbb\xea\xfa|`\x94\xf4D\x9e/i\xcf!b+\xa1\xf6KX1\xba\xf5\xa5I\x93^\xb3w\xe2\xae\xf0^\xf6\xe4\xc0\xce\x01\x15Ra\x7f@\xd0v-i\xb7AO$\x12\xe1\xebp\xb10\xca\xdd\x0c\xf8\xcc2\xd8\xd10V\x01\xe2J\xa7\x8d\x9d\xf2w\xc8q\xbc\xddkP\xc2_S\xd9\x19\x9d\x99\x1f\x01%\xcf\xb7X\x91\x1a\xb3\xf8\x87\xee@>\xfck\xcb\xb2\xa7D\x7f\x96\x1a=oOG}\x9eP3\xb6u0;h\xb0!\x86)\x1f\xbf\x03\x0c\x9f\xc1\x8f\x8e,\xfe\x95\x06\xdd\xf5\x8b\xd4_\xac\x90\xfa\x8cD\x8e\xea_c\xdbk\x85\xb0J\xeb\xe8 y\x1c\xf9\xc4\x82\xd0\xa5E\x0c\xbb}5N\xe6|\xb5%\xaa[`)\x9b\xe5\x1c\xd7m3\x00\xf4\xda]E\x1a\xeb`\x15\xe3ibA\x85\xbb\x9c\x8a=\xbc\x9f\xfaq\x03\xf6\x87\x94\xe4\xe3\xf5\xc1H\xe4\xa4\x14\x9ffJm\xe9g\xbb\xab\xfcc\x0e2\xd9\x9c\x8f~\x8b\xc1%\x82\x95\xec\xea\x07eZ\x8ez\x01\xe6\xd0\xe7\xc4\xcf\xf0PS\xa2z\xc0c\xf1\xce\xf4\xdb]\x02\xe4\x81G\xc8\xfb\x06g\xde\xad\x9a*?\x8a\x8c\x0e\x92t\xf80\xf0\x1e\xbd|\xeb\x93\xac\t\x11\x90B\xdc\xf5\x88\xfe\x95G*\x1a&\xc4\x06V\xb9\xf3"\x1b\x04\x08\xf5PUS\xf7M`I\xf0\x03\xef\xe7\x13\xe5\xb9\xae\x17\x12h)\xd5T\xf0^\xcd\xd1\x1a\xc5\x0e\xb9\xf2yF\xd1\x9b\xfd{\x95K\xe3;P\x05\x10Cf\x15r\xae\x91"1`0\x08~\xb2[\xf9\x06S\xe6%\x86\x1eZH?\x91\x01\xf5dAl\x9f\x1f\x8bsT\xec\xc60}\x0c\x86\xf3\x10\x80~\xc2\xc0\xc5\x06\xb4\x1f8\x04\xceK\xbb\xaa(\xa4\xc4\x00*&2\x03M\xc3\xd2<S\xa53d\x195\xa2\x9d\'\xbe\xfd@\xe2\xfc\xe8\x11IlZ\xaa\xfax\xd3\x14\x13:i\xd2\xf5\xbe\x1cb\x12\xa4\x00\xd7\x17-.V\xa1\xb8*\x85\x98\x08F\x81\x96\x88S\x91\xeb\xd1\xd5\xfad\x7f\xa9\xeb\xd2\xa6c\xb7\xf2}\x96\xbd\x1dpe\xce\xe4\xc4\x15\xec\xbc\xe1\xa44\x1a17`\xbf\xa4wyC"\x90M\xe7\xa1\x80\x15\xbfI\x07l\xf5\x06F\x18\xc1J\x9e^\xf9O\x8a\xfd\x9d\xe6[wV\x95zj\x13\xf0\xf3lYH\x11\xcf\xeaL\xce\x82b\xaa\xd4\x1c}\xb8o\x882\xf7\xd4\x17\x92\xe5^~,\xedN,\xa1\x94\x14\xca\xd0\xdc\x10R\x91j\xaa\xcey2\xfaR\xecn\xe0f\x98\xbco.\x1f\x1fH\x8e\xa2c\x9b&\xc0[J\x0b\xa1\xf4Z`\x12\x8d\xeb \x1a\xc4\xf7"?\xe5~\xd7t+\xfca\xd5\xbc\x0b\r[Ws\x0c\xefT\x8a\x9c\x9c\xb4\x95\xc1q\xe3\xd5E\x110\x97\xae\xb8I#(\xbe6B\xeb\x16U\x85\xa2t\xdc\x07\x11\xf9\x98\xf7\x96@++\x8cs\xac\xe0\xa4\xe7\xa5\xca\',H\x01\xe4yxj@\x98\x87\r\xbd\xb0\xe4\x84\x9a\xe7\x02\xb7\xc9\x01\xc7\x1a\xab\xc9#v\xd0v\x8b\xd6\xc7\xf8\x89\xf66p\xf5\x9aS\xc0J\xc8\x18N\xb8v\xc7\xa5\x0cr\xc3!%\xfc_Z9E\xf4\x96\x82\x9a\xbdx\xb9\xf3\xc5\xf3\x1a\r\'uc\x06lP\xb3\xb98\xef\x88\x8a\xaaJ{=\x8f\xef\x82\xae\xdcrG\xe5\x11\xc3\x9c\xb2\xac\xc4\x070\x98\r\xf1\x13C\xabglOls\xee\xca\xeaW\xbb\x81)a;\xe6\x00r\x15FAp+xd\xe6\x0bE\xb7\xbc=~\x84\xf4\x97`\xad\x14\xa5\xd43?x\x88\xe1\x15cRP\x070%\x05[c\xeboJ\x06\x91\xd4\xed\xe8^&t\x9c\xbc\xa6\xcb\x8b\xcbIZ\xf6}\xfeR\xb1\xb9\xb8`Ps3\t\xeb\xe8\xd3\xf1\x8eN\xa2P\x89D\xbb\xc34\xed:\xac\x15\x82\x9b\xca\x95b\x130\x0bE7\x03)\x98\xd9\x1aHA\xdc\x0eqB\xf5\x817!\xa329\x8df\x04\x10d@f\x08kg\xd0\xa6\xce\xfa\x18\xa4xa8\x1a\xd1C3\xf7\x13\xdb\xc4M\xda\xbdF\x80\xcev\xe3f\xdd\xc7\xee\x84\xdb{\xe9*\xf5\x17@[\xf5esc\xe0"\x965\xfbg\x19\x8dY#\xb4\x17j\xddY\xd2\xd7FB5\xc7\xac\xcf\xbe\x89\x04]\xbe\xf7Mim*B\xed!\xfb\x0f\x06\x84N\x1bp68\xc2Q\xe9a=\xac\xb5\xf9\x0f4\xda=EM\x1d\x85^\xdf\xfe\x1d\xa0)?I\xeb\xabFkkQQI\xf7\xb7S\xb4`\x11\xef\x16\x07\xf1\xaf1\x0e\x02\xb9\xb9p\xb4\xbd&\xda\xc3OR\x1co\xaf-\xeb8\xfcFwV-\xe7xo\x93\xe6\xe9X\xa4\xdd\xdd\x02\xadIU\x91R\x06\x95%\x96\xc7\x8dn\x10\xf9\x06m \xa4\xf0\xaf\x8d\xcc\xac{\xcf\x9f\x9es(\x08X\xf9\x9f\xf8\xe4\xbd\xa4\xdd\xf0f\xaf\xd1\xe2\x85L\xa8(\xf2\xeb8\xe3\xc6\x80NiW\x14\x15}o\x1f\xe8\xd04M\x9f\x8d\xf4\xa1X\xaa\xa9\x0b\xcc\xf3Qv\x01\xd3o\x88iQ\xa5\xec5\xb9B\x0b\\S^\x9f]P\x10@W\x80\x0c\x8d\xdc\xb6B\xe9\xf2<\xbbk\xb6dJ> \xda\xe0[\xb8\xfe\x1aKC\x96\x83?\xbe\xfbH\nk\x80\xff\xa2\xa6\xbf\xb74\x1dP\tZ"\xa8z\x163\x11\x94H\xe9PtOt\xc8\xb778\xbd\'Mf\xd8\x8a|`\x18\xc4Bb\xec\xc3\x1c\x8f\xb5&UE\xc5\x1b\x1a\x9e\xd2hm\xb5\x8e"\xa1\xc8\x9f\xda\xcc\x8d\x9a\x1fM*\x85\x9b\\.qm\x00\xf2\x0cS\x0f\xe2\n\x05\x16\xcb\xd2\xe3}\xaf\x94\xb7\xfe\x03\xda\xb7\x1b*r\xf0\xf0\xff\xd3\xcc!\x12on\x94\xf0Q@\x04\xcd\x10\xe4\xb7\x03\xf9\xae\xb5y\xfa\xff\xd1\x01\x08w\x04\x022U\xe1\x88r\x14\x81\x0b\x80\x82\xadZ\xf7o\xf7aM\xa3\xd3\xb3<\x05L\xc3\xbfl\xd6~o\xad\xa6\\\xf2\xd0\x9de|\x93P\xe3\xf2\x05\xbd\x92bg!\x18\x19\xe5{\xc1\xce\x91}+\xbc-\x06\x0b\x7f\x85\x9c\xfc\xfb]r{\x1b\t\xf61\\\xbe\x18\xf1\x0c\xfb\xda\xe1\x8aH\xbb\xd6;G\x01\x9d:%\xb6^\xcen\xd0\xd8\xfc\xacY#X\xa1\xb0+\xd2\xf4\x85x\x14ua\\)&\xea8x|\xed>\xcf\x93$\xcb\xf6I\xb1\x8aVN\x1f\x83\xbfP\xb5\xcf\xab$\x08\xe38\x16\x13\xc2\x15h\xa0\xb2^d\xcefY\xfe\x98@,\x91\xff\xc1\x8e\xfb\x9a$\x07\x1b\xd9\xd4\xaa:\x8f\xe5}e\x02\xb9S\x18\x1cjy\xf7\xa9\xdb\xf9\xbc\xc4PO1\xa3\xbfI.\x84E\x16\xf4\x01+\x93\xa0q%\x13\xb9\xc1\x8a\xc4\xc8&q\x8eA\xcc\xdd\x8e~\xbe\xf7\xe5\xbb\x1b\xd5\x17Y\xca\xf3\xc0\x96|Jvjx\x0b\xad\xfc\xae\xfe\x8f\xb7p\xb4\nA\x0ez\xf8\x1fM\x95\xb9>\\Q\xa8\xa6\xbf&\xaa){\x07C\xb1)1\xfaL8\xc5\xda\xf8yv\xf8\x83^\x9cc\x8c?\x9f|,\xdc\x91zm\xbe\xb8\xf2\xb5\xc5e\xb3\xc1\xa8\xd0\xca\xc0l>\x05\xf5\x1a\xbe\xff;\xb3\xc5\xd2\xfcu\x8cq\xed\xaa\x9eGt\xb6\xcf\xe2}\':g\xf4\xf3Rqg\xaa\xcf36\xcb%H\xce\x8cdw\xf1s\x06\x95\xbcq%V\xd9{%\x11\x8d\x92Kr\xe5\xf7\xc0\x817\xd2\xaaj\xc2N\xec\x02\xcf\xe4]~\xc9\x15-\xcf\x9e\xfa5$AAi\t\xd6f7\xc7}\xba\xca\x05V\xffH|\x95JrS\x8b\xa4\xf0\xf9\xcb[\xbb\xfe\xf8\xee,>\xa3\x89\x86l\xc9\xdb\xba\x83\xb7G\x9b\x9ex\x885\xa0\xadS~n\n\xb2r\x11\xa5n\xbe4\xa3e\xdd\x04}\xfc\xe9h\x97C.];\xa8\xd4p\x17\xd8\xac+\t\x88m>S\xc8ks\x11ih#\x18\xf1\x87\xb8\x8c\xea$^\xd7B\'\x9ev\x9a\xc5\x8bs\x9d\xa5\x93E\x97\xe8_\x12nMD}\xb5nCa\xf0^\xcf((\xb9\xc1\xae')
|
4
|
-
|
1
|
+
from flask_admin.contrib import sqla
|
2
|
+
from hiddifypanel.panel.database import db
|
3
|
+
from wtforms.validators import Regexp
|
4
|
+
from hiddifypanel.models import *
|
5
|
+
from wtforms.validators import Regexp, ValidationError
|
6
|
+
from .adminlte import AdminLTEModelView
|
7
|
+
from flask_babelex import gettext as __
|
8
|
+
from flask_babelex import lazy_gettext as _
|
9
|
+
from hiddifypanel.panel import hiddify,hiddify_api,cf_api
|
10
|
+
from flask import Markup
|
11
|
+
from flask import Flask,g
|
12
|
+
from flask_sqlalchemy import SQLAlchemy
|
13
|
+
from flask_admin import Admin
|
14
|
+
from flask_admin.contrib.sqla import ModelView
|
15
|
+
from wtforms import SelectMultipleField
|
16
|
+
|
17
|
+
|
18
|
+
from wtforms.widgets import ListWidget, CheckboxInput
|
19
|
+
from sqlalchemy.orm import backref
|
20
|
+
# Define a custom field type for the related domains
|
21
|
+
from flask_admin.form.fields import Select2TagsField,Select2Field
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
class DomainAdmin(AdminLTEModelView):
|
26
|
+
column_hide_backrefs = False
|
27
|
+
|
28
|
+
list_template = 'model/domain_list.html'
|
29
|
+
# edit_modal = True
|
30
|
+
# form_overrides = {'work_with': Select2Field}
|
31
|
+
form_widget_args = {
|
32
|
+
'description': {
|
33
|
+
'rows': 100,
|
34
|
+
'style': 'font-family: monospace; direction:ltr'
|
35
|
+
}
|
36
|
+
}
|
37
|
+
column_descriptions = dict(
|
38
|
+
domain=_("domain.description"),
|
39
|
+
mode=_("Direct mode means you want to use your server directly (for usual use), CDN means that you use your server on behind of a CDN provider."),
|
40
|
+
cdn_ip=_("config.cdn_forced_host.description"),
|
41
|
+
show_domains=_('You can select the configs with which domains show be shown in the user area. If you select all, automatically, all the new domains will be added for each users.'),
|
42
|
+
alias=_('The name shown in the configs for this domain.')
|
43
|
+
)
|
44
|
+
|
45
|
+
# create_modal = True
|
46
|
+
can_export = False
|
47
|
+
form_widget_args={'show_domains':{'class':'form-control ltr'}}
|
48
|
+
form_args = {
|
49
|
+
|
50
|
+
'domain': {
|
51
|
+
'validators': [Regexp(r'^(\*\.)?([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$', message=__("Should be a valid domain"))]
|
52
|
+
},
|
53
|
+
"cdn_ip": {
|
54
|
+
'validators': [Regexp(r"(((((25[0-5]|(2[0-4]|1\d|[1-9]|)\d).){3}(25[0-5]|(2[0-4]|1\d|[1-9]|)\d))|^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,}))[ \t\n,;]*\w{3}[ \t\n,;]*)*", message=__("Invalid IP or domain"))]
|
55
|
+
}
|
56
|
+
}
|
57
|
+
column_list = ["domain", "mode","alias", "domain_ip", "cdn_ip"]
|
58
|
+
# column_editable_list=["domain"]
|
59
|
+
# column_filters=["domain","mode"]
|
60
|
+
# form_excluded_columns=['work_with']
|
61
|
+
column_searchable_list = ["domain", "mode"]
|
62
|
+
column_labels = {
|
63
|
+
"domain": _("domain.domain"),
|
64
|
+
"mode": _("domain.mode"),
|
65
|
+
"cdn_ip": _("config.cdn_forced_host.label"),
|
66
|
+
'domain_ip': _('domain.ip'),
|
67
|
+
'show_domains':_('Show Domains'),
|
68
|
+
'alias':_('Alias')
|
69
|
+
}
|
70
|
+
|
71
|
+
form_columns=['domain','alias','mode','cdn_ip','show_domains']
|
72
|
+
|
73
|
+
def _domain_admin_link(view, context, model, name):
|
74
|
+
if model.mode==DomainType.fake:
|
75
|
+
return Markup(f"<span class='badge'>{model.domain}</span>")
|
76
|
+
admin_link = f'https://{model.domain}{hiddify.get_admin_path()}'
|
77
|
+
return Markup(f'<div class="btn-group"><a href="{admin_link}" class="btn btn-xs btn-secondary">'+_("admin link")+f'</a><a href="{admin_link}" class="btn btn-xs btn-info ltr" target="_blank">{model.domain}</a></div>')
|
78
|
+
|
79
|
+
def _domain_ip(view, context, model, name):
|
80
|
+
dip = hiddify.get_domain_ip(model.domain)
|
81
|
+
myip = hiddify.get_ip(4)
|
82
|
+
if myip == dip and model.mode == DomainType.direct:
|
83
|
+
badge_type = ''
|
84
|
+
elif dip and model.mode != DomainType.direct and myip != dip:
|
85
|
+
badge_type = 'warning'
|
86
|
+
else:
|
87
|
+
badge_type = 'danger'
|
88
|
+
return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
|
89
|
+
column_formatters = {
|
90
|
+
'domain_ip': _domain_ip,
|
91
|
+
'domain': _domain_admin_link
|
92
|
+
}
|
93
|
+
|
94
|
+
def search_placeholder(self):
|
95
|
+
return f"{_('search')} {_('domain.domain')} {_('domain.mode')}"
|
96
|
+
|
97
|
+
# def on_form_prefill(self, form, id):
|
98
|
+
# Get the Domain object being edited
|
99
|
+
# domain = self.session.query(Domain).get(id)
|
100
|
+
|
101
|
+
# Pre-select the related domains in the checkbox list
|
102
|
+
# form.show_domains = [d.id for d in Domain.query.all()]
|
103
|
+
|
104
|
+
|
105
|
+
def on_model_change(self, form, model, is_created):
|
106
|
+
model.domain = model.domain.lower()
|
107
|
+
configs = get_hconfigs()
|
108
|
+
for c in configs:
|
109
|
+
if "domain" in c and ConfigEnum.decoy_domain != c:
|
110
|
+
if model.domain == configs[c]:
|
111
|
+
raise ValidationError(
|
112
|
+
_("You have used this domain in: ")+_(f"config.{c}.label"))
|
113
|
+
myip = hiddify.get_ip(4)
|
114
|
+
|
115
|
+
if "*" in model.domain and model.mode not in [DomainType.cdn,DomainType.auto_cdn_ip]:
|
116
|
+
raise ValidationError(
|
117
|
+
_("Domain can not be resolved! there is a problem in your domain"))
|
118
|
+
|
119
|
+
|
120
|
+
skip_check="*" in model.domain
|
121
|
+
if hconfig(ConfigEnum.cloudflare):
|
122
|
+
try:
|
123
|
+
if model.mode==DomainType.direct:
|
124
|
+
cf_api.add_or_update_domain(model.domain, myip,"A",proxied=False)
|
125
|
+
elif model.mode==DomainType.cdn or model.mode==DomainType.auto_cdn_ip:
|
126
|
+
cf_api.add_or_update_domain(model.domain, myip,"A",proxied=True)
|
127
|
+
skip_check=True
|
128
|
+
except Exception as e:
|
129
|
+
raise e
|
130
|
+
raise ValidationError(_("Can not connect to Cloudflare.")+f' {e}')
|
131
|
+
# elif model.mode==DomainType.auto_cdn_ip:
|
132
|
+
|
133
|
+
# raise ValidationError(_("You have to add your cloudflare api key to use this feature: "))
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
dip = hiddify.get_domain_ip(model.domain)
|
139
|
+
if not skip_check:
|
140
|
+
if dip == None :
|
141
|
+
raise ValidationError(
|
142
|
+
_("Domain can not be resolved! there is a problem in your domain"))
|
143
|
+
|
144
|
+
|
145
|
+
if model.mode == DomainType.direct and (myip != dip and dip != hiddify.get_ip(6)):
|
146
|
+
raise ValidationError(
|
147
|
+
_("Domain IP=%(domain_ip)s is not matched with your ip=%(server_ip)s which is required in direct mode", server_ip=myip, domain_ip=dip))
|
148
|
+
|
149
|
+
if dip == myip and model.mode in [DomainType.cdn, DomainType.relay, DomainType.fake,DomainType.auto_cdn_ip]:
|
150
|
+
raise ValidationError(
|
151
|
+
_("In CDN mode, Domain IP=%(domain_ip)s should be different to your ip=%(server_ip)s", server_ip=myip, domain_ip=dip))
|
152
|
+
|
153
|
+
# if model.mode in [DomainType.ss_faketls, DomainType.telegram_faketls]:
|
154
|
+
# if len(Domain.query.filter(Domain.mode==model.mode and Domain.id!=model.id).all())>0:
|
155
|
+
# ValidationError(f"another {model.mode} is exist")
|
156
|
+
model.domain = model.domain.lower()
|
157
|
+
if model.mode == DomainType.direct and model.cdn_ip:
|
158
|
+
raise ValidationError(
|
159
|
+
f"Specifying CDN IP is only valid for CDN mode")
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
if model.mode == DomainType.fake and not model.cdn_ip:
|
164
|
+
model.cdn_ip = myip
|
165
|
+
|
166
|
+
# if model.mode==DomainType.fake and model.cdn_ip!=myip:
|
167
|
+
# raise ValidationError(f"Specifying CDN IP is only valid for CDN mode")
|
168
|
+
|
169
|
+
# work_with_ids = form.work_with.data
|
170
|
+
# print(work_with_ids)
|
171
|
+
# # Update the many-to-many relationship
|
172
|
+
if len(model.show_domains)==Domain.query.count():
|
173
|
+
model.show_domains=[]
|
174
|
+
# if model.alias and not g.is_commercial:
|
175
|
+
# model.alias= "@hiddify "+model.alias
|
176
|
+
# model.work_with = self.session.query(Domain).filter(
|
177
|
+
# Domain.id.in_(work_with_ids)).all()
|
178
|
+
if is_created or not get_domain(model.domain) :
|
179
|
+
# return hiddify.reinstall_action(complete_install=False, domain_changed=True)
|
180
|
+
hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
|
181
|
+
|
182
|
+
# def after_model_change(self,form, model, is_created):
|
183
|
+
# if model.show_domains.count==0:
|
184
|
+
# db.session.bulk_save_objects(ShowDomain(model.id,model.id))
|
185
|
+
|
186
|
+
def on_model_delete(self, model):
|
187
|
+
if len(Domain.query.all()) <= 1:
|
188
|
+
raise ValidationError(f"at least one domain should exist")
|
189
|
+
hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
|
190
|
+
def after_model_delete(self, model):
|
191
|
+
if hconfig(ConfigEnum.parent_panel):
|
192
|
+
hiddify_api.sync_child_to_parent()
|
193
|
+
def after_model_change(self, form, model, is_created):
|
194
|
+
if hconfig(ConfigEnum.parent_panel):
|
195
|
+
hiddify_api.sync_child_to_parent()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
196
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|