package de.tum.in.tumcampusapp.cards; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Notification; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.Build; import android.preference.PreferenceManager; import android.support.v4.app.NotificationCompat; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import com.google.common.base.Joiner; import java.util.ArrayList; import java.util.List; import de.tum.in.tumcampusapp.R; import de.tum.in.tumcampusapp.activities.SetupEduroamActivity; import de.tum.in.tumcampusapp.cards.generic.NotificationAwareCard; import de.tum.in.tumcampusapp.managers.CardManager; import de.tum.in.tumcampusapp.managers.EduroamManager; import static de.tum.in.tumcampusapp.managers.EduroamManager.RADIUS_DNS; public class EduroamFixCard extends NotificationAwareCard { private List<String> errors; private TextView errorsTv; private WifiConfiguration eduroam; public EduroamFixCard(Context context) { super(CardManager.CARD_EDUROAM_FIX, context, "card_eduroam_fix_start", false, true); errors = new ArrayList<>(); } public static CardViewHolder inflateViewHolder(ViewGroup parent) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_eduroam_fix, parent, false); return new CardViewHolder(view); } @Override public void updateViewHolder(RecyclerView.ViewHolder viewHolder) { super.updateViewHolder(viewHolder); mCard = viewHolder.itemView; mLinearLayout = (LinearLayout) mCard.findViewById(R.id.card_view); errorsTv = (TextView) mCard.findViewById(R.id.eduroam_errors); errorsTv.setText(Joiner.on("\n").join(errors)); } @Override protected boolean shouldShow(SharedPreferences prefs) { return !isConfigValid(); } @Override protected void discard(SharedPreferences.Editor editor) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); prefs.edit().putBoolean("card_eduroam_fix_start", false).apply(); } @Override protected Notification fillNotification(NotificationCompat.Builder notificationBuilder) { return null; } @Override public String getTitle() { return mContext.getString(R.string.eduroam_fix); } @Override public Intent getIntent() { if (eduroam != null) { WifiManager wifi = (WifiManager) mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE); wifi.removeNetwork(eduroam.networkId); } return new Intent(mContext, SetupEduroamActivity.class); } @Override public int getId() { return 0; } private boolean isConfigValid() { errors.clear(); eduroam = EduroamManager.getEduroamConfig(mContext); //If it is not configured then the config valid if (eduroam == null) { return true; } //Otherwise check attributes - Android 23+: check newer match for the radius server if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && (!eduroam.enterpriseConfig.getAltSubjectMatch().equals("DNS:" + RADIUS_DNS) || !eduroam.enterpriseConfig.getDomainSuffixMatch().equals(RADIUS_DNS)) && !isValidSubjectMatchAPI18(eduroam)) { errors.add(mContext.getString(R.string.wifi_dns_name_not_set)); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && !isValidSubjectMatchAPI18(eduroam)) { errors.add(mContext.getString(R.string.wifi_dns_name_not_set)); } //Check that the full quantifier and correct identity is used if (!eduroam.enterpriseConfig.getIdentity().contains("@eduroam.mwn.de") && !eduroam.enterpriseConfig.getIdentity().contains("@mytum.de") && !eduroam.enterpriseConfig.getIdentity().contains("@tum.de")) { errors.add(mContext.getString(R.string.wifi_identity_zone)); } if (!eduroam.enterpriseConfig.getAnonymousIdentity().equals("anonymous@mwn.de") && !eduroam.enterpriseConfig.getAnonymousIdentity().equals("anonymous@eduroam.mwn.de") && !eduroam.enterpriseConfig.getAnonymousIdentity().equals("anonymous@mytum.de")) { errors.add(mContext.getString(R.string.wifi_anonymous_identity_not_set)); } //Check certificate //TODO /*if (eduroam.enterpriseConfig.getCaCertificate() == null) { errors.add("No CA certificate set"); } else { Utils.log(eduroam.enterpriseConfig.getCaCertificate().toString()); }*/ } return errors.size() == 0; } @SuppressWarnings("deprecation") @SuppressLint("NewApi") @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) private boolean isValidSubjectMatchAPI18(WifiConfiguration eduroam) { return eduroam.enterpriseConfig.getSubjectMatch().equals(RADIUS_DNS); } }