forked from Ivasoft/mattermost-mobile
Compare commits
10 Commits
release-1.
...
v1.41.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce283324ae | ||
|
|
3e54975684 | ||
|
|
b14dafa57e | ||
|
|
121656038c | ||
|
|
064b1883ce | ||
|
|
1282ff1e8e | ||
|
|
6adbc03faa | ||
|
|
836dc521b4 | ||
|
|
8a3eb36911 | ||
|
|
a7dfc99cf6 |
@@ -455,10 +455,10 @@ workflows:
|
|||||||
build:
|
build:
|
||||||
jobs:
|
jobs:
|
||||||
- test
|
- test
|
||||||
- check-deps:
|
# - check-deps:
|
||||||
context: sast-webhook
|
# context: sast-webhook
|
||||||
requires:
|
# requires:
|
||||||
- test
|
# - test
|
||||||
|
|
||||||
- build-android-release:
|
- build-android-release:
|
||||||
context: mattermost-mobile-android-release
|
context: mattermost-mobile-android-release
|
||||||
|
|||||||
@@ -132,8 +132,8 @@ android {
|
|||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
missingDimensionStrategy "RNNotifications.reactNativeVersion", "reactNative60"
|
missingDimensionStrategy "RNNotifications.reactNativeVersion", "reactNative60"
|
||||||
versionCode 345
|
versionCode 349
|
||||||
versionName "1.40.0"
|
versionName "1.41.1"
|
||||||
multiDexEnabled = true
|
multiDexEnabled = true
|
||||||
testBuildType System.getProperty('testBuildType', 'debug')
|
testBuildType System.getProperty('testBuildType', 'debug')
|
||||||
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
|
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
|
||||||
|
|||||||
@@ -96,20 +96,25 @@ public class RealPathUtil {
|
|||||||
File tmpFile;
|
File tmpFile;
|
||||||
String fileName = null;
|
String fileName = null;
|
||||||
|
|
||||||
|
if (uri == null || uri.isRelative()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
// Try and get the filename from the Uri
|
// Try and get the filename from the Uri
|
||||||
try {
|
try {
|
||||||
Cursor returnCursor =
|
Cursor returnCursor =
|
||||||
context.getContentResolver().query(uri, null, null, null, null);
|
context.getContentResolver().query(uri, null, null, null, null);
|
||||||
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
|
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
|
||||||
returnCursor.moveToFirst();
|
returnCursor.moveToFirst();
|
||||||
fileName = returnCursor.getString(nameIndex);
|
fileName = sanitizeFilename(returnCursor.getString(nameIndex));
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// just continue to get the filename with the last segment of the path
|
// just continue to get the filename with the last segment of the path
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (fileName == null) {
|
if (TextUtils.isEmpty(fileName)) {
|
||||||
fileName = uri.getLastPathSegment().toString().trim();
|
fileName = sanitizeFilename(uri.getLastPathSegment().toString().trim());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -230,4 +235,13 @@ public class RealPathUtil {
|
|||||||
|
|
||||||
fileOrDirectory.delete();
|
fileOrDirectory.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String sanitizeFilename(String filename) {
|
||||||
|
if (filename == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
File f = new File(filename);
|
||||||
|
return f.getName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,4 +18,6 @@
|
|||||||
<string name="timeout_description">How long in milliseconds the mobile app should wait for the server to respond.</string>
|
<string name="timeout_description">How long in milliseconds the mobile app should wait for the server to respond.</string>
|
||||||
<string name="vendor_title">EMM Vendor or Company Name</string>
|
<string name="vendor_title">EMM Vendor or Company Name</string>
|
||||||
<string name="vendor_description">Name of the EMM vendor or company deploying the app. Used in help text when prompting for passcodes so users are aware why the app is being protected.</string>
|
<string name="vendor_description">Name of the EMM vendor or company deploying the app. Used in help text when prompting for passcodes so users are aware why the app is being protected.</string>
|
||||||
|
<string name="inAppSessionAuth_title">In-App Session Auth</string>
|
||||||
|
<string name="inAppSessionAuth_description">Instead of default flow from the mobile browser, enforce SSO with the WebView.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -7,6 +7,12 @@
|
|||||||
android:description="@string/inAppPinCode_description"
|
android:description="@string/inAppPinCode_description"
|
||||||
android:restrictionType="string"
|
android:restrictionType="string"
|
||||||
android:defaultValue="false" />
|
android:defaultValue="false" />
|
||||||
|
<restriction
|
||||||
|
android:key="inAppSessionAuth"
|
||||||
|
android:title="@string/inAppSessionAuth_title"
|
||||||
|
android:description="@string/inAppSessionAuth_description"
|
||||||
|
android:restrictionType="string"
|
||||||
|
android:defaultValue="false" />
|
||||||
<restriction
|
<restriction
|
||||||
android:key="blurApplicationScreen"
|
android:key="blurApplicationScreen"
|
||||||
android:title="@string/blurApplicationScreen_title"
|
android:title="@string/blurApplicationScreen_title"
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ class EMMProvider {
|
|||||||
|
|
||||||
this.allowOtherServers = true;
|
this.allowOtherServers = true;
|
||||||
this.emmServerUrl = null;
|
this.emmServerUrl = null;
|
||||||
|
this.inAppSessionAuth = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
checkIfDeviceIsTrusted = () => {
|
checkIfDeviceIsTrusted = () => {
|
||||||
@@ -106,6 +107,8 @@ class EMMProvider {
|
|||||||
this.jailbreakProtection = managedConfig.jailbreakProtection === 'true';
|
this.jailbreakProtection = managedConfig.jailbreakProtection === 'true';
|
||||||
this.vendor = managedConfig.vendor || 'Mattermost';
|
this.vendor = managedConfig.vendor || 'Mattermost';
|
||||||
|
|
||||||
|
this.inAppSessionAuth = managedConfig.inAppSessionAuth === 'true';
|
||||||
|
|
||||||
const credentials = await getAppCredentials();
|
const credentials = await getAppCredentials();
|
||||||
if (!credentials) {
|
if (!credentials) {
|
||||||
this.emmServerUrl = managedConfig.serverUrl;
|
this.emmServerUrl = managedConfig.serverUrl;
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import {ViewTypes} from 'app/constants';
|
|||||||
import tracker from 'app/utils/time_tracker';
|
import tracker from 'app/utils/time_tracker';
|
||||||
import {scheduleExpiredNotification} from '@actions/views/session';
|
import {scheduleExpiredNotification} from '@actions/views/session';
|
||||||
import {ssoLogin} from '@actions/views/user';
|
import {ssoLogin} from '@actions/views/user';
|
||||||
|
import emmProvider from '@init/emm_provider';
|
||||||
import {DispatchFunc} from '@mm-redux/types/actions';
|
import {DispatchFunc} from '@mm-redux/types/actions';
|
||||||
import {Client4} from '@mm-redux/client';
|
import {Client4} from '@mm-redux/client';
|
||||||
import {getTheme} from '@mm-redux/selectors/entities/preferences';
|
import {getTheme} from '@mm-redux/selectors/entities/preferences';
|
||||||
@@ -112,18 +113,19 @@ function SSO({intl, ssoType}: SSOProps) {
|
|||||||
theme,
|
theme,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (isSSOWithRedirectURLAvailable) {
|
if (!isSSOWithRedirectURLAvailable || emmProvider.inAppSessionAuth === true) {
|
||||||
return (
|
return (
|
||||||
<SSOWithRedirectURL {...props}/>
|
<SSOWithWebView
|
||||||
|
{...props}
|
||||||
|
completeUrlPath={completeUrlPath}
|
||||||
|
serverUrl={serverUrl}
|
||||||
|
ssoType={ssoType}
|
||||||
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SSOWithWebView
|
<SSOWithRedirectURL {...props}/>
|
||||||
{...props}
|
|
||||||
completeUrlPath={completeUrlPath}
|
|
||||||
serverUrl={serverUrl}
|
|
||||||
ssoType={ssoType}
|
|
||||||
/>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
// See LICENSE.txt for license information.
|
// See LICENSE.txt for license information.
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import {intlShape} from 'react-intl';
|
import {intlShape} from 'react-intl';
|
||||||
import {Linking, Text, TouchableOpacity, View} from 'react-native';
|
import {Linking, Platform, Text, TouchableOpacity, View} from 'react-native';
|
||||||
import DeviceInfo from 'react-native-device-info';
|
import DeviceInfo from 'react-native-device-info';
|
||||||
import {SafeAreaView} from 'react-native-safe-area-context';
|
import {SafeAreaView} from 'react-native-safe-area-context';
|
||||||
import urlParse from 'url-parse';
|
import urlParse from 'url-parse';
|
||||||
@@ -57,12 +57,23 @@ function SSOWithRedirectURL({
|
|||||||
});
|
});
|
||||||
const url = parsedUrl.toString();
|
const url = parsedUrl.toString();
|
||||||
|
|
||||||
const onError = () => setError(
|
const onError = (e: Error) => {
|
||||||
intl.formatMessage({
|
let message;
|
||||||
id: 'mobile.oauth.failed_to_open_link',
|
if (e && Platform.OS === 'android' && e?.message?.match(/no activity found to handle intent/i)) {
|
||||||
defaultMessage: 'The link failed to open. Please try again.',
|
message = intl.formatMessage({
|
||||||
}),
|
id: 'mobile.oauth.failed_to_open_link_no_browser',
|
||||||
);
|
defaultMessage: 'The link failed to open. Please verify if a browser is installed in the current space.',
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
message = intl.formatMessage({
|
||||||
|
id: 'mobile.oauth.failed_to_open_link',
|
||||||
|
defaultMessage: 'The link failed to open. Please try again.',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
setError(
|
||||||
|
message,
|
||||||
|
);
|
||||||
|
};
|
||||||
tryOpenURL(url, onError);
|
tryOpenURL(url, onError);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -151,6 +162,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => {
|
|||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
fontWeight: '400',
|
fontWeight: '400',
|
||||||
lineHeight: 23,
|
lineHeight: 23,
|
||||||
|
textAlign: 'center',
|
||||||
},
|
},
|
||||||
infoContainer: {
|
infoContainer: {
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
|
|||||||
@@ -49,6 +49,10 @@ export function alertErrorIfInvalidPermissions(result) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function emptyErrorHandlingFunction(e) { // eslint-disable-line no-empty-function, @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
export function emptyFunction() { // eslint-disable-line no-empty-function
|
export function emptyFunction() { // eslint-disable-line no-empty-function
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import {Files} from '@mm-redux/constants';
|
|||||||
import {getCurrentServerUrl} from '@init/credentials';
|
import {getCurrentServerUrl} from '@init/credentials';
|
||||||
|
|
||||||
import {DeepLinkTypes} from '@constants';
|
import {DeepLinkTypes} from '@constants';
|
||||||
import {emptyFunction} from '@utils/general';
|
import {emptyErrorHandlingFunction, emptyFunction} from '@utils/general';
|
||||||
|
|
||||||
const ytRegex = /(?:http|https):\/\/(?:www\.|m\.)?(?:(?:youtube\.com\/(?:(?:v\/)|(?:(?:watch|embed\/watch)(?:\/|.*v=))|(?:embed\/)|(?:user\/[^/]+\/u\/[0-9]\/)))|(?:youtu\.be\/))([^#&?]*)/;
|
const ytRegex = /(?:http|https):\/\/(?:www\.|m\.)?(?:(?:youtube\.com\/(?:(?:v\/)|(?:(?:watch|embed\/watch)(?:\/|.*v=))|(?:embed\/)|(?:user\/[^/]+\/u\/[0-9]\/)))|(?:youtu\.be\/))([^#&?]*)/;
|
||||||
|
|
||||||
@@ -186,7 +186,7 @@ export async function getURLAndMatch(href, serverURL, siteURL) {
|
|||||||
return {url, match};
|
return {url, match};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function tryOpenURL(url, onError = emptyFunction, onSuccess = emptyFunction) {
|
export function tryOpenURL(url, onError = emptyErrorHandlingFunction, onSuccess = emptyFunction) {
|
||||||
Linking.openURL(url).
|
Linking.openURL(url).
|
||||||
then(onSuccess).
|
then(onSuccess).
|
||||||
catch(onError);
|
catch(onError);
|
||||||
|
|||||||
@@ -366,6 +366,7 @@
|
|||||||
"mobile.notification_settings.save_failed_title": "Connection issue",
|
"mobile.notification_settings.save_failed_title": "Connection issue",
|
||||||
"mobile.oauth.failed_to_login": "Your login attempt failed. Please try again.",
|
"mobile.oauth.failed_to_login": "Your login attempt failed. Please try again.",
|
||||||
"mobile.oauth.failed_to_open_link": "The link failed to open. Please try again.",
|
"mobile.oauth.failed_to_open_link": "The link failed to open. Please try again.",
|
||||||
|
"mobile.oauth.failed_to_open_link_no_browser": "The link failed to open. Please verify if a browser is installed in the current space.",
|
||||||
"mobile.oauth.restart_login": "Restart login",
|
"mobile.oauth.restart_login": "Restart login",
|
||||||
"mobile.oauth.something_wrong": "Something went wrong",
|
"mobile.oauth.something_wrong": "Something went wrong",
|
||||||
"mobile.oauth.something_wrong.okButon": "OK",
|
"mobile.oauth.something_wrong.okButon": "OK",
|
||||||
|
|||||||
@@ -564,6 +564,7 @@
|
|||||||
"password_send.reset": "Restablecer mi contraseña",
|
"password_send.reset": "Restablecer mi contraseña",
|
||||||
"permalink.error.access": "El Enlace permanente pertenece a un mensaje eliminado o a un canal al cual no tienes acceso.",
|
"permalink.error.access": "El Enlace permanente pertenece a un mensaje eliminado o a un canal al cual no tienes acceso.",
|
||||||
"permalink.error.link_not_found": "Enlace no encontrado",
|
"permalink.error.link_not_found": "Enlace no encontrado",
|
||||||
|
"permalink.show_dialog_warn.cancel": "Cancelar",
|
||||||
"post_body.check_for_out_of_channel_groups_mentions.message": "no fueron notificados por esta mención porque no se encuentra en este canal. No pueden ser agregados al canal porque no son miembros de los grupos enlazados. Para agregarlos a este canal, deben ser agregados a alguno de los grupos enlazados.",
|
"post_body.check_for_out_of_channel_groups_mentions.message": "no fueron notificados por esta mención porque no se encuentra en este canal. No pueden ser agregados al canal porque no son miembros de los grupos enlazados. Para agregarlos a este canal, deben ser agregados a alguno de los grupos enlazados.",
|
||||||
"post_body.check_for_out_of_channel_mentions.link.and": " y ",
|
"post_body.check_for_out_of_channel_mentions.link.and": " y ",
|
||||||
"post_body.check_for_out_of_channel_mentions.link.private": "agregarlos a este canal privado",
|
"post_body.check_for_out_of_channel_mentions.link.private": "agregarlos a este canal privado",
|
||||||
|
|||||||
@@ -103,7 +103,7 @@
|
|||||||
"intro_messages.group_message": "This is the start of your direct message history with this teammate. Direct messages and files shared here are not shown to people outside this area.",
|
"intro_messages.group_message": "This is the start of your direct message history with this teammate. Direct messages and files shared here are not shown to people outside this area.",
|
||||||
"intro_messages.noCreator": "이것은 {date}에 생성된 {name} 채널의 시작입니다.",
|
"intro_messages.noCreator": "이것은 {date}에 생성된 {name} 채널의 시작입니다.",
|
||||||
"intro_messages.onlyInvited": " 초대받은 회원만 이 비공개 그룹을 볼 수 있습니다.",
|
"intro_messages.onlyInvited": " 초대받은 회원만 이 비공개 그룹을 볼 수 있습니다.",
|
||||||
"last_users_message.added_to_channel.type": "{actor}님이 **채널에 추가했습니다**.",
|
"last_users_message.added_to_channel.type": "{actor}님을 통해 **채널에 추가되었습니다**.",
|
||||||
"last_users_message.added_to_team.type": "{actor}님이 **팀에 추가했습니다**.",
|
"last_users_message.added_to_team.type": "{actor}님이 **팀에 추가했습니다**.",
|
||||||
"last_users_message.first": "{firstUser} 님과 ",
|
"last_users_message.first": "{firstUser} 님과 ",
|
||||||
"last_users_message.joined_channel.type": "**채널에 들어왔습니다**.",
|
"last_users_message.joined_channel.type": "**채널에 들어왔습니다**.",
|
||||||
|
|||||||
@@ -299,7 +299,7 @@
|
|||||||
"mobile.loading_posts": "Berichten aan het laden...",
|
"mobile.loading_posts": "Berichten aan het laden...",
|
||||||
"mobile.login_options.choose_title": "Kies je loginmethode",
|
"mobile.login_options.choose_title": "Kies je loginmethode",
|
||||||
"mobile.long_post_title": "{channelName} - Bericht",
|
"mobile.long_post_title": "{channelName} - Bericht",
|
||||||
"mobile.mailTo.error.text": "Kan het e-mailprogramme niet openen.",
|
"mobile.mailTo.error.text": "Kan het e-mailprogramma niet openen.",
|
||||||
"mobile.mailTo.error.title": "Fout",
|
"mobile.mailTo.error.title": "Fout",
|
||||||
"mobile.managed.blocked_by": "Geblokkeerd door {vendor}",
|
"mobile.managed.blocked_by": "Geblokkeerd door {vendor}",
|
||||||
"mobile.managed.exit": "Afsluiten",
|
"mobile.managed.exit": "Afsluiten",
|
||||||
|
|||||||
@@ -84,11 +84,11 @@ lane :set_app_version do
|
|||||||
unless version_number.nil? || version_number.empty?
|
unless version_number.nil? || version_number.empty?
|
||||||
package = load_config_json('../package.json')
|
package = load_config_json('../package.json')
|
||||||
package['version'] = version_number
|
package['version'] = version_number
|
||||||
save_config_json('../package.json', package)
|
save_json_as_file('../package.json', package)
|
||||||
|
|
||||||
lock = load_config_json('../package-lock.json')
|
lock = load_config_json('../package-lock.json')
|
||||||
lock['version'] = version_number
|
lock['version'] = version_number
|
||||||
save_config_json('../package-lock.json', lock)
|
save_json_as_file('../package-lock.json', lock)
|
||||||
|
|
||||||
android_set_version_name(
|
android_set_version_name(
|
||||||
gradle_file: './android/app/build.gradle',
|
gradle_file: './android/app/build.gradle',
|
||||||
@@ -166,7 +166,7 @@ lane :configure do
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Save the config.json file
|
# Save the config.json file
|
||||||
save_config_json('../dist/assets/config.json', json)
|
save_json_as_file('../dist/assets/config.json', json)
|
||||||
|
|
||||||
configured = true
|
configured = true
|
||||||
end
|
end
|
||||||
@@ -630,7 +630,7 @@ platform :android do
|
|||||||
json['TelemetryEnabled'] = true
|
json['TelemetryEnabled'] = true
|
||||||
json['TelemetryUrl'] = ENV['TELEMETRY_URL']
|
json['TelemetryUrl'] = ENV['TELEMETRY_URL']
|
||||||
json['TelemetryApiKey'] = ENV['TELEMETRY_API_KEY']
|
json['TelemetryApiKey'] = ENV['TELEMETRY_API_KEY']
|
||||||
save_config_json('../dist/assets/config.json', json)
|
save_json_as_file('../dist/assets/config.json', json)
|
||||||
|
|
||||||
beta_dir = './android/app/src/main/java/com/mattermost/rnbeta/'
|
beta_dir = './android/app/src/main/java/com/mattermost/rnbeta/'
|
||||||
|
|
||||||
@@ -809,7 +809,7 @@ def load_config_json(json_path)
|
|||||||
JSON.parse(config_file)
|
JSON.parse(config_file)
|
||||||
end
|
end
|
||||||
|
|
||||||
def save_config_json(json_path, json)
|
def save_json_as_file(json_path, json)
|
||||||
File.open(json_path, 'w') do |f|
|
File.open(json_path, 'w') do |f|
|
||||||
f.write(JSON.pretty_generate(json))
|
f.write(JSON.pretty_generate(json))
|
||||||
f.write("\n")
|
f.write("\n")
|
||||||
@@ -849,9 +849,37 @@ def submit_to_testflight(ipa_path)
|
|||||||
|
|
||||||
if !ipa.nil?
|
if !ipa.nil?
|
||||||
UI.success("ipa file #{ipa}")
|
UI.success("ipa file #{ipa}")
|
||||||
pilot(
|
unless ENV['IOS_API_KEY_ID'].nil? || ENV['IOS_API_KEY_ID'].empty? ||
|
||||||
ipa: ipa
|
ENV['IOS_API_ISSUER_ID'].nil? || ENV['IOS_API_ISSUER_ID'].empty? ||
|
||||||
)
|
ENV['IOS_API_KEY'].nil? || ENV['IOS_API_KEY'].empty?
|
||||||
|
api_key_path = "#{ENV['IOS_API_KEY_ID']}.p8"
|
||||||
|
File.open("../#{api_key_path}", 'w') do |f|
|
||||||
|
key_string = ENV['IOS_API_KEY']
|
||||||
|
p8_array = key_string.split('\n')
|
||||||
|
p8_array.each_with_index do |value, index|
|
||||||
|
f.write(value)
|
||||||
|
f.write("\n") unless index == p8_array.length - 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
api_key = app_store_connect_api_key(
|
||||||
|
key_id: ENV['IOS_API_KEY_ID'],
|
||||||
|
issuer_id: ENV['IOS_API_ISSUER_ID'],
|
||||||
|
key_filepath: "./#{api_key_path}",
|
||||||
|
in_house: ENV['IOS_IN_HOUSE'] == 'true', # optional but may be required if using match/sigh
|
||||||
|
)
|
||||||
|
|
||||||
|
File.delete("../#{api_key_path}")
|
||||||
|
pilot(
|
||||||
|
ipa: ipa,
|
||||||
|
api_key: api_key
|
||||||
|
)
|
||||||
|
else
|
||||||
|
UI.success("Uploading with Username / Password")
|
||||||
|
pilot(
|
||||||
|
ipa: ipa
|
||||||
|
)
|
||||||
|
end
|
||||||
else
|
else
|
||||||
UI.user_error! "ipa file does not exist #{ipa}"
|
UI.user_error! "ipa file does not exist #{ipa}"
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -6,21 +6,21 @@ GEM
|
|||||||
public_suffix (>= 2.0.2, < 5.0)
|
public_suffix (>= 2.0.2, < 5.0)
|
||||||
artifactory (3.0.15)
|
artifactory (3.0.15)
|
||||||
atomos (0.1.3)
|
atomos (0.1.3)
|
||||||
aws-eventstream (1.1.0)
|
aws-eventstream (1.1.1)
|
||||||
aws-partitions (1.429.0)
|
aws-partitions (1.441.0)
|
||||||
aws-sdk-core (3.112.0)
|
aws-sdk-core (3.113.1)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
aws-partitions (~> 1, >= 1.239.0)
|
aws-partitions (~> 1, >= 1.239.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
jmespath (~> 1.0)
|
jmespath (~> 1.0)
|
||||||
aws-sdk-kms (1.42.0)
|
aws-sdk-kms (1.43.0)
|
||||||
aws-sdk-core (~> 3, >= 3.112.0)
|
aws-sdk-core (~> 3, >= 3.112.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sdk-s3 (1.88.1)
|
aws-sdk-s3 (1.93.0)
|
||||||
aws-sdk-core (~> 3, >= 3.112.0)
|
aws-sdk-core (~> 3, >= 3.112.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sigv4 (1.2.2)
|
aws-sigv4 (1.2.3)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
babosa (1.0.4)
|
babosa (1.0.4)
|
||||||
claide (1.0.3)
|
claide (1.0.3)
|
||||||
@@ -47,8 +47,8 @@ GEM
|
|||||||
faraday-net_http (1.0.1)
|
faraday-net_http (1.0.1)
|
||||||
faraday_middleware (1.0.0)
|
faraday_middleware (1.0.0)
|
||||||
faraday (~> 1.0)
|
faraday (~> 1.0)
|
||||||
fastimage (2.2.2)
|
fastimage (2.2.3)
|
||||||
fastlane (2.176.0)
|
fastlane (2.179.0)
|
||||||
CFPropertyList (>= 2.3, < 4.0.0)
|
CFPropertyList (>= 2.3, < 4.0.0)
|
||||||
addressable (>= 2.3, < 3.0.0)
|
addressable (>= 2.3, < 3.0.0)
|
||||||
artifactory (~> 3.0)
|
artifactory (~> 3.0)
|
||||||
@@ -100,7 +100,7 @@ GEM
|
|||||||
representable (~> 3.0)
|
representable (~> 3.0)
|
||||||
retriable (>= 2.0, < 4.0)
|
retriable (>= 2.0, < 4.0)
|
||||||
signet (~> 0.12)
|
signet (~> 0.12)
|
||||||
google-apis-core (0.2.1)
|
google-apis-core (0.3.0)
|
||||||
addressable (~> 2.5, >= 2.5.1)
|
addressable (~> 2.5, >= 2.5.1)
|
||||||
googleauth (~> 0.14)
|
googleauth (~> 0.14)
|
||||||
httpclient (>= 2.8.1, < 3.0)
|
httpclient (>= 2.8.1, < 3.0)
|
||||||
@@ -110,17 +110,17 @@ GEM
|
|||||||
rexml
|
rexml
|
||||||
signet (~> 0.14)
|
signet (~> 0.14)
|
||||||
webrick
|
webrick
|
||||||
google-apis-iamcredentials_v1 (0.1.0)
|
google-apis-iamcredentials_v1 (0.3.0)
|
||||||
google-apis-core (~> 0.1)
|
google-apis-core (~> 0.1)
|
||||||
google-apis-storage_v1 (0.2.0)
|
google-apis-storage_v1 (0.3.0)
|
||||||
google-apis-core (~> 0.1)
|
google-apis-core (~> 0.1)
|
||||||
google-cloud-core (1.5.0)
|
google-cloud-core (1.6.0)
|
||||||
google-cloud-env (~> 1.0)
|
google-cloud-env (~> 1.0)
|
||||||
google-cloud-errors (~> 1.0)
|
google-cloud-errors (~> 1.0)
|
||||||
google-cloud-env (1.4.0)
|
google-cloud-env (1.5.0)
|
||||||
faraday (>= 0.17.3, < 2.0)
|
faraday (>= 0.17.3, < 2.0)
|
||||||
google-cloud-errors (1.0.1)
|
google-cloud-errors (1.1.0)
|
||||||
google-cloud-storage (1.30.0)
|
google-cloud-storage (1.31.0)
|
||||||
addressable (~> 2.5)
|
addressable (~> 2.5)
|
||||||
digest-crc (~> 0.4)
|
digest-crc (~> 0.4)
|
||||||
google-apis-iamcredentials_v1 (~> 0.1)
|
google-apis-iamcredentials_v1 (~> 0.1)
|
||||||
@@ -128,7 +128,7 @@ GEM
|
|||||||
google-cloud-core (~> 1.2)
|
google-cloud-core (~> 1.2)
|
||||||
googleauth (~> 0.9)
|
googleauth (~> 0.9)
|
||||||
mini_mime (~> 1.0)
|
mini_mime (~> 1.0)
|
||||||
googleauth (0.15.1)
|
googleauth (0.16.1)
|
||||||
faraday (>= 0.17.3, < 2.0)
|
faraday (>= 0.17.3, < 2.0)
|
||||||
jwt (>= 1.4, < 3.0)
|
jwt (>= 1.4, < 3.0)
|
||||||
memoist (~> 0.16)
|
memoist (~> 0.16)
|
||||||
@@ -144,13 +144,13 @@ GEM
|
|||||||
jwt (2.2.2)
|
jwt (2.2.2)
|
||||||
memoist (0.16.2)
|
memoist (0.16.2)
|
||||||
mini_magick (4.11.0)
|
mini_magick (4.11.0)
|
||||||
mini_mime (1.0.2)
|
mini_mime (1.1.0)
|
||||||
mini_portile2 (2.5.0)
|
mini_portile2 (2.5.0)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multipart-post (2.0.0)
|
multipart-post (2.0.0)
|
||||||
nanaimo (0.3.0)
|
nanaimo (0.3.0)
|
||||||
naturally (2.2.1)
|
naturally (2.2.1)
|
||||||
nokogiri (1.11.1)
|
nokogiri (1.11.2)
|
||||||
mini_portile2 (~> 2.5.0)
|
mini_portile2 (~> 2.5.0)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
os (1.1.1)
|
os (1.1.1)
|
||||||
@@ -163,12 +163,12 @@ GEM
|
|||||||
declarative-option (< 0.2.0)
|
declarative-option (< 0.2.0)
|
||||||
uber (< 0.2.0)
|
uber (< 0.2.0)
|
||||||
retriable (3.1.2)
|
retriable (3.1.2)
|
||||||
rexml (3.2.4)
|
rexml (3.2.5)
|
||||||
rouge (2.0.7)
|
rouge (2.0.7)
|
||||||
ruby2_keywords (0.0.4)
|
ruby2_keywords (0.0.4)
|
||||||
rubyzip (2.3.0)
|
rubyzip (2.3.0)
|
||||||
security (0.1.3)
|
security (0.1.3)
|
||||||
signet (0.14.1)
|
signet (0.15.0)
|
||||||
addressable (~> 2.3)
|
addressable (~> 2.3)
|
||||||
faraday (>= 0.17.3, < 2.0)
|
faraday (>= 0.17.3, < 2.0)
|
||||||
jwt (>= 1.5, < 3.0)
|
jwt (>= 1.5, < 3.0)
|
||||||
|
|||||||
@@ -911,7 +911,7 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
CURRENT_PROJECT_VERSION = 345;
|
CURRENT_PROJECT_VERSION = 349;
|
||||||
DEAD_CODE_STRIPPING = NO;
|
DEAD_CODE_STRIPPING = NO;
|
||||||
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
|
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -953,7 +953,7 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
CURRENT_PROJECT_VERSION = 345;
|
CURRENT_PROJECT_VERSION = 349;
|
||||||
DEAD_CODE_STRIPPING = NO;
|
DEAD_CODE_STRIPPING = NO;
|
||||||
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
|
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>1.40.0</string>
|
<string>1.41.1</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleURLTypes</key>
|
<key>CFBundleURLTypes</key>
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>345</string>
|
<string>349</string>
|
||||||
<key>ITSAppUsesNonExemptEncryption</key>
|
<key>ITSAppUsesNonExemptEncryption</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
|
|||||||
@@ -19,9 +19,9 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>XPC!</string>
|
<string>XPC!</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>1.40.0</string>
|
<string>1.41.1</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>345</string>
|
<string>349</string>
|
||||||
<key>NSAppTransportSecurity</key>
|
<key>NSAppTransportSecurity</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSAllowsArbitraryLoads</key>
|
<key>NSAllowsArbitraryLoads</key>
|
||||||
|
|||||||
@@ -19,9 +19,9 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>XPC!</string>
|
<string>XPC!</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>1.40.0</string>
|
<string>1.41.1</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>345</string>
|
<string>349</string>
|
||||||
<key>NSExtension</key>
|
<key>NSExtension</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSExtensionPointIdentifier</key>
|
<key>NSExtensionPointIdentifier</key>
|
||||||
|
|||||||
2
package-lock.json
generated
2
package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mattermost-mobile",
|
"name": "mattermost-mobile",
|
||||||
"version": "1.40.0",
|
"version": "1.41.1",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mattermost-mobile",
|
"name": "mattermost-mobile",
|
||||||
"version": "1.40.0",
|
"version": "1.41.1",
|
||||||
"description": "Mattermost Mobile with React Native",
|
"description": "Mattermost Mobile with React Native",
|
||||||
"repository": "git@github.com:mattermost/mattermost-mobile.git",
|
"repository": "git@github.com:mattermost/mattermost-mobile.git",
|
||||||
"author": "Mattermost, Inc.",
|
"author": "Mattermost, Inc.",
|
||||||
|
|||||||
Reference in New Issue
Block a user