mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-02-24 08:04:11 +08:00
* Switch to using Typescript instead of Babel * Switch all es6 / jsx file extensions to ts / tsx * Convert Utils to a TS module from module.exports style module * Move everything from module.exports to typescript exports * Define .d.ts files for mailspring-exports and component kit… Yes it seems this is the best option :( * Load up on those @types * Synthesize TS types from PropTypes for standard components * Add types to Model classes and move constructor constants to instance vars * 9800 => 7700 TS errors * 7700 => 5600 TS errors * 5600 => 5330 TS errors * 5330 => 4866 TS errors * 4866 => 4426 TS errors * 4426 => 2411 TS errors * 2411 > 1598 TS errors * 1598 > 769 TS errors * 769 > 129 TS errors * 129 > 22 TS errors * Fix runtime errors * More runtime error fixes * Remove support for custom .es6 file extension * Remove a few odd remaining references to Nylas * Don’t ship Typescript support in the compiled app for now * Fix issues in compiled app - module resolution in TS is case sensitive? * README updates * Fix a few more TS errors * Make “No Signature” option clickable + selectable * Remove flicker when saving file and reloading keymaps * Fix mail rule item height in preferences * Fix missing spacing in thread sharing popover * Fix scrollbar ticks being nested incorrectly * Add Japanese as a manually reviewed language * Prevent the thread list from “sticking” * Re-use Sheet when switching root tabs, prevent sidebar from resetting * Ensure specs run * Update package configuration to avoid shpping types * Turn eslint back on - we will opt-in to the TS rules one by one
96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
import React from 'react';
|
|
import {
|
|
localized,
|
|
// The ComponentRegistry manages all React components in N1.
|
|
ComponentRegistry,
|
|
// A `Store` is a Flux component which contains all business logic and data
|
|
// models to be consumed by React components to render markup.
|
|
MessageStore,
|
|
Message,
|
|
} from 'mailspring-exports';
|
|
|
|
const tld = require('tld');
|
|
|
|
// Notice that this file is `main.tsx` rather than `main.ts`. We use the
|
|
// `.tsx` filetype because we use the TSX DSL to describe markup for React to
|
|
// render. Without the TSX, we could just name this file `main.ts` instead.
|
|
class PhishingIndicator extends React.Component<{}, { message: Message }> {
|
|
// Adding a displayName to a React component helps for debugging.
|
|
static displayName = 'PhishingIndicator';
|
|
|
|
_unlisten?: () => void;
|
|
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
message: MessageStore.items()[0],
|
|
};
|
|
}
|
|
componentDidMount() {
|
|
this._unlisten = MessageStore.listen(this._onMessagesChanged);
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
if (this._unlisten) {
|
|
this._unlisten();
|
|
}
|
|
}
|
|
|
|
_onMessagesChanged = () => {
|
|
this.setState({
|
|
message: MessageStore.items()[0],
|
|
});
|
|
};
|
|
|
|
// A React component's `render` method returns a virtual DOM element described
|
|
// in JSX. `render` is deterministic: with the same input, it will always
|
|
// render the same output. Here, the input is provided by this.isPhishingAttempt.
|
|
// `this.state` and `this.props` are popular inputs as well.
|
|
render() {
|
|
const { message } = this.state;
|
|
if (!message) {
|
|
return <span />;
|
|
}
|
|
|
|
const { replyTo, from } = message;
|
|
if (!replyTo || !replyTo.length || !from || !from.length) {
|
|
return <span />;
|
|
}
|
|
|
|
// This package's strategy to ascertain whether or not the email is a
|
|
// phishing attempt boils down to checking the `replyTo` attributes on
|
|
// `Message` models from `MessageStore`.
|
|
const fromEmail = from[0].email.toLowerCase();
|
|
const replyToEmail = replyTo[0].email.toLowerCase();
|
|
if (!fromEmail || !replyToEmail) {
|
|
return <span />;
|
|
}
|
|
|
|
const fromDomain = tld.registered(fromEmail.split('@')[1] || '');
|
|
const replyToDomain = tld.registered(replyToEmail.split('@')[1] || '');
|
|
if (replyToDomain !== fromDomain) {
|
|
return (
|
|
<div className="phishingIndicator">
|
|
<b>{localized(`This message looks suspicious!`)}</b>
|
|
<div className="description">
|
|
{localized(`It originates from %@ but replies will go to %@.`, fromEmail, replyToEmail)}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return <span />;
|
|
}
|
|
}
|
|
|
|
export function activate() {
|
|
ComponentRegistry.register(PhishingIndicator, {
|
|
role: 'MessageListHeaders',
|
|
});
|
|
}
|
|
|
|
export function serialize() {}
|
|
|
|
export function deactivate() {
|
|
ComponentRegistry.unregister(PhishingIndicator);
|
|
}
|