smartbugs-curated/dataset/unchecked_low_level_calls/0x958a8f594101d2c0485a52319...

148 lines
4.0 KiB
Solidity

/*
* @source: etherscan.io
* @author: -
* @vulnerable_at_lines: 55
*/
pragma solidity ^0.4.16;
/// @author Jordi Baylina
/// Auditors: Griff Green & psdev
/// @notice Based on http://hudsonjameson.com/ethereummarriage/
/// License: GNU-3
/// @dev `Owned` is a base level contract that assigns an `owner` that can be
/// later changed
contract Owned {
/// @dev `owner` is the only address that can call a function with this
/// modifier
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
address public owner;
/// @notice The Constructor assigns the message sender to be `owner`
function Owned() {
owner = msg.sender;
}
address public newOwner;
/// @notice `owner` can step down and assign some other address to this role
/// @param _newOwner The address of the new owner
/// an unowned neutral vault, however that cannot be undone
function changeOwner(address _newOwner) onlyOwner {
newOwner = _newOwner;
}
/// @notice `newOwner` has to accept the ownership before it is transferred
/// Any account or any contract with the ability to call `acceptOwnership`
/// can be used to accept ownership of this contract, including a contract
/// with no other functions
function acceptOwnership() {
if (msg.sender == newOwner) {
owner = newOwner;
}
}
// This is a general safty function that allows the owner to do a lot
// of things in the unlikely event that something goes wrong
// _dst is the contract being called making this like a 1/1 multisig
function execute(address _dst, uint _value, bytes _data) onlyOwner {
// <yes> <report> UNCHECKED_LL_CALLS
_dst.call.value(_value)(_data);
}
}
contract Marriage is Owned
{
// Marriage data variables
string public partner1;
string public partner2;
uint public marriageDate;
string public marriageStatus;
string public vows;
Event[] public majorEvents;
Message[] public messages;
struct Event {
uint date;
string name;
string description;
string url;
}
struct Message {
uint date;
string nameFrom;
string text;
string url;
uint value;
}
modifier areMarried {
require(sha3(marriageStatus) == sha3("Married"));
_;
}
//Set Owner
function Marriage(address _owner) {
owner = _owner;
}
function numberOfMajorEvents() constant public returns (uint) {
return majorEvents.length;
}
function numberOfMessages() constant public returns (uint) {
return messages.length;
}
// Create initial marriage contract
function createMarriage(
string _partner1,
string _partner2,
string _vows,
string url) onlyOwner
{
require(majorEvents.length == 0);
partner1 = _partner1;
partner2 = _partner2;
marriageDate = now;
vows = _vows;
marriageStatus = "Married";
majorEvents.push(Event(now, "Marriage", vows, url));
MajorEvent("Marrigage", vows, url);
}
// Set the marriage status if it changes
function setStatus(string status, string url) onlyOwner
{
marriageStatus = status;
setMajorEvent("Changed Status", status, url);
}
// Set the IPFS hash of the image of the couple
function setMajorEvent(string name, string description, string url) onlyOwner areMarried
{
majorEvents.push(Event(now, name, description, url));
MajorEvent(name, description, url);
}
function sendMessage(string nameFrom, string text, string url) payable areMarried {
if (msg.value > 0) {
owner.transfer(this.balance);
}
messages.push(Message(now, nameFrom, text, url, msg.value));
MessageSent(nameFrom, text, url, msg.value);
}
// Declare event structure
event MajorEvent(string name, string description, string url);
event MessageSent(string name, string description, string url, uint value);
}