/* * Copyright (C) 2015 Steven Luo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jackpal.androidterm; import jackpal.androidterm.util.ShortcutEncryption; import java.security.GeneralSecurityException; import android.content.Intent; import android.util.Log; public final class RunShortcut extends RemoteInterface { public static final String ACTION_RUN_SHORTCUT = "jackpal.androidterm.RUN_SHORTCUT"; public static final String EXTRA_WINDOW_HANDLE = "jackpal.androidterm.window_handle"; public static final String EXTRA_SHORTCUT_COMMAND = "jackpal.androidterm.iShortcutCommand"; @Override protected void handleIntent() { TermService service = getTermService(); if (service == null) { finish(); return; } Intent myIntent = getIntent(); String action = myIntent.getAction(); if (action.equals(ACTION_RUN_SHORTCUT)) { String encCommand = myIntent.getStringExtra(EXTRA_SHORTCUT_COMMAND); if (encCommand == null) { Log.e(TermDebug.LOG_TAG, "No command provided in shortcut!"); finish(); return; } // Decrypt and verify the command ShortcutEncryption.Keys keys = ShortcutEncryption.getKeys(this); if (keys == null) { // No keys -- no valid shortcuts can exist Log.e(TermDebug.LOG_TAG, "No shortcut encryption keys found!"); finish(); return; } String command; try { command = ShortcutEncryption.decrypt(encCommand, keys); } catch (GeneralSecurityException e) { Log.e(TermDebug.LOG_TAG, "Invalid shortcut: " + e.toString()); finish(); return; } String handle = myIntent.getStringExtra(EXTRA_WINDOW_HANDLE); if (handle != null) { // Target the request at an existing window if open handle = appendToWindow(handle, command); } else { // Open a new window handle = openNewWindow(command); } Intent result = new Intent(); result.putExtra(EXTRA_WINDOW_HANDLE, handle); setResult(RESULT_OK, result); } finish(); } }