package fuzion24.device.vulnerability.test.adapter;
import android.content.Context;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.nowsecure.android.vts.R;
import org.json.JSONArray;
import org.json.JSONObject;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import fuzion24.device.vulnerability.test.VulnerabilityDescriptor;
import fuzion24.device.vulnerability.test.VulnerabilityTestResult;
import fuzion24.device.vulnerability.test.adapter.viewholder.RecyclerItemViewHolder;
import fuzion24.device.vulnerability.vulnerabilities.helper.BinaryAssets;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = "RecycleAdapter";
private List<Pair<VulnerabilityTestResult, VulnerabilityDescriptor>> mResults;
private Context mContext;
private static final SimpleDateFormat mSDF = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
public RecyclerAdapter(Context context, List<VulnerabilityTestResult> itemList) {
this.mContext = context;
this.mResults = buildResultDescriptionMap(context, itemList);
}
private static List<Pair<VulnerabilityTestResult, VulnerabilityDescriptor>> buildResultDescriptionMap(Context context, List<VulnerabilityTestResult> itemList){
List<Pair<VulnerabilityTestResult, VulnerabilityDescriptor>> res = new ArrayList<>();
try {
Map<String, VulnerabilityDescriptor> vMap = VulnerabilityDescriptor.getParsedVulnMap(context);
for (VulnerabilityTestResult vtr : itemList) {
String cveOrId = vtr.getCVEorID();
VulnerabilityDescriptor vd = vMap.get(cveOrId);
if(vd == null){
Log.d(TAG, cveOrId + " has a null vulnerability descriptor");
}
res.add(Pair.create(vtr, vd));
}
Collections.sort(res, new Comparator<Pair<VulnerabilityTestResult, VulnerabilityDescriptor>>() {
private final static int leftFirst = -1;
private final static int rightFirst = 1;
private final static int areEqual = 0;
@Override
public int compare(Pair<VulnerabilityTestResult, VulnerabilityDescriptor> lhs, Pair<VulnerabilityTestResult, VulnerabilityDescriptor> rhs) {
VulnerabilityDescriptor lhDesc = lhs.second;
VulnerabilityDescriptor rhDesc = rhs.second;
boolean rIsNewer = lhDesc.getCVEDate().before(rhDesc.getCVEDate());
boolean sameDate = lhDesc.getCVEDate().equals(rhDesc.getCVEDate());
boolean lVuln = lhs.first.getException() == null && lhs.first.isVulnerable();
boolean rVuln = rhs.first.getException() == null && rhs.first.isVulnerable();
if(lVuln && !rVuln){
return leftFirst;
}else if(!lVuln && rVuln){
return rightFirst;
}else if(sameDate) {
return areEqual;
} else {
return rIsNewer ? rightFirst : leftFirst;
}
}
});
}catch(Exception e){
e.printStackTrace();
}
return res;
}
public void updateResults(List<VulnerabilityTestResult> itemList){
mResults = buildResultDescriptionMap(mContext, itemList);
notifyDataSetChanged();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
View view = LayoutInflater.from(context).inflate(R.layout.vulnerability_layout, parent, false);
return RecyclerItemViewHolder.newInstance(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
RecyclerItemViewHolder holder = (RecyclerItemViewHolder) viewHolder;
Pair<VulnerabilityTestResult, VulnerabilityDescriptor> item = mResults.get(position);
VulnerabilityTestResult vulnRes = item.first;
VulnerabilityDescriptor vulnDesc = item.second;
holder.setItemTestName(vulnRes.getCVEorID());
if (vulnRes.getException() != null) {
holder.setItemTestResult(mContext.getString(R.string.error_test, vulnRes.getException().getMessage()));
holder.setItemTestResultColor(mContext.getResources().getColor(R.color.orange));
} else {
if (vulnRes.getResult()) {
holder.setItemTestResultColor(mContext.getResources().getColor(R.color.red));
holder.setItemTestResult(mContext.getString(R.string.test_result_failure));
} else {
holder.setItemTestResultColor(mContext.getResources().getColor(R.color.green));
holder.setItemTestResult(mContext.getString(R.string.test_result_success));
}
}
holder.setItemTestResultDescription(vulnDesc.getDescription());
holder.setButtonShowDetailsClickListner(mContext,
vulnRes.getCVEorID(),
vulnDesc.getAltNames(),
vulnDesc.getDescription(),
vulnDesc.getImpact(),
vulnDesc.getExternalLinks(),
vulnDesc.getPatches(),
vulnDesc.getCVSSV2Score(),
mSDF.format(vulnDesc.getCVEDate()));
}
@Override
public int getItemCount() {
return mResults == null ? 0 : mResults.size();
}
}