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(); } }