diff --git a/package/lean/luci-app-xlnetacc/Makefile b/package/lean/luci-app-xlnetacc/Makefile index 95626f913..b26805b0a 100644 --- a/package/lean/luci-app-xlnetacc/Makefile +++ b/package/lean/luci-app-xlnetacc/Makefile @@ -1,14 +1,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-xlnetacc -PKG_VERSION:=1.0.0 -PKG_RELEASE:=3 +PKG_VERSION:=1.0.3 +PKG_RELEASE:=7 PKG_LICENSE:=GPLv2 PKG_MAINTAINER:=Sense -PKG_BUILD_PARALLEL:=1 - include $(INCLUDE_DIR)/package.mk define Package/$(PKG_NAME) @@ -17,7 +15,7 @@ define Package/$(PKG_NAME) SUBMENU:=3. Applications TITLE:=LuCI Support for XLNetAcc PKGARCH:=all - DEPENDS:=+wget +openssl-util + DEPENDS:=+jshn +wget +openssl-util endef define Package/$(PKG_NAME)/description @@ -56,12 +54,12 @@ define Package/$(PKG_NAME)/install $(INSTALL_DATA) ./files/luci/model/cbi/*.lua $(1)/usr/lib/lua/luci/model/cbi/ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/xlnetacc $(INSTALL_DATA) ./files/luci/view/xlnetacc/*.htm $(1)/usr/lib/lua/luci/view/xlnetacc/ - $(INSTALL_DIR) $(1)/www/luci-static/resources/xlnetacc - $(INSTALL_DATA) ./files/luci/luci-static/resources/xlnetacc/*.js $(1)/www/luci-static/resources/xlnetacc/ $(INSTALL_DIR) $(1)/etc/config $(INSTALL_CONF) ./files/root/etc/config/xlnetacc $(1)/etc/config/xlnetacc $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./files/root/etc/init.d/xlnetacc $(1)/etc/init.d/xlnetacc + $(INSTALL_DIR) $(1)/etc/hotplug.d/iface + $(INSTALL_BIN) ./files/root/etc/hotplug.d/iface/95-xlnetacc $(1)/etc/hotplug.d/iface/95-xlnetacc $(INSTALL_DIR) $(1)/etc/uci-defaults $(INSTALL_BIN) ./files/root/etc/uci-defaults/luci-xlnetacc $(1)/etc/uci-defaults/luci-xlnetacc $(INSTALL_DIR) $(1)/usr/bin diff --git a/package/lean/luci-app-xlnetacc/files/luci/i18n/xlnetacc.zh-cn.lmo b/package/lean/luci-app-xlnetacc/files/luci/i18n/xlnetacc.zh-cn.lmo index b0598e963..3c0764141 100644 Binary files a/package/lean/luci-app-xlnetacc/files/luci/i18n/xlnetacc.zh-cn.lmo and b/package/lean/luci-app-xlnetacc/files/luci/i18n/xlnetacc.zh-cn.lmo differ diff --git a/package/lean/luci-app-xlnetacc/files/luci/i18n/xlnetacc.zh-cn.po b/package/lean/luci-app-xlnetacc/files/luci/i18n/xlnetacc.zh-cn.po index a0bb64cea..80c6b9d23 100644 --- a/package/lean/luci-app-xlnetacc/files/luci/i18n/xlnetacc.zh-cn.po +++ b/package/lean/luci-app-xlnetacc/files/luci/i18n/xlnetacc.zh-cn.po @@ -5,7 +5,7 @@ msgid "XLNetAcc" msgstr "迅雷快鸟" msgid "XLNetAcc is a Thunder joint broadband operators launched a commitment to help users solve the low broadband, slow Internet access, poor Internet experience of professional-grade broadband upgrade software." -msgstr "迅雷快鸟是迅雷联合宽带运营商推出的一款致力于帮助用户解决宽带低、网速慢、上网体验差的专业级宽带提速软件。" +msgstr "迅雷快鸟是迅雷联合宽带运营商推出的一款致力于帮助用户解决宽带低、网速慢、上网体验差的专业级宽带加速软件。" msgid "Settings" msgstr "设置" diff --git a/package/lean/luci-app-xlnetacc/files/luci/luci-static/resources/xlnetacc/md5-min.js b/package/lean/luci-app-xlnetacc/files/luci/luci-static/resources/xlnetacc/md5-min.js deleted file mode 100644 index 4f08fe1f4..000000000 --- a/package/lean/luci-app-xlnetacc/files/luci/luci-static/resources/xlnetacc/md5-min.js +++ /dev/null @@ -1,9 +0,0 @@ -/* - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for more info. - */ -var hexcase=0;function hex_md5(a){return rstr2hex(rstr_md5(str2rstr_utf8(a)))}function hex_hmac_md5(a,b){return rstr2hex(rstr_hmac_md5(str2rstr_utf8(a),str2rstr_utf8(b)))}function md5_vm_test(){return hex_md5("abc").toLowerCase()=="900150983cd24fb0d6963f7d28e17f72"}function rstr_md5(a){return binl2rstr(binl_md5(rstr2binl(a),a.length*8))}function rstr_hmac_md5(c,f){var e=rstr2binl(c);if(e.length>16){e=binl_md5(e,c.length*8)}var a=Array(16),d=Array(16);for(var b=0;b<16;b++){a[b]=e[b]^909522486;d[b]=e[b]^1549556828}var g=binl_md5(a.concat(rstr2binl(f)),512+f.length*8);return binl2rstr(binl_md5(d.concat(g),512+128))}function rstr2hex(c){try{hexcase}catch(g){hexcase=0}var f=hexcase?"0123456789ABCDEF":"0123456789abcdef";var b="";var a;for(var d=0;d>>4)&15)+f.charAt(a&15)}return b}function str2rstr_utf8(c){var b="";var d=-1;var a,e;while(++d>>6)&31),128|(a&63))}else{if(a<=65535){b+=String.fromCharCode(224|((a>>>12)&15),128|((a>>>6)&63),128|(a&63))}else{if(a<=2097151){b+=String.fromCharCode(240|((a>>>18)&7),128|((a>>>12)&63),128|((a>>>6)&63),128|(a&63))}}}}}return b}function rstr2binl(b){var a=Array(b.length>>2);for(var c=0;c>5]|=(b.charCodeAt(c/8)&255)<<(c%32)}return a}function binl2rstr(b){var a="";for(var c=0;c>5]>>>(c%32))&255)}return a}function binl_md5(p,k){p[k>>5]|=128<<((k)%32);p[(((k+64)>>>9)<<4)+14]=k;var o=1732584193;var n=-271733879;var m=-1732584194;var l=271733878;for(var g=0;g>16)+(d>>16)+(c>>16);return(b<<16)|(c&65535)}function bit_rol(a,b){return(a<>>(32-b))}; \ No newline at end of file diff --git a/package/lean/luci-app-xlnetacc/files/luci/luci-static/resources/xlnetacc/rsa.js b/package/lean/luci-app-xlnetacc/files/luci/luci-static/resources/xlnetacc/rsa.js deleted file mode 100644 index 0e012c300..000000000 --- a/package/lean/luci-app-xlnetacc/files/luci/luci-static/resources/xlnetacc/rsa.js +++ /dev/null @@ -1 +0,0 @@ -var b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64padchar="=";function hex2b64(h){var i;var c;var ret="";for(i=0;i+3<=h.length;i+=3){c=parseInt(h.substring(i,i+3),16);ret+=b64map.charAt(c>>6)+b64map.charAt(c&63)}if(i+1==h.length){c=parseInt(h.substring(i,i+1),16);ret+=b64map.charAt(c<<2)}else{if(i+2==h.length){c=parseInt(h.substring(i,i+2),16);ret+=b64map.charAt(c>>2)+b64map.charAt((c&3)<<4)}}while((ret.length&3)>0){ret+=b64padchar}return ret}function b64tohex(s){var ret="";var i;var k=0;var slop;for(i=0;i>2);slop=v&3;k=1}else{if(k==1){ret+=int2char((slop<<2)|(v>>4));slop=v&15;k=2}else{if(k==2){ret+=int2char(slop);ret+=int2char(v>>2);slop=v&3;k=3}else{ret+=int2char((slop<<2)|(v>>4));ret+=int2char(v&15);k=0}}}}if(k==1){ret+=int2char(slop<<2)}return ret}function b64toBA(s){var h=b64tohex(s);var i;var a=new Array();for(i=0;2*i=0){var v=x*this[i++]+w[j]+c;c=Math.floor(v/67108864);w[j++]=v&67108863}return c}function am2(i,x,w,j,c,n){var xl=x&32767,xh=x>>15;while(--n>=0){var l=this[i]&32767;var h=this[i++]>>15;var m=xh*l+h*xl;l=xl*l+((m&32767)<<15)+w[j]+(c&1073741823);c=(l>>>30)+(m>>>15)+xh*h+(c>>>30);w[j++]=l&1073741823}return c}function am3(i,x,w,j,c,n){var xl=x&16383,xh=x>>14;while(--n>=0){var l=this[i]&16383;var h=this[i++]>>14;var m=xh*l+h*xl;l=xl*l+((m&16383)<<14)+w[j]+c;c=(l>>28)+(m>>14)+xh*h;w[j++]=l&268435455}return c}if(j_lm&&(navigator.appName=="Microsoft Internet Explorer")){BigInteger.prototype.am=am2;dbits=30}else{if(j_lm&&(navigator.appName!="Netscape")){BigInteger.prototype.am=am1;dbits=26}else{BigInteger.prototype.am=am3;dbits=28}}BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=((1<=0;--i){r[i]=this[i]}r.t=this.t;r.s=this.s}function bnpFromInt(x){this.t=1;this.s=(x<0)?-1:0;if(x>0){this[0]=x}else{if(x<-1){this[0]=x+this.DV}else{this.t=0}}}function nbv(i){var r=nbi();r.fromInt(i);return r}function bnpFromString(s,b){var k;if(b==16){k=4}else{if(b==8){k=3}else{if(b==256){k=8}else{if(b==2){k=1}else{if(b==32){k=5}else{if(b==4){k=2}else{this.fromRadix(s,b);return}}}}}}this.t=0;this.s=0;var i=s.length,mi=false,sh=0;while(--i>=0){var x=(k==8)?s[i]&255:intAt(s,i);if(x<0){if(s.charAt(i)=="-"){mi=true}continue}mi=false;if(sh==0){this[this.t++]=x}else{if(sh+k>this.DB){this[this.t-1]|=(x&((1<<(this.DB-sh))-1))<>(this.DB-sh))}else{this[this.t-1]|=x<=this.DB){sh-=this.DB}}if(k==8&&(s[0]&128)!=0){this.s=-1;if(sh>0){this[this.t-1]|=((1<<(this.DB-sh))-1)<0&&this[this.t-1]==c){--this.t}}function bnToString(b){if(this.s<0){return"-"+this.negate().toString(b)}var k;if(b==16){k=4}else{if(b==8){k=3}else{if(b==2){k=1}else{if(b==32){k=5}else{if(b==4){k=2}else{return this.toRadix(b)}}}}}var km=(1<0){if(p>p)>0){m=true;r=int2char(d)}while(i>=0){if(p>(p+=this.DB-k)}else{d=(this[i]>>(p-=k))&km;if(p<=0){p+=this.DB;--i}}if(d>0){m=true}if(m){r+=int2char(d)}}}return m?r:"0"}function bnNegate(){var r=nbi();BigInteger.ZERO.subTo(this,r);return r}function bnAbs(){return(this.s<0)?this.negate():this}function bnCompareTo(a){var r=this.s-a.s;if(r!=0){return r}var i=this.t;r=i-a.t;if(r!=0){return(this.s<0)?-r:r}while(--i>=0){if((r=this[i]-a[i])!=0){return r}}return 0}function nbits(x){var r=1,t;if((t=x>>>16)!=0){x=t;r+=16}if((t=x>>8)!=0){x=t;r+=8}if((t=x>>4)!=0){x=t;r+=4}if((t=x>>2)!=0){x=t;r+=2}if((t=x>>1)!=0){x=t;r+=1}return r}function bnBitLength(){if(this.t<=0){return 0}return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM))}function bnpDLShiftTo(n,r){var i;for(i=this.t-1;i>=0;--i){r[i+n]=this[i]}for(i=n-1;i>=0;--i){r[i]=0}r.t=this.t+n;r.s=this.s}function bnpDRShiftTo(n,r){for(var i=n;i=0;--i){r[i+ds+1]=(this[i]>>cbs)|c;c=(this[i]&bm)<=0;--i){r[i]=0}r[ds]=c;r.t=this.t+ds+1;r.s=this.s;r.clamp()}function bnpRShiftTo(n,r){r.s=this.s;var ds=Math.floor(n/this.DB);if(ds>=this.t){r.t=0;return}var bs=n%this.DB;var cbs=this.DB-bs;var bm=(1<>bs;for(var i=ds+1;i>bs}if(bs>0){r[this.t-ds-1]|=(this.s&bm)<>=this.DB}if(a.t>=this.DB}c+=this.s}else{c+=this.s;while(i>=this.DB}c-=a.s}r.s=(c<0)?-1:0;if(c<-1){r[i++]=this.DV+c}else{if(c>0){r[i++]=c}}r.t=i;r.clamp()}function bnpMultiplyTo(a,r){var x=this.abs(),y=a.abs();var i=x.t;r.t=i+y.t;while(--i>=0){r[i]=0}for(i=0;i=0){r[i]=0}for(i=0;i=x.DV){r[i+x.t]-=x.DV;r[i+x.t+1]=1}}if(r.t>0){r[r.t-1]+=x.am(i,x[i],r,2*i,0,1)}r.s=0;r.clamp()}function bnpDivRemTo(m,q,r){var pm=m.abs();if(pm.t<=0){return}var pt=this.abs();if(pt.t0){pm.lShiftTo(nsh,y);pt.lShiftTo(nsh,r)}else{pm.copyTo(y);pt.copyTo(r)}var ys=y.t;var y0=y[ys-1];if(y0==0){return}var yt=y0*(1<1)?y[ys-2]>>this.F2:0);var d1=this.FV/yt,d2=(1<=0){r[r.t++]=1;r.subTo(t,r)}BigInteger.ONE.dlShiftTo(ys,t);t.subTo(y,y);while(y.t=0){var qd=(r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);if((r[i]+=y.am(0,qd,r,j,0,ys))0){r.rShiftTo(nsh,r)}if(ts<0){BigInteger.ZERO.subTo(r,r)}}function bnMod(a){var r=nbi();this.abs().divRemTo(a,null,r);if(this.s<0&&r.compareTo(BigInteger.ZERO)>0){a.subTo(r,r)}return r}function Classic(m){this.m=m}function cConvert(x){if(x.s<0||x.compareTo(this.m)>=0){return x.mod(this.m)}else{return x}}function cRevert(x){return x}function cReduce(x){x.divRemTo(this.m,null,x)}function cMulTo(x,y,r){x.multiplyTo(y,r);this.reduce(r)}function cSqrTo(x,r){x.squareTo(r);this.reduce(r)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;function bnpInvDigit(){if(this.t<1){return 0}var x=this[0];if((x&1)==0){return 0}var y=x&3;y=(y*(2-(x&15)*y))&15;y=(y*(2-(x&255)*y))&255;y=(y*(2-(((x&65535)*y)&65535)))&65535;y=(y*(2-x*y%this.DV))%this.DV;return(y>0)?this.DV-y:-y}function Montgomery(m){this.m=m;this.mp=m.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<(m.DB-15))-1;this.mt2=2*m.t}function montConvert(x){var r=nbi();x.abs().dlShiftTo(this.m.t,r);r.divRemTo(this.m,null,r);if(x.s<0&&r.compareTo(BigInteger.ZERO)>0){this.m.subTo(r,r)}return r}function montRevert(x){var r=nbi();x.copyTo(r);this.reduce(r);return r}function montReduce(x){while(x.t<=this.mt2){x[x.t++]=0}for(var i=0;i>15)*this.mpl)&this.um)<<15))&x.DM;j=i+this.m.t;x[j]+=this.m.am(0,u0,x,i,0,this.m.t);while(x[j]>=x.DV){x[j]-=x.DV;x[++j]++}}x.clamp();x.drShiftTo(this.m.t,x);if(x.compareTo(this.m)>=0){x.subTo(this.m,x)}}function montSqrTo(x,r){x.squareTo(r);this.reduce(r)}function montMulTo(x,y,r){x.multiplyTo(y,r);this.reduce(r)}Montgomery.prototype.convert=montConvert;Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return((this.t>0)?(this[0]&1):this.s)==0}function bnpExp(e,z){if(e>4294967295||e<1){return BigInteger.ONE}var r=nbi(),r2=nbi(),g=z.convert(this),i=nbits(e)-1;g.copyTo(r);while(--i>=0){z.sqrTo(r,r2);if((e&(1<0){z.mulTo(r2,g,r)}else{var t=r;r=r2;r2=t}}return z.revert(r)}function bnModPowInt(e,m){var z;if(e<256||m.isEven()){z=new Classic(m)}else{z=new Montgomery(m)}return this.exp(e,z)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);function Arcfour(){this.i=0;this.j=0;this.S=new Array()}function ARC4init(key){var i,j,t;for(i=0;i<256;++i){this.S[i]=i}j=0;for(i=0;i<256;++i){j=(j+this.S[i]+key[i%key.length])&255;t=this.S[i];this.S[i]=this.S[j];this.S[j]=t}this.i=0;this.j=0}function ARC4next(){var t;this.i=(this.i+1)&255;this.j=(this.j+this.S[this.i])&255;t=this.S[this.i];this.S[this.i]=this.S[this.j];this.S[this.j]=t;return this.S[(t+this.S[this.i])&255]}Arcfour.prototype.init=ARC4init;Arcfour.prototype.next=ARC4next;function prng_newstate(){return new Arcfour()}var rng_psize=256;var rng_state;var rng_pool;var rng_pptr;function rng_seed_int(x){rng_pool[rng_pptr++]^=x&255;rng_pool[rng_pptr++]^=(x>>8)&255;rng_pool[rng_pptr++]^=(x>>16)&255;rng_pool[rng_pptr++]^=(x>>24)&255;if(rng_pptr>=rng_psize){rng_pptr-=rng_psize}}function rng_seed_time(){rng_seed_int(new Date().getTime())}if(rng_pool==null){rng_pool=new Array();rng_pptr=0;var t;if(window.crypto&&window.crypto.getRandomValues){var ua=new Uint8Array(32);window.crypto.getRandomValues(ua);for(t=0;t<32;++t){rng_pool[rng_pptr++]=ua[t]}}if(navigator.appName=="Netscape"&&navigator.appVersion<"5"&&window.crypto){var z=window.crypto.random(32);for(t=0;t>>8;rng_pool[rng_pptr++]=t&255}rng_pptr=0;rng_seed_time()}function rng_get_byte(){if(rng_state==null){rng_seed_time();rng_state=prng_newstate();rng_state.init(rng_pool);for(rng_pptr=0;rng_pptr=0&&n>0){var c=s.charCodeAt(i--);if(c<128){ba[--n]=c}else{if((c>127)&&(c<2048)){ba[--n]=(c&63)|128;ba[--n]=(c>>6)|192}else{ba[--n]=(c&63)|128;ba[--n]=((c>>6)&63)|128;ba[--n]=(c>>12)|224}}}ba[--n]=0;var rng=new SecureRandom();var x=new Array();while(n>2){x[0]=0;while(x[0]==0){rng.nextBytes(x)}ba[--n]=x[0]}ba[--n]=0;ba[--n]=0;return new BigInteger(ba)}function pkcs1pad3(s,n){if(n127)&&(c<2048)){ba[j++]=(c>>6)|192;ba[j++]=(c&63)|128}else{ba[j++]=(c>>12)|224;ba[j++]=((c>>6)&63)|128;ba[j++]=(c&63)|128}}}ba[j++]=0;var rng=new SecureRandom();var x=new Array();while(j0&&E.length>0){this.n=parseBigInt(N,16);this.e=parseInt(E,16)}else{alert("Invalid RSA public key")}}function RSADoPublic(x){return x.modPowInt(this.e,this.n)}function RSAEncrypt(text){var m=pkcs1pad3(text,(this.n.bitLength()+7)>>3);if(m==null){return null}var c=this.doPublic(m);if(c==null){return null}var h=c.toString(16);if((h.length&1)==0){return h}else{return"0"+h}}RSAKey.prototype.doPublic=RSADoPublic;RSAKey.prototype.setPublic=RSASetPublic;RSAKey.prototype.encrypt=RSAEncrypt; \ No newline at end of file diff --git a/package/lean/luci-app-xlnetacc/files/luci/luci-static/resources/xlnetacc/sha1-min.js b/package/lean/luci-app-xlnetacc/files/luci/luci-static/resources/xlnetacc/sha1-min.js deleted file mode 100644 index cb5544618..000000000 --- a/package/lean/luci-app-xlnetacc/files/luci/luci-static/resources/xlnetacc/sha1-min.js +++ /dev/null @@ -1,9 +0,0 @@ -/* - * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined - * in FIPS 180-1 - * Version 2.2 Copyright Paul Johnston 2000 - 2009. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for details. - */ -var hexcase=0;var b64pad="";function hex_sha1(a){return rstr2hex(rstr_sha1(str2rstr_utf8(a)))}function hex_hmac_sha1(a,b){return rstr2hex(rstr_hmac_sha1(str2rstr_utf8(a),str2rstr_utf8(b)))}function sha1_vm_test(){return hex_sha1("abc").toLowerCase()=="a9993e364706816aba3e25717850c26c9cd0d89d"}function rstr_sha1(a){return binb2rstr(binb_sha1(rstr2binb(a),a.length*8))}function rstr_hmac_sha1(c,f){var e=rstr2binb(c);if(e.length>16){e=binb_sha1(e,c.length*8)}var a=Array(16),d=Array(16);for(var b=0;b<16;b++){a[b]=e[b]^909522486;d[b]=e[b]^1549556828}var g=binb_sha1(a.concat(rstr2binb(f)),512+f.length*8);return binb2rstr(binb_sha1(d.concat(g),512+160))}function rstr2hex(c){try{hexcase}catch(g){hexcase=0}var f=hexcase?"0123456789ABCDEF":"0123456789abcdef";var b="";var a;for(var d=0;d>>4)&15)+f.charAt(a&15)}return b}function str2rstr_utf8(c){var b="";var d=-1;var a,e;while(++d>>6)&31),128|(a&63))}else{if(a<=65535){b+=String.fromCharCode(224|((a>>>12)&15),128|((a>>>6)&63),128|(a&63))}else{if(a<=2097151){b+=String.fromCharCode(240|((a>>>18)&7),128|((a>>>12)&63),128|((a>>>6)&63),128|(a&63))}}}}}return b}function rstr2binb(b){var a=Array(b.length>>2);for(var c=0;c>5]|=(b.charCodeAt(c/8)&255)<<(24-c%32)}return a}function binb2rstr(b){var a="";for(var c=0;c>5]>>>(24-c%32))&255)}return a}function binb_sha1(v,o){v[o>>5]|=128<<(24-o%32);v[((o+64>>9)<<4)+15]=o;var y=Array(80);var u=1732584193;var s=-271733879;var r=-1732584194;var q=271733878;var p=-1009589776;for(var l=0;l>16)+(d>>16)+(c>>16);return(b<<16)|(c&65535)}function bit_rol(a,b){return(a<>>(32-b))}; \ No newline at end of file diff --git a/package/lean/luci-app-xlnetacc/files/luci/model/cbi/xlnetacc.lua b/package/lean/luci-app-xlnetacc/files/luci/model/cbi/xlnetacc.lua index 3408a1ff9..9bef249ce 100644 --- a/package/lean/luci-app-xlnetacc/files/luci/model/cbi/xlnetacc.lua +++ b/package/lean/luci-app-xlnetacc/files/luci/model/cbi/xlnetacc.lua @@ -23,18 +23,14 @@ o:depends("logging", "1") o = s:option(ListValue, "network", translate("Upgrade interface")) uci:foreach("network", "interface", function(section) - if section[".name"] ~= "loopback" and section[".name"] ~= "lan" then + if section[".name"] ~= "loopback" then o:value(section[".name"]) end end) o = s:option(Value, "account", translate("XLNetAcc account")) -o = s:option(Value, "password", translate("XLNetAcc password"), translate("Does not store the plaintext password, automatically emptied after start.")) +o = s:option(Value, "password", translate("XLNetAcc password")) o.password = true -o.template = "xlnetacc/rsa" - -o = s:option(Value, "encrypt", translate("Encrypted password"), translate("Auto-generate in accordance with the plaintext password, do not modify it!")) ---o.readonly = true return m diff --git a/package/lean/luci-app-xlnetacc/files/luci/view/xlnetacc/rsa.htm b/package/lean/luci-app-xlnetacc/files/luci/view/xlnetacc/rsa.htm deleted file mode 100644 index b79dbf11a..000000000 --- a/package/lean/luci-app-xlnetacc/files/luci/view/xlnetacc/rsa.htm +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - -<%+cbi/valueheader%> - 0, "data-choices", { self.keylist, self.vallist }) - %> onchange="onchange_rsa(this.id)" /> - <% if self.password then %><% end %> -<%+cbi/valuefooter%> diff --git a/package/lean/luci-app-xlnetacc/files/root/etc/hotplug.d/iface/95-xlnetacc b/package/lean/luci-app-xlnetacc/files/root/etc/hotplug.d/iface/95-xlnetacc new file mode 100644 index 000000000..be0271ad8 --- /dev/null +++ b/package/lean/luci-app-xlnetacc/files/root/etc/hotplug.d/iface/95-xlnetacc @@ -0,0 +1,13 @@ +#!/bin/sh + +/etc/init.d/xlnetacc enabled || exit 0 +[ "$INTERFACE" != "$(uci get xlnetacc.general.network)" ] && exit 0 + +case "$ACTION" in + ifup) + /etc/init.d/xlnetacc start + ;; + ifdown) + /etc/init.d/xlnetacc stop + ;; +esac diff --git a/package/lean/luci-app-xlnetacc/files/root/etc/init.d/xlnetacc b/package/lean/luci-app-xlnetacc/files/root/etc/init.d/xlnetacc old mode 100755 new mode 100644 index f4ffef0a2..e41e825dd --- a/package/lean/luci-app-xlnetacc/files/root/etc/init.d/xlnetacc +++ b/package/lean/luci-app-xlnetacc/files/root/etc/init.d/xlnetacc @@ -7,38 +7,42 @@ SERVICE_DAEMONIZE=1 NAME=xlnetacc start() { - pidof "${NAME}.sh" >/dev/null 2>&1 && return + local retry=1 + while pidof "${NAME}.sh" >/dev/null 2>&1; do + [ $retry -ge 10 ] && return 1 || let retry++ + sleep 1 + done config_load "$NAME" config_get_bool enabled "general" "enabled" 0 config_get_bool down_acc "general" "down_acc" 0 config_get_bool up_acc "general" "up_acc" 0 config_get network "general" "network" - config_get account "general" "account" - config_get encrypt "general" "encrypt" - ( [ $enabled -eq 0 ] || [ $down_acc -eq 0 -a $up_acc -eq 0 ] || [ -z "$account" -o -z "$encrypt" -o -z "$network" ] ) && return + config_get username "general" "account" + config_get password "general" "password" + ( [ $enabled -eq 0 ] || [ $down_acc -eq 0 -a $up_acc -eq 0 ] || [ -z "$username" -o -z "$password" -o -z "$network" ] ) && return 2 logger -p "daemon.notice" -t "$NAME" "XLNetAcc is starting ..." service_start /usr/bin/${NAME}.sh --start } stop() { - pidof "${NAME}.sh" >/dev/null 2>&1 || return + pidof "${NAME}.sh" >/dev/null 2>&1 || return 1 local pid spid for pid in $(pidof "${NAME}.sh"); do - kill $pid >/dev/null 2>&1 echo "Stop XLNetAcc process PID: $pid" + kill $pid >/dev/null 2>&1 for spid in $(pgrep -P $pid "sleep"); do - kill $spid >/dev/null 2>&1 echo "Stop XLNetAcc process SPID: $spid" + kill $spid >/dev/null 2>&1 done done logger -p "daemon.notice" -t "$NAME" "XLNetAcc has stoped." + return 0 } restart() { - stop - sleep 1 + stop && sleep 1 start } diff --git a/package/lean/luci-app-xlnetacc/files/root/etc/uci-defaults/luci-xlnetacc b/package/lean/luci-app-xlnetacc/files/root/etc/uci-defaults/luci-xlnetacc old mode 100755 new mode 100644 diff --git a/package/lean/luci-app-xlnetacc/files/root/usr/bin/xlnetacc.sh b/package/lean/luci-app-xlnetacc/files/root/usr/bin/xlnetacc.sh index 61e938e9f..e4c18ef81 100644 --- a/package/lean/luci-app-xlnetacc/files/root/usr/bin/xlnetacc.sh +++ b/package/lean/luci-app-xlnetacc/files/root/usr/bin/xlnetacc.sh @@ -1,34 +1,36 @@ #!/bin/sh # 声明常量 -readonly appName='com.xunlei.vip.swjsq' -readonly protocolVersion=108 -readonly sdkVersion=17550 -readonly agentVersion='1.6.1.177600' +readonly packageName='com.xunlei.vip.swjsq' +readonly protocolVersion=200 +readonly businessType=68 +readonly sdkVersion='2.1.1.177662' +readonly clientVersion='2.4.1.3' +readonly agent_xl="android-async-http/xl-acc-sdk/version-$sdkVersion" +readonly agent_down='okhttp/3.4.1' +readonly agent_up='android-async-http/xl-acc-sdk/version-1.0.0.1' readonly client_type_down='android-swjsq' -readonly client_version_down='2.0.3.4' readonly client_type_up='android-uplink' -readonly client_version_up='2.3.3.9' -readonly client_os='android-7.0.24DUK-AL20' # 声明全局变量 +_bind_ip= _http_cmd= -_http_args= -_devicesign= _peerid= +_devicesign= _userid= +_loginkey= _sessionid= -_api_url_down= -_api_url_up= -_dial_account_down= -_dial_account_up= -_cur_down= -_max_down= -_cur_up= -_max_up= +_portal_down= +_portal_up= +_dial_account= access_url= -msg_to_en= -msg_to_cn= +http_args= +user_agent= +link_cn= +lasterr= +sequence_xl=1000000 +sequence_down=$(( $(date +%s) / 6 )) +sequence_up=$sequence_down # 包含用于解析 JSON 格式返回值的函数 . /usr/share/libubox/jshn.sh @@ -82,38 +84,34 @@ _log() { # 清理日志 clean_log() { [ $logging -eq 1 -a -f "$LOGFILE" ] || return - if [ $(wc -l "$LOGFILE" | awk '{print $1}') -gt 500 ]; then - _log "清理日志文件" - local logdata=$(tail -n 300 "$LOGFILE") - echo "$logdata" > $LOGFILE 2> /dev/null - unset logdata - fi + [ $(wc -l "$LOGFILE" | awk '{print $1}') -le 800 ] && return + _log "清理日志文件" + local logdata=$(tail -n 500 "$LOGFILE") + echo "$logdata" > $LOGFILE 2> /dev/null + unset logdata } # 获取接口IP地址 -get_acc_ip() { - local acc_ipaddr +get_bind_ip() { json_cleanup; json_load "$(ubus call network.interface.$network status 2> /dev/null)" >/dev/null 2>&1 json_select "ipv4-address" >/dev/null 2>&1; json_select 1 >/dev/null 2>&1 - json_get_var acc_ipaddr "address" - [ -z "$acc_ipaddr" ] && { _log "获取网络 $network IP地址出错"; return; } - _log "acc_ipaddr is $acc_ipaddr" $(( 1 | 4 )) - - if [ "$acc_ipaddr" != "0.0.0.0" ]; then - _log "绑定IP地址: $acc_ipaddr" - echo -n "$acc_ipaddr" + json_get_var _bind_ip "address" + if [ -z "$_bind_ip" -o "$_bind_ip"x == "0.0.0.0"x ]; then + _log "获取网络 $network IP地址失败" + return 1 + else + _log "绑定IP地址: $_bind_ip" + return 0 fi } # 定义基本 HTTP 命令和参数 gen_http_cmd() { - _http_cmd="wget-ssl -nv -t 1 -O - --no-check-certificate" - _http_cmd="$_http_cmd --bind-address=$1" - _http_cmd="$_http_cmd --user-agent=android-async-http/xl-acc-sdk/version-$agentVersion" - _log "_http_cmd is $_http_cmd" $(( 1 | 4 )) + _http_cmd="wget-ssl -nv -t 1 -T 5 -O - --no-check-certificate" + _http_cmd="$_http_cmd --bind-address=$_bind_ip" } -# 生成设备签名 +# 生成设备标识 gen_device_sign() { local ifname macaddr while : ; do @@ -126,275 +124,439 @@ gen_device_sign() { [ -z "$macaddr" ] && { _log "获取网络 $network MAC地址出错"; return; } macaddr=$(echo -n "$macaddr" | awk '{print toupper($0)}') - # 根据MAC地址生成peerid - readonly _peerid="${macaddr//:/}004V" + # 计算peerID + local fake_peerid=$(awk -F- '{print toupper($5)}' '/proc/sys/kernel/random/uuid') + readonly _peerid="${fake_peerid}004V" _log "_peerid is $_peerid" $(( 1 | 4 )) - # 根据MAC地址生成devicesign - local xlnetacc_vip="${appName}68700d1872b772946a6940e4b51827e8af" - local fake_device_id_md5=$(echo -n "$macaddr" | md5sum | awk '{print $1}') - local fake_device_id_sha1=$(echo -n "$fake_device_id_md5$xlnetacc_vip" | openssl sha1 -hmac | awk '{print $2}') - readonly _devicesign="div100.$fake_device_id_md5"$(echo -n "$fake_device_id_sha1" | md5sum | awk '{print $1}') + # 计算devicesign + # sign = div.10?.device_id + md5(sha1(packageName + businessType + md5(a protocolVersion specific GUID))) + local fake_device_id=$(echo -n "${macaddr//:/}" | openssl dgst -md5 | awk '{print $2}') + local fake_device_sign=$(echo -n "${fake_device_id}${packageName}${businessType}c7f21687eed3cdb400ca11fc2263c998" \ + | openssl dgst -sha1 | awk '{print $2}') + readonly _devicesign="div101.${fake_device_id}"$(echo -n "$fake_device_sign" | openssl dgst -md5 | awk '{print $2}') _log "_devicesign is $_devicesign" $(( 1 | 4 )) } -# 帐号登录 -xlnetacc_login() { +# 快鸟帐号通用参数 +swjsq_json() { + let sequence_xl++ # 生成POST数据 json_init - json_add_string userName "$account" - json_add_int businessType 68 - json_add_string clientVersion "$client_version_down" - json_add_string appName "ANDROID-$appName" - json_add_int isCompressed 0 - json_add_int sequenceNo 1000001 - json_add_string sessionID - json_add_int loginType 0 - json_add_object rsaKey - json_add_string e '010001' - json_add_string n 'AC69F5CCC8BDE47CD3D371603748378C9CFAD2938A6B021E0E191013975AD683F5CBF9ADE8BD7D46B4D2EC2D78AF146F1DD2D50DC51446BB8880B8CE88D476694DFC60594393BEEFAA16F5DBCEBE22F89D640F5336E42F587DC4AFEDEFEAC36CF007009CCCE5C1ACB4FF06FBA69802A8085C2C54BADD0597FC83E6870F1E36FD' - json_close_object - json_add_int cmdID 1 - json_add_string verifyCode + json_add_string protocolVersion "$protocolVersion" + json_add_string sequenceNo "$sequence_xl" + json_add_string platformVersion '2' + json_add_string isCompressed '0' + json_add_string businessType "$businessType" + json_add_string clientVersion "$clientVersion" json_add_string peerID "$_peerid" - json_add_int protocolVersion $protocolVersion - json_add_int platformVersion 1 - json_add_string passWord "$encrypt" - json_add_string extensionList - json_add_string verifyKey - json_add_int sdkVersion $sdkVersion + json_add_string appName "ANDROID-$packageName" + json_add_string sdkVersion "${sdkVersion##*.}" json_add_string devicesign "$_devicesign" - json_close_object - - local ret=$($_http_cmd 'https://login.mobile.reg2t.sandai.net:443/' --post-data="$(json_dump)") - _log "ret is $ret" $(( 1 | 4 )) - json_cleanup; json_load "$ret" >/dev/null 2>&1 - local errno - json_get_var errno "errorCode" - json_get_var _userid "userID" - _log "_userid is $_userid" $(( 1 | 4 )) - json_get_var _sessionid "sessionID" - _log "_sessionid is $_sessionid" $(( 1 | 4 )) - - if [ ${errno:=-1} -ne 0 ] || [ -z "$_userid" -o -z "$_sessionid" ]; then - local errorDesc - json_get_var errorDesc "errorDesc" - local outmsg="帐号登录失败。错误代码: ${errno}"; \ - [ -n "$errorDesc" ] && outmsg="${outmsg},原因: $errorDesc"; _log "$outmsg" $(( 1 | 8 | 16 | 32 )) - else - local outmsg="帐号登录成功"; _log "$outmsg" $(( 1 | 8 | 16 )) - fi - - return $errno + json_add_string deviceModel 'MI' + json_add_string deviceName 'Xiaomi Mi' + json_add_string OSVersion "7.1.1" } -# 获取提速API -xlnetacc_portal() { +# 帐号登录 +swjsq_login() { + swjsq_json + if [ -z "$_userid" -o -z "$_loginkey" ]; then + access_url='https://mobile-login.xunlei.com/login' + json_add_string userName "$username" + json_add_string passWord "$password" + json_add_string verifyKey + json_add_string verifyCode + else + access_url='https://mobile-login.xunlei.com/loginkey' + json_add_string userName "$_userid" + json_add_string loginKey "$_loginkey" + fi + json_close_object + + local ret=$($_http_cmd --user-agent="$agent_xl" "$access_url" --post-data="$(json_dump)") + case $? in + 0) + _log "login is $ret" $(( 1 | 4 )) + json_cleanup; json_load "$ret" >/dev/null 2>&1 + json_get_var lasterr "errorCode" + ;; + 2) lasterr=-2;; + 4) lasterr=-3;; + *) lasterr=-1;; + esac + + case ${lasterr:=-1} in + 0) + json_get_var _userid "userID" + json_get_var _loginkey "loginKey" + json_get_var _sessionid "sessionID" + _log "_sessionid is $_sessionid" $(( 1 | 4 )) + local outmsg="帐号登录成功"; _log "$outmsg" $(( 1 | 8 )) + ;; + 15) # 身份信息已失效 + _userid=; _loginkey=;; + -1) + local outmsg="帐号登录失败。迅雷服务器未响应,请稍候"; _log "$outmsg";; + -2) + local outmsg="Wget 参数解析错误,请更新 GNU Wget"; _log "$outmsg" $(( 1 | 8 | 32 ));; + -3) + local outmsg="Wget 网络通信失败,请稍候"; _log "$outmsg";; + *) + local errorDesc; json_get_var errorDesc "errorDesc" + local outmsg="帐号登录失败。错误代码: ${lasterr}"; \ + [ -n "$errorDesc" ] && outmsg="${outmsg},原因: $errorDesc"; _log "$outmsg" $(( 1 | 8 | 32 ));; + esac + + [ $lasterr -eq 0 ] && return 0 || return 1 +} + +# 帐号注销 +swjsq_logout() { + swjsq_json + json_add_string userID "$_userid" + json_add_string sessionID "$_sessionid" + json_close_object + + local ret=$($_http_cmd --user-agent="$agent_xl" 'https://mobile-login.xunlei.com/logout' --post-data="$(json_dump)") + _log "logout is $ret" $(( 1 | 4 )) + json_cleanup; json_load "$ret" >/dev/null 2>&1 + json_get_var lasterr "errorCode" + + case ${lasterr:=-1} in + 0) + _sessionid= + local outmsg="帐号注销成功"; _log "$outmsg" $(( 1 | 8 ));; + -1) + local outmsg="帐号注销失败。迅雷服务器未响应,请稍候"; _log "$outmsg";; + *) + local errorDesc; json_get_var errorDesc "errorDesc" + local outmsg="帐号注销失败。错误代码: ${lasterr}"; \ + [ -n "$errorDesc" ] && outmsg="${outmsg},原因: $errorDesc"; _log "$outmsg" $(( 1 | 8 | 32 ));; + esac + + [ $lasterr -eq 0 ] && return 0 || return 1 +} + +# 获取用户信息 +swjsq_getuserinfo() { + [ $1 -eq 1 ] && local _vasid=14 || local _vasid=33 + swjsq_json + json_add_string userID "$_userid" + json_add_string sessionID "$_sessionid" + json_add_string vasid "$_vasid" + json_close_object + + local ret=$($_http_cmd --user-agent="$agent_xl" 'https://mobile-login.xunlei.com/getuserinfo' --post-data="$(json_dump)") + _log "getuserinfo $1 is $ret" $(( 1 | 4 )) + json_cleanup; json_load "$ret" >/dev/null 2>&1 + json_get_var lasterr "errorCode" + + [ $1 -eq 1 ] && local outmsg="下行提速会员" || local outmsg="上行提速会员" + case ${lasterr:=-1} in + 0) + local index vasid isVip isYear expireDate can_upgrade + json_select "vipList" >/dev/null 2>&1 + while : ; do + json_select ${index:=1} >/dev/null 2>&1 + [ $? -ne 0 ] && break + json_get_var vasid "vasid" + json_get_var isVip "isVip" + json_get_var isYear "isYear" + json_get_var expireDate "expireDate" + json_select ".." >/dev/null 2>&1 + let index++ + ([ $1 -eq 1 -a ${vasid:-0} -eq 2 ] || [ ${vasid:-0} -eq $_vasid ]) && \ + [ ${isVip:-0} -eq 1 -o ${isYear:-0} -eq 1 ] && { can_upgrade=1; break; } + done + if [ ${can_upgrade:-0} -eq 1 ]; then + outmsg="获取${outmsg}信息成功。会员到期时间:${expireDate:0:4}-${expireDate:4:2}-${expireDate:6:2}"; \ + _log "$outmsg" $(( 1 | $1 * 8 )) + else + if [ ${#expireDate} -ge 8 ]; then + outmsg="${outmsg}已到期。会员到期时间:${expireDate:0:4}-${expireDate:4:2}-${expireDate:6:2}" + else + outmsg="${outmsg}无效" + fi + _log "$outmsg" $(( 1 | $1 * 8 | 32 )) + [ $1 -eq 1 ] && down_acc=0 || up_acc=0 + fi + ;; + -1) + outmsg="获取${outmsg}信息失败。迅雷服务器未响应,请稍候"; _log "$outmsg";; + *) + local errorDesc; json_get_var errorDesc "errorDesc" + outmsg="获取${outmsg}信息失败。错误代码: ${lasterr}"; \ + [ -n "$errorDesc" ] && outmsg="${outmsg},原因: $errorDesc"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));; + esac + + [ $lasterr -eq 0 ] && return 0 || return 1 +} + +# 获取提速入口 +swjsq_portal() { xlnetacc_var $1 [ $1 -eq 1 ] && access_url='http://api.portal.swjsq.vip.xunlei.com:81/v2/queryportal' || \ access_url='http://api.upportal.swjsq.vip.xunlei.com/v2/queryportal' - local ret=$($_http_cmd "$access_url") - _log "$msg_to_en portal is $ret" $(( 1 | 4 )) + local ret=$($_http_cmd --user-agent="$user_agent" "$access_url") + _log "portal $1 is $ret" $(( 1 | 4 )) json_cleanup; json_load "$ret" >/dev/null 2>&1 - local errno portal_ip portal_port - json_get_var errno "errno" - json_get_var portal_ip "interface_ip" - json_get_var portal_port "interface_port" + json_get_var lasterr "errno" - if [ ${errno:=-1} -ne 0 ] || [ -z "$portal_ip" -o -z "$portal_port" ]; then - local message - json_get_var message "message" - local outmsg="获取${msg_to_cn}API失败。错误代码: ${errno}"; \ - [ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 )) - else - local outmsg="获取${msg_to_cn}API成功"; _log "$outmsg" $(( 1 | $1 * 8 )) - if [ $1 -eq 1 ]; then - _api_url_down="http://$portal_ip:$portal_port/v2" - _log "_api_url_down is $_api_url_down" $(( 1 | 4 )) - else - _api_url_up="http://$portal_ip:$portal_port/v2" - _log "_api_url_up is $_api_url_up" $(( 1 | 4 )) - fi - fi + case ${lasterr:=-1} in + 0) + local interface_ip interface_port province sp + json_get_var interface_ip "interface_ip" + json_get_var interface_port "interface_port" + json_get_var province "province_name" + json_get_var sp "sp_name" + if [ $1 -eq 1 ]; then + _portal_down="http://$interface_ip:$interface_port/v2" + _log "_portal_down is $_portal_down" $(( 1 | 4 )) + else + _portal_up="http://$interface_ip:$interface_port/v2" + _log "_portal_up is $_portal_up" $(( 1 | 4 )) + fi + local outmsg="获取${link_cn}提速入口成功"; \ + [ -n "$province" -a -n "$sp" ] && outmsg="${outmsg}。运营商:${province}${sp}"; _log "$outmsg" $(( 1 | $1 * 8 )) + ;; + -1) + local outmsg="获取${link_cn}提速入口失败。迅雷服务器未响应,请稍候"; _log "$outmsg";; + *) + local message; json_get_var message "message" + local outmsg="获取${link_cn}提速入口失败。错误代码: ${lasterr}"; \ + [ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));; + esac - return $errno + [ $lasterr -eq 0 ] && return 0 || return 1 } # 获取网络带宽信息 -xlnetacc_bandwidth() { +isp_bandwidth() { xlnetacc_var $1 - local ret=$($_http_cmd "$access_url/bandwidth?${_http_args}&time_and=$(date +%s)000") - _log "$msg_to_en bandwidth is $ret" $(( 1 | 4 )) + local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/bandwidth?${http_args%&dial_account=*}") + _log "bandwidth $1 is $ret" $(( 1 | 4 )) json_cleanup; json_load "$ret" >/dev/null 2>&1 - local errno can_upgrade dial_account richmessage - json_get_var errno "errno" - json_get_var can_upgrade "can_upgrade" - json_get_var dial_account "dial_account" - json_get_var richmessage "richmessage" + json_get_var lasterr "errno" - # 获取带宽数据 - local cur_bandwidth max_bandwidth flag - [ $1 -eq 1 ] && flag="downstream" || flag="upstream" - json_select "bandwidth" >/dev/null 2>&1 - json_get_var cur_bandwidth "$flag" - json_select; json_select "max_bandwidth" >/dev/null 2>&1 - json_get_var max_bandwidth "$flag" - cur_bandwidth=$(expr $cur_bandwidth / 1024 2> /dev/null) - max_bandwidth=$(expr $max_bandwidth / 1024 2> /dev/null) + case ${lasterr:=-1} in + 0) + # 获取带宽数据 + local can_upgrade bind_dial_account dial_account stream cur_bandwidth max_bandwidth + [ $1 -eq 1 ] && stream="downstream" || stream="upstream" + json_get_var can_upgrade "can_upgrade" + json_get_var bind_dial_account "bind_dial_account" + json_get_var dial_account "dial_account" + json_select; json_select "bandwidth" >/dev/null 2>&1 + json_get_var cur_bandwidth "$stream" + json_select; json_select "max_bandwidth" >/dev/null 2>&1 + json_get_var max_bandwidth "$stream" + json_select + cur_bandwidth=$(expr ${cur_bandwidth:-0} / 1024) + max_bandwidth=$(expr ${max_bandwidth:-0} / 1024) - if [ ${errno:=-1} -ne 0 ]; then - local outmsg="获取${msg_to_cn}带宽信息失败。错误代码: ${errno}"; \ - [ -n "$richmessage" ] && outmsg="${outmsg},原因: $richmessage"; _log "$outmsg" $(( 1 | $1 * 8 | 32 )) - elif [ "$can_upgrade" -eq 0 ]; then - local outmsg="${msg_to_cn}无法提速"; \ - [ -n "$richmessage" ] && outmsg="${outmsg},原因: $richmessage"; _log "$outmsg" $(( 1 | $1 * 8 | 32 )) - [ $1 -eq 1 ] && down_acc=0 || up_acc=0 - errno=-2 - elif [ "$cur_bandwidth" -ge "$max_bandwidth" ]; then - local outmsg="${msg_to_cn}无需提速。当前带宽 ${cur_bandwidth}M,超过最大可提升带宽 ${max_bandwidth}M"; \ - _log "$outmsg" $(( 1 | $1 * 8 )) - [ $1 -eq 1 ] && down_acc=0 || up_acc=0 - errno=-3 - else - local outmsg="${msg_to_cn}可以提速。当前带宽 ${cur_bandwidth}M,可提升至 ${max_bandwidth}M"; _log "$outmsg" $(( 1 | $1 * 8 )) - if [ $1 -eq 1 ]; then - _dial_account_down=$dial_account - _log "_dial_account_down is $_dial_account_down" $(( 1 | 4 )) - _cur_down=$cur_bandwidth - _log "_cur_down is $_cur_down" $(( 1 | 4 )) - _max_down=$max_bandwidth - _log "_max_down is $_max_down" $(( 1 | 4 )) - else - _dial_account_up=$dial_account - _log "_dial_account_up is $_dial_account_up" $(( 1 | 4 )) - _cur_up=$cur_bandwidth - _log "_cur_up is $_cur_up" $(( 1 | 4 )) - _max_up=$max_bandwidth - _log "_max_up is $_max_up" $(( 1 | 4 )) - fi - fi + if [ -n "$bind_dial_account" -a "$bind_dial_account" != "$dial_account" ]; then + local outmsg="绑定宽带账号 $bind_dial_account 与当前宽带账号 $dial_account 不一致,请联系迅雷客服解绑(每月仅一次)"; \ + _log "$outmsg" $(( 1 | 8 | 32 )) + down_acc=0; up_acc=0 + elif [ $can_upgrade -eq 0 ]; then + local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message" + local outmsg="${link_cn}无法提速"; \ + [ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 )) + [ $1 -eq 1 ] && down_acc=0 || up_acc=0 + elif [ $cur_bandwidth -ge $max_bandwidth ]; then + local outmsg="${link_cn}无需提速。当前带宽 ${cur_bandwidth}M,超过最大可提升带宽 ${max_bandwidth}M"; \ + _log "$outmsg" $(( 1 | $1 * 8 )) + [ $1 -eq 1 ] && down_acc=0 || up_acc=0 + else + if [ -z "$_dial_account" -a -n "$dial_account" ]; then + _dial_account=$dial_account + _log "_dial_account is $_dial_account" $(( 1 | 4 )) + fi + local outmsg="${link_cn}可以提速。当前带宽 ${cur_bandwidth}M,可提升至 ${max_bandwidth}M"; _log "$outmsg" $(( 1 | $1 * 8 )) + fi + ;; + 724) # 724 账号存在异常 + lasterr=-2 + local outmsg="获取${link_cn}网络带宽信息失败。原因: 您的账号存在异常,请联系迅雷客服反馈"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));; + 3103) # 3103 线路暂不支持 + lasterr=0 + local province sp + json_get_var province "province_name"; json_get_var sp "sp_name" + local outmsg="${link_cn}无法提速。原因: ${province}${sp}线路暂不支持"; _log "$outmsg" $(( 1 | $1 * 8 | 32 )) + [ $1 -eq 1 ] && down_acc=0 || up_acc=0 + ;; + -1) + local outmsg="获取${link_cn}网络带宽信息失败。运营商服务器未响应,请稍候"; _log "$outmsg";; + *) + local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message" + local outmsg="获取${link_cn}网络带宽信息失败。错误代码: ${lasterr}"; \ + [ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));; + esac - return $errno + [ $lasterr -eq 0 ] && return 0 || return 1 } # 发送带宽提速信号 -xlnetacc_upgrade() { +isp_upgrade() { xlnetacc_var $1 - local ret=$($_http_cmd "$access_url/upgrade?${_http_args}&time_and=$(date +%s)000") - _log "$msg_to_en upgrade is $ret" $(( 1 | 4 )) + local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/upgrade?$http_args") + _log "upgrade $1 is $ret" $(( 1 | 4 )) json_cleanup; json_load "$ret" >/dev/null 2>&1 - local errno - json_get_var errno "errno" + json_get_var lasterr "errno" - if [ ${errno:=-1} -ne 0 ]; then - local richmessage - json_get_var richmessage "richmessage" - local outmsg="${msg_to_cn}提速失败。错误代码: ${errno}"; \ - [ -n "$richmessage" ] && outmsg="${outmsg},原因: $richmessage"; _log "$outmsg" $(( 1 | $1 * 8 | 32 )) - [ $errno -ne -1 ] && { [ $1 -eq 1 ] && down_acc=0 || up_acc=0; } - else - [ $1 -eq 1 ] && local cur_bandwidth=$_cur_down || local cur_bandwidth=$_cur_up - [ $1 -eq 1 ] && local max_bandwidth=$_max_down || local max_bandwidth=$_max_up - local outmsg="${msg_to_cn}提速成功,带宽已从 ${cur_bandwidth}M 提升到 ${max_bandwidth}M"; _log "$outmsg" $(( 1 | $1 * 8 )) - [ $1 -eq 1 ] && down_acc=2 || up_acc=2 - fi + case ${lasterr:=-1} in + 0) + local bandwidth + json_select "bandwidth" >/dev/null 2>&1 + json_get_var bandwidth "downstream" + bandwidth=$(expr ${bandwidth:-0} / 1024) + local outmsg="${link_cn}提速成功,带宽已提升到 ${bandwidth}M"; _log "$outmsg" $(( 1 | $1 * 8 )) + [ $1 -eq 1 ] && down_acc=2 || up_acc=2 + ;; + 812) # 812 已处于提速状态 + lasterr=0 + local outmsg="${link_cn}提速成功,当前宽带已处于提速状态"; _log "$outmsg" $(( 1 | $1 * 8 )) + [ $1 -eq 1 ] && down_acc=2 || up_acc=2 + ;; + 724) # 724 账号存在异常 + lasterr=-2 + local outmsg="${link_cn}提速失败。原因: 您的账号存在异常,请联系迅雷客服反馈"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));; + -1) + local outmsg="${link_cn}提速失败。运营商服务器未响应,请稍候"; _log "$outmsg";; + *) + local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message" + local outmsg="${link_cn}提速失败。错误代码: ${lasterr}"; \ + [ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));; + esac - return $errno + [ $lasterr -eq 0 ] && return 0 || return 1 } # 发送提速心跳信号 -xlnetacc_keepalive() { +isp_keepalive() { xlnetacc_var $1 - local ret=$($_http_cmd "$access_url/keepalive?${_http_args}&time_and=$(date +%s)000") - _log "$msg_to_en keepalive is $ret" $(( 1 | 4 )) + local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/keepalive?$http_args") + _log "keepalive $1 is $ret" $(( 1 | 4 )) json_cleanup; json_load "$ret" >/dev/null 2>&1 - local errno - json_get_var errno "errno" + json_get_var lasterr "errno" - if [ ${errno:=-1} -ne 0 ]; then - local richmessage - json_get_var richmessage "richmessage" - local outmsg="${msg_to_cn}提速失效。错误代码: ${errno}"; \ - [ -n "$richmessage" ] && outmsg="${outmsg},原因: $richmessage"; _log "$outmsg" $(( 1 | $1 * 8 | 32 )) - [ $1 -eq 1 ] && down_acc=1 || up_acc=1 - else - _log "${msg_to_cn}心跳信号返回正常" - fi + case ${lasterr:=-1} in + 0) + local outmsg="${link_cn}心跳信号返回正常"; _log "$outmsg";; + 513) # 513 提速通道不存在 + lasterr=-2 + local outmsg="${link_cn}提速超时,提速通道不存在"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));; + -1) + local outmsg="${link_cn}心跳信号发送失败。运营商服务器未响应,请稍候"; _log "$outmsg";; + *) + local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message" + local outmsg="${link_cn}提速失效。错误代码: ${lasterr}"; \ + [ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));; + esac - return $errno + [ $lasterr -eq 0 ] && return 0 || return 1 } # 发送带宽恢复信号 -xlnetacc_recover() { +isp_recover() { xlnetacc_var $1 - local ret=$($_http_cmd "$access_url/recover?${_http_args}&time_and=$(date +%s)000") - _log "$msg_to_en recover is $ret" $(( 1 | 4 )) + local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/recover?$http_args") + _log "recover $1 is $ret" $(( 1 | 4 )) json_cleanup; json_load "$ret" >/dev/null 2>&1 - local errno - json_get_var errno "errno" + json_get_var lasterr "errno" - if [ ${errno:=-1} -ne 0 ]; then - local richmessage - json_get_var richmessage "richmessage" - local outmsg="${msg_to_cn}带宽恢复失败。错误代码: ${errno}"; \ - [ -n "$richmessage" ] && outmsg="${outmsg},原因: $richmessage"; _log "$outmsg" $(( 1 | $1 * 8 | 32 )) - else - _log "${msg_to_cn}带宽已恢复" - [ $1 -eq 1 ] && down_acc=1 || up_acc=1 - fi + case ${lasterr:=-1} in + 0) + local outmsg="${link_cn}带宽已恢复"; _log "$outmsg" $(( 1 | $1 * 8 )) + [ $1 -eq 1 ] && down_acc=1 || up_acc=1;; + -1) + local outmsg="${link_cn}带宽恢复失败。运营商服务器未响应,请稍候"; _log "$outmsg";; + *) + local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message" + local outmsg="${link_cn}带宽恢复失败。错误代码: ${lasterr}"; \ + [ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));; + esac - return $errno + [ $lasterr -eq 0 ] && return 0 || return 1 } # 查询提速信息,未使用 -xlnetacc_query() { +isp_query() { xlnetacc_var $1 - local ret=$($_http_cmd "$access_url/query_try_info?${_http_args}&time_and=$(date +%s)000") - _log "$msg_to_en query_try_info is $ret" $(( 1 | 4 )) + local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/query_try_info?$http_args") + _log "query_try_info $1 is $ret" $(( 1 | 4 )) json_cleanup; json_load "$ret" >/dev/null 2>&1 - local errno - json_get_var errno "errno" + json_get_var lasterr "errno" - return $errno -} - -# 带宽提速处理 -xlnetacc_acc() { - _api_url_down=; _api_url_up= - _dial_account_down=; _dial_account_up= - _cur_down=0; _max_down=0; _cur_up=0; _max_up=0 - - xlnetacc_portal $1 || return - xlnetacc_bandwidth $1 || return - xlnetacc_upgrade $1 + [ $lasterr -eq 0 ] && return 0 || return 1 } # 设置参数变量 xlnetacc_var() { if [ $1 -eq 1 ]; then - access_url=$_api_url_down - _http_args="peerid=${_peerid}&userid=${_userid}&user_type=1&sessionid=${_sessionid}&dial_account=${_dial_account_down}&client_type=${client_type_down}-${client_version_down}&client_version=${client_type_down//-/}-${client_version_down}&os=${client_os}" - msg_to_en="DownLink" - msg_to_cn="下行" + let sequence_down++ + access_url=$_portal_down + http_args="sequence=${sequence_down}&client_type=${client_type_down}-${clientVersion}&client_version=${client_type_down//-/}-${clientVersion}&chanel=umeng-10900011&time_and=$(date +%s)000" + user_agent=$agent_down + link_cn="下行" else - access_url=$_api_url_up - _http_args="peerid=${_peerid}&userid=${_userid}&user_type=1&sessionid=${_sessionid}&dial_account=${_dial_account_up}&client_type=${client_type_up}-${client_version_up}&client_version=${client_type_up//-/}-${client_version_up}&os=${client_os}" - msg_to_en="UpLink" - msg_to_cn="上行" + let sequence_up++ + access_url=$_portal_up + http_args="sequence=${sequence_up}&client_type=${client_type_up}-${clientVersion}&client_version=${client_type_up//-/}-${clientVersion}" + user_agent=$agent_up + link_cn="上行" fi + http_args="${http_args}&peerid=${_peerid}&userid=${_userid}&sessionid=${_sessionid}&user_type=1&os=android-7.1.1" + [ -n "$_dial_account" ] && http_args="${http_args}&dial_account=${_dial_account}" +} + +# 重试循环 +xlnetacc_retry() { + if [ $# -ge 3 -a $3 -ne 0 ]; then + [ $2 -eq 1 -a $down_acc -ne $3 ] && return 0 + [ $2 -eq 2 -a $up_acc -ne $3 ] && return 0 + fi + + local retry=1 + while : ; do + lasterr= + eval $1 $2 && break # 成功 + [ $# -ge 4 -a $retry -ge $4 ] && break || let retry++ # 重试超时 + case $lasterr in + -1) sleep 5s;; # 服务器未响应 + -2) break;; # 严重错误 + *) sleep 3s;; # 其它错误 + esac + done + + [ ${lasterr:-0} -eq 0 ] && return 0 || return 1 +} + +# 注销已登录帐号 +xlnetacc_logout() { + [ -z "$_sessionid" ] && return 2 + [ $# -ge 1 ] && local retry=$1 || local retry=1 + + xlnetacc_retry 'isp_recover' 1 2 $retry + xlnetacc_retry 'isp_recover' 2 2 $retry + xlnetacc_retry 'swjsq_logout' 0 0 $retry + [ $down_acc -ne 0 ] && down_acc=1; [ $up_acc -ne 0 ] && up_acc=1 + _sessionid=; _dial_account= + + [ $lasterr -eq 0 ] && return 0 || return 1 } # 中止信号处理 sigterm() { _log "trap sigterm, exit" $(( 1 | 4 )) - [ $down_acc -eq 2 ] && xlnetacc_recover 1 - [ $up_acc -eq 2 ] && xlnetacc_recover 2 + xlnetacc_logout rm -f "$down_state_file" "$up_state_file" exit 0 } @@ -418,41 +580,29 @@ xlnetacc_init() { up_acc=$(uci_get_by_bool "general" "up_acc" 0) readonly logging=$(uci_get_by_bool "general" "logging" 1) readonly verbose=$(uci_get_by_bool "general" "verbose" 0) - readonly network=$(uci_get_by_name "general" "network" "wan") - readonly account=$(uci_get_by_name "general" "account") - readonly encrypt=$(uci_get_by_name "general" "encrypt") + network=$(uci_get_by_name "general" "network" "wan") + readonly username=$(uci_get_by_name "general" "account") + readonly password=$(uci_get_by_name "general" "password") local enabled=$(uci_get_by_bool "general" "enabled" 0) - local password=$(uci_get_by_name "general" "password") - ( [ $enabled -eq 0 ] || [ $down_acc -eq 0 -a $up_acc -eq 0 ] || [ -z "$account" -o -z "$encrypt" -o -z "$network" ] ) && return 2 + ([ $enabled -eq 0 ] || [ $down_acc -eq 0 -a $up_acc -eq 0 ] || [ -z "$username" -o -z "$password" -o -z "$network" ]) && return 2 [ $logging -eq 1 ] && [ ! -d /var/log ] && mkdir -p /var/log - _log "------------------------------" + [ -f "$LOGFILE" ] && _log "------------------------------" _log "迅雷快鸟正在启动..." - _log "down_acc is $down_acc" $(( 1 | 4 )) - _log "up_acc is $up_acc" $(( 1 | 4 )) - _log "network is $network" $(( 1 | 4 )) - _log "account is $account" $(( 1 | 4 )) - _log "encrypt is $encrypt" $(( 1 | 4 )) # 检查外部调用工具 - command -v wget-ssl >/dev/null || { _log "GNU Wget 工具不存在"; return 3; } - command -v md5sum >/dev/null || { _log "md5sum 工具不存在"; return 3; } - command -v openssl >/dev/null || { _log "openssl 工具不存在"; return 3; } - - # 检查明文密码 - if [ -n "$password" ]; then - _log "移除已保存的明文密码" - uci delete "${NAME}.general.password" - uci commit "$NAME" - fi + command -v wget-ssl >/dev/null || { _log "GNU Wget 未安装"; return 3; } + local opensslchk=$(echo -n 'openssl' | openssl dgst -sha1 | awk '{print $2}') + [ "$opensslchk" != 'c898fa1e7226427010e329971e82c669f8d8abb4' ] && { _log "openssl-util 未安装或计算错误"; return 3; } # 捕获中止信号 - trap "sigterm" INT - trap "sigterm" TERM + trap 'sigterm' INT # Ctrl-C + trap 'sigterm' QUIT # Ctrl-\ + trap 'sigterm' TERM # kill - # 生成设备签名 + # 生成设备标识 gen_device_sign - [ -z "$_peerid" -o -z "$_devicesign" ] && return 4 + [ ${#_peerid} -ne 16 -o ${#_devicesign} -ne 71 ] && return 4 clean_log [ -d /var/state ] || mkdir -p /var/state @@ -463,50 +613,58 @@ xlnetacc_init() { xlnetacc_main() { while : ; do # 获取外网IP地址 - while : ; do - local bind_ip=$(get_acc_ip) - if [ -z "$bind_ip" ]; then - sleep 5s # 获取失败 - else - gen_http_cmd "$bind_ip" - break - fi - done + xlnetacc_retry 'get_bind_ip' + gen_http_cmd - # 帐号登录 + # 注销快鸟帐号 + xlnetacc_logout 3 && sleep 3s + + # 登录快鸟帐号 while : ; do - xlnetacc_login - case $? in + lasterr= + swjsq_login + case $lasterr in 0) break;; # 登录成功 - 6) sleep 30m;; # 需要输入验证码,等待30分钟后重试 - -1) sleep 3m;; # 未返回有效数据,等待3分钟后重试 + -1) sleep 5s;; # 服务器未响应 + -2) return 7;; # Wget 参数解析错误 + -3) sleep 3s;; # Wget 网络通信失败 + 6) sleep 130m;; # 需要输入验证码 + 8) sleep 3m;; # 服务器系统维护 + 15) sleep 1s;; # 身份信息已失效 *) return 5;; # 登录失败 esac done - # 10秒检查提速状态,300秒发送心跳包 - local timer_begin=$(date +%s); local timer_count= + # 获取用户信息 + xlnetacc_retry 'swjsq_getuserinfo' 1 1 + xlnetacc_retry 'swjsq_getuserinfo' 2 1 + [ $down_acc -eq 0 -a $up_acc -eq 0 ] && break + # 获取提速入口 + xlnetacc_retry 'swjsq_portal' 1 1 + xlnetacc_retry 'swjsq_portal' 2 1 + # 获取带宽信息 + xlnetacc_retry 'isp_bandwidth' 1 1 10 || { sleep 3m; continue; } + xlnetacc_retry 'isp_bandwidth' 2 1 10 || { sleep 3m; continue; } + [ $down_acc -eq 0 -a $up_acc -eq 0 ] && break + # 带宽提速 + xlnetacc_retry 'isp_upgrade' 1 1 10 || { sleep 3m; continue; } + xlnetacc_retry 'isp_upgrade' 2 1 10 || { sleep 3m; continue; } + + # 心跳保持 +# local retry=1 while : ; do - [ $down_acc -eq 0 -a $up_acc -eq 0 ] && break 2 - [ $down_acc -eq 1 ] && xlnetacc_acc 1 - [ $up_acc -eq 1 ] && xlnetacc_acc 2 - - sleep 10s - timer_count=$(( $(date +%s) - $timer_begin )) - [ $timer_count -lt 300 ] && continue - timer_begin=$(date +%s) clean_log # 清理日志 - - [ $down_acc -eq 2 ] && { xlnetacc_keepalive 1; [ $? -eq -1 ] && break; } - [ $up_acc -eq 2 ] && { xlnetacc_keepalive 2; [ $? -eq -1 ] && break; } + sleep 10m +# [ $retry -ge 144 ] && break || let retry++ # 心跳最多保持24小时,144=24*60/10 + xlnetacc_retry 'isp_keepalive' 1 2 5 || break + xlnetacc_retry 'isp_keepalive' 2 2 5 || break done - [ $down_acc -eq 2 ] && { xlnetacc_recover 1; down_acc=1; } - [ $up_acc -eq 2 ] && { xlnetacc_recover 2; up_acc=1; } done - _log "程序异常,迅雷快鸟已停止。" + xlnetacc_logout + _log "无法提速,迅雷快鸟已停止。" + return 6 } # 程序入口 -xlnetacc_init $* -[ $? -eq 0 ] && xlnetacc_main +xlnetacc_init "$@" && xlnetacc_main exit $?