-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
14 changed files
with
491 additions
and
103 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
186 changes: 186 additions & 0 deletions
186
app/src/main/java/com/idormy/sms/forwarder/fragment/client/ContactAddFragment.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,186 @@ | ||
package com.idormy.sms.forwarder.fragment.client | ||
|
||
import android.annotation.SuppressLint | ||
import android.util.Log | ||
import android.view.LayoutInflater | ||
import android.view.View | ||
import android.view.ViewGroup | ||
import com.google.gson.Gson | ||
import com.google.gson.reflect.TypeToken | ||
import com.idormy.sms.forwarder.R | ||
import com.idormy.sms.forwarder.core.BaseFragment | ||
import com.idormy.sms.forwarder.databinding.FragmentClientContactAddBinding | ||
import com.idormy.sms.forwarder.server.model.BaseResponse | ||
import com.idormy.sms.forwarder.utils.* | ||
import com.jeremyliao.liveeventbus.LiveEventBus | ||
import com.xuexiang.xaop.annotation.SingleClick | ||
import com.xuexiang.xhttp2.XHttp | ||
import com.xuexiang.xhttp2.cache.model.CacheMode | ||
import com.xuexiang.xhttp2.callback.SimpleCallBack | ||
import com.xuexiang.xhttp2.exception.ApiException | ||
import com.xuexiang.xpage.annotation.Page | ||
import com.xuexiang.xrouter.utils.TextUtils | ||
import com.xuexiang.xui.utils.CountDownButtonHelper | ||
import com.xuexiang.xui.utils.ResUtils | ||
import com.xuexiang.xui.widget.actionbar.TitleBar | ||
import com.xuexiang.xutil.data.ConvertTools | ||
|
||
@Suppress("PropertyName") | ||
@Page(name = "远程加话簿") | ||
class ContactAddFragment : BaseFragment<FragmentClientContactAddBinding?>(), View.OnClickListener { | ||
|
||
val TAG: String = ContactAddFragment::class.java.simpleName | ||
private var mCountDownHelper: CountDownButtonHelper? = null | ||
|
||
override fun viewBindingInflate( | ||
inflater: LayoutInflater, | ||
container: ViewGroup, | ||
): FragmentClientContactAddBinding { | ||
return FragmentClientContactAddBinding.inflate(inflater, container, false) | ||
} | ||
|
||
override fun initTitle(): TitleBar? { | ||
return super.initTitle()!!.setImmersive(false).setTitle(R.string.api_contact_add) | ||
} | ||
|
||
/** | ||
* 初始化控件 | ||
*/ | ||
@SuppressLint("SetTextI18n") | ||
override fun initViews() { | ||
//发送按钮增加倒计时,避免重复点击 | ||
mCountDownHelper = CountDownButtonHelper(binding!!.btnSubmit, SettingUtils.requestTimeout) | ||
mCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener { | ||
override fun onCountDown(time: Int) { | ||
binding!!.btnSubmit.text = String.format(getString(R.string.seconds_n), time) | ||
} | ||
|
||
override fun onFinished() { | ||
binding!!.btnSubmit.text = getString(R.string.submit) | ||
} | ||
}) | ||
} | ||
|
||
override fun initListeners() { | ||
binding!!.btnSubmit.setOnClickListener(this) | ||
LiveEventBus.get(EVENT_KEY_PHONE_NUMBERS, String::class.java).observeSticky(this) { value: String -> | ||
binding!!.etPhoneNumbers.setText(value) | ||
} | ||
} | ||
|
||
@SingleClick | ||
override fun onClick(v: View) { | ||
when (v.id) { | ||
R.id.btn_submit -> { | ||
val requestUrl: String = HttpServerUtils.serverAddress + "/contact/add" | ||
Log.i(TAG, "requestUrl:$requestUrl") | ||
|
||
val msgMap: MutableMap<String, Any> = mutableMapOf() | ||
val timestamp = System.currentTimeMillis() | ||
msgMap["timestamp"] = timestamp | ||
val clientSignKey = HttpServerUtils.clientSignKey | ||
if (!TextUtils.isEmpty(clientSignKey)) { | ||
msgMap["sign"] = HttpServerUtils.calcSign(timestamp.toString(), clientSignKey) | ||
} | ||
|
||
val phoneNumbers = binding!!.etPhoneNumbers.text.toString() | ||
val phoneRegex = getString(R.string.phone_numbers_regex).toRegex() | ||
if (!phoneRegex.matches(phoneNumbers)) { | ||
XToastUtils.error(ResUtils.getString(R.string.phone_numbers_error)) | ||
return | ||
} | ||
|
||
val name = binding!!.etDisplayName.text.toString() | ||
|
||
val dataMap: MutableMap<String, Any> = mutableMapOf() | ||
dataMap["phone_number"] = phoneNumbers | ||
dataMap["name"] = name | ||
msgMap["data"] = dataMap | ||
|
||
var requestMsg: String = Gson().toJson(msgMap) | ||
Log.i(TAG, "requestMsg:$requestMsg") | ||
|
||
val postRequest = XHttp.post(requestUrl) | ||
.keepJson(true) | ||
.timeOut((SettingUtils.requestTimeout * 1000).toLong()) //超时时间10s | ||
.cacheMode(CacheMode.NO_CACHE) | ||
.timeStamp(true) | ||
|
||
when (HttpServerUtils.clientSafetyMeasures) { | ||
2 -> { | ||
val publicKey = RSACrypt.getPublicKey(HttpServerUtils.clientSignKey) | ||
try { | ||
requestMsg = Base64.encode(requestMsg.toByteArray()) | ||
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey) | ||
Log.i(TAG, "requestMsg: $requestMsg") | ||
} catch (e: Exception) { | ||
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message) | ||
e.printStackTrace() | ||
return | ||
} | ||
postRequest.upString(requestMsg) | ||
} | ||
3 -> { | ||
try { | ||
val sm4Key = ConvertTools.hexStringToByteArray(HttpServerUtils.clientSignKey) | ||
//requestMsg = Base64.encode(requestMsg.toByteArray()) | ||
val encryptCBC = SM4Crypt.encrypt(requestMsg.toByteArray(), sm4Key) | ||
requestMsg = ConvertTools.bytes2HexString(encryptCBC) | ||
Log.i(TAG, "requestMsg: $requestMsg") | ||
} catch (e: Exception) { | ||
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message) | ||
e.printStackTrace() | ||
return | ||
} | ||
postRequest.upString(requestMsg) | ||
} | ||
else -> { | ||
postRequest.upJson(requestMsg) | ||
} | ||
} | ||
|
||
mCountDownHelper?.start() | ||
postRequest.execute(object : SimpleCallBack<String>() { | ||
override fun onError(e: ApiException) { | ||
XToastUtils.error(e.displayMessage) | ||
mCountDownHelper?.finish() | ||
} | ||
|
||
override fun onSuccess(response: String) { | ||
Log.i(TAG, response) | ||
try { | ||
var json = response | ||
if (HttpServerUtils.clientSafetyMeasures == 2) { | ||
val publicKey = RSACrypt.getPublicKey(HttpServerUtils.clientSignKey) | ||
json = RSACrypt.decryptByPublicKey(json, publicKey) | ||
json = String(Base64.decode(json)) | ||
} else if (HttpServerUtils.clientSafetyMeasures == 3) { | ||
val sm4Key = ConvertTools.hexStringToByteArray(HttpServerUtils.clientSignKey) | ||
val encryptCBC = ConvertTools.hexStringToByteArray(json) | ||
val decryptCBC = SM4Crypt.decrypt(encryptCBC, sm4Key) | ||
json = String(decryptCBC) | ||
} | ||
val resp: BaseResponse<String> = Gson().fromJson(json, object : TypeToken<BaseResponse<String>>() {}.type) | ||
if (resp.code == 200) { | ||
XToastUtils.success(ResUtils.getString(R.string.request_succeeded)) | ||
} else { | ||
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg) | ||
} | ||
} catch (e: Exception) { | ||
e.printStackTrace() | ||
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response) | ||
} | ||
mCountDownHelper?.finish() | ||
} | ||
}) | ||
} | ||
else -> {} | ||
} | ||
} | ||
|
||
override fun onDestroyView() { | ||
if (mCountDownHelper != null) mCountDownHelper!!.recycle() | ||
super.onDestroyView() | ||
} | ||
|
||
} |
111 changes: 57 additions & 54 deletions
111
app/src/main/java/com/idormy/sms/forwarder/server/component/LoggerInterceptor.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,55 +1,58 @@ | ||
package com.idormy.sms.forwarder.server.component | ||
|
||
import android.util.Log | ||
import com.idormy.sms.forwarder.R | ||
import com.idormy.sms.forwarder.utils.HttpServerUtils | ||
import com.xuexiang.xui.utils.ResUtils.getString | ||
import com.yanzhenjie.andserver.annotation.Interceptor | ||
import com.yanzhenjie.andserver.error.HttpException | ||
import com.yanzhenjie.andserver.framework.HandlerInterceptor | ||
import com.yanzhenjie.andserver.framework.handler.MethodHandler | ||
import com.yanzhenjie.andserver.framework.handler.RequestHandler | ||
import com.yanzhenjie.andserver.http.HttpMethod | ||
import com.yanzhenjie.andserver.http.HttpRequest | ||
import com.yanzhenjie.andserver.http.HttpResponse | ||
|
||
@Suppress("PrivatePropertyName") | ||
@Interceptor | ||
class LoggerInterceptor : HandlerInterceptor { | ||
|
||
private val TAG: String = "LoggerInterceptor" | ||
|
||
override fun onIntercept( | ||
request: HttpRequest, | ||
respons: HttpResponse, | ||
handler: RequestHandler, | ||
): Boolean { | ||
if (handler is MethodHandler) { | ||
val httpPath = request.path | ||
val method: HttpMethod = request.method | ||
val valueMap = request.parameter | ||
Log.i(TAG, "Path: $httpPath") | ||
Log.i(TAG, "Method: " + method.value()) | ||
Log.i(TAG, "Param: $valueMap") | ||
|
||
//判断是否开启该功能 | ||
if ( | ||
(httpPath.startsWith("/clone") && !HttpServerUtils.enableApiClone) | ||
|| (httpPath.startsWith("/sms/send") && !HttpServerUtils.enableApiSmsSend) | ||
|| (httpPath.startsWith("/sms/query") && !HttpServerUtils.enableApiSmsQuery) | ||
|| (httpPath.startsWith("/call/query") && !HttpServerUtils.enableApiCallQuery) | ||
|| (httpPath.startsWith("/contact/query") && !HttpServerUtils.enableApiContactQuery) | ||
|| (httpPath.startsWith("/battery/query") && !HttpServerUtils.enableApiBatteryQuery) | ||
) { | ||
throw HttpException(500, getString(R.string.disabled_on_the_server)) | ||
} | ||
|
||
/* | ||
//注意:这里读取body会导致 MessageConverter 报错:RequestBody is missing. | ||
val body = request.body?.string() | ||
Log.i(TAG, "Body: $body") | ||
*/ | ||
} | ||
return false | ||
} | ||
package com.idormy.sms.forwarder.server.component | ||
|
||
import android.util.Log | ||
import com.idormy.sms.forwarder.R | ||
import com.idormy.sms.forwarder.utils.HttpServerUtils | ||
import com.xuexiang.xui.utils.ResUtils.getString | ||
import com.yanzhenjie.andserver.annotation.Interceptor | ||
import com.yanzhenjie.andserver.error.HttpException | ||
import com.yanzhenjie.andserver.framework.HandlerInterceptor | ||
import com.yanzhenjie.andserver.framework.handler.MethodHandler | ||
import com.yanzhenjie.andserver.framework.handler.RequestHandler | ||
import com.yanzhenjie.andserver.http.HttpMethod | ||
import com.yanzhenjie.andserver.http.HttpRequest | ||
import com.yanzhenjie.andserver.http.HttpResponse | ||
|
||
@Suppress("PrivatePropertyName") | ||
@Interceptor | ||
class LoggerInterceptor : HandlerInterceptor { | ||
|
||
private val TAG: String = "LoggerInterceptor" | ||
|
||
override fun onIntercept( | ||
request: HttpRequest, | ||
respons: HttpResponse, | ||
handler: RequestHandler, | ||
): Boolean { | ||
if (handler is MethodHandler) { | ||
val httpPath = request.path | ||
val method: HttpMethod = request.method | ||
val valueMap = request.parameter | ||
Log.i(TAG, "Path: $httpPath") | ||
Log.i(TAG, "Method: " + method.value()) | ||
Log.i(TAG, "Param: $valueMap") | ||
|
||
//判断是否开启该功能 | ||
if ( | ||
(httpPath.startsWith("/clone") && !HttpServerUtils.enableApiClone) | ||
|| (httpPath.startsWith("/sms/query") && !HttpServerUtils.enableApiSmsQuery) | ||
|| (httpPath.startsWith("/sms/send") && !HttpServerUtils.enableApiSmsSend) | ||
|| (httpPath.startsWith("/call/query") && !HttpServerUtils.enableApiCallQuery) | ||
|| (httpPath.startsWith("/contact/query") && !HttpServerUtils.enableApiContactQuery) | ||
|| (httpPath.startsWith("/contact/add") && !HttpServerUtils.enableApiContactAdd) | ||
|| (httpPath.startsWith("/wol/send") && !HttpServerUtils.enableApiWol) | ||
|| (httpPath.startsWith("/location/query") && !HttpServerUtils.enableApiLocation) | ||
|| (httpPath.startsWith("/battery/query") && !HttpServerUtils.enableApiBatteryQuery) | ||
) { | ||
throw HttpException(500, getString(R.string.disabled_on_the_server)) | ||
} | ||
|
||
/* | ||
//注意:这里读取body会导致 MessageConverter 报错:RequestBody is missing. | ||
val body = request.body?.string() | ||
Log.i(TAG, "Body: $body") | ||
*/ | ||
} | ||
return false | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.